2015-04-21 18 views
6

Sto interrogando per trovare la corrispondenza esatta dell'array e l'ho recuperata correttamente, ma quando provo a scoprire l'array esatto con valori in ordine diverso, fallisce.MongoDB Trova corrispondenza esatta dell'array ma l'ordine non è importante

Example

db.coll.insert({"user":"harsh","hobbies":["1","2","3"]}) 
db.coll.insert({"user":"kaushik","hobbies":["1","2"]}) 
db.coll.find({"hobbies":["1","2"]}) 

secondo documento recuperato con successo

db.coll.find({"hobbies":["2","1"]}) 

Visualizzazione Niente

Aiutateci

risposta

13

currently accepted answer NON garantisce una corrispondenza esatta sull'array, solo che la dimensione è identica e che la matrice condivide almeno un elemento con l'array di query.

Ad esempio, la query

db.coll.find({ "hobbies": { "$size" : 2, "$in": [ "2", "1", "5", "hamburger" ] } }); 

sarebbe ancora restituire il kaushik utente in quel caso.

Quello che dovete fare per una corrispondenza esatta è quello di combinare $size con $all, in questo modo:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] } }); 

Ma essere consapevoli che questo può essere un'operazione molto costosa, a seconda della quantità e la struttura dei dati . Dato che MongoDB mantiene stabile l'ordine degli array inseriti, si potrebbe fare meglio a garantire che gli array siano ordinati in ordine quando si inseriscono nel DB, in modo da poter fare affidamento su un ordine statico durante l'esecuzione di query.

7

Per corrispondere esattamente al campo dell'array, Mongo fornisce l'operatore $eq che può essere gestito su un array anche come un valore.

db.collection.find({ "hobbies": {$eq: [ "singing", "Music" ] }}); 

Anche $eq controlli l'ordine in cui si specificano gli elementi.

se si utilizza sotto query:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] } }); 

Allora non saranno restituiti la corrispondenza esatta. Supponiamo che la tua ricerca:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "2" ] } }); 

Questa query restituirà tutti i documenti che hanno un elemento 2 ed ha dimensione 2 (ad esempio sarà anche restituire il documento avente hobies :[2,1]).

+0

Hmm hai ragione, non avrei dovuto usare le parole "corrispondenza esatta" per il mio esempio di query. Conosci una soluzione per l'interrogazione di un sottoinsieme di valori esatti (come con '$ eq') ma non verifica l'ordine? – kasoban

Problemi correlati