2012-10-16 9 views
5

Abbiamo un insieme di elementi che ha la seguente struttura:MongoDB interrogazione advanced: ricevi elementi di un array corrispondenza a una seconda condizione

elementi:

{ 
id : 123, 
items : [ { color: "blue", "groups" : [3, 5] }, { color: "red", "groups" : [6, 8] } ] 
} 

{ 
id : 124, 
items : [ { color: "blue", "groups" : [1, 2] }, { color: "green", "groups" : [5, 9] } ] 
} 

vogliamo un modo efficiente per ottenere elementi che avere un oggetto con colore blu accessibile ai gruppi 5, 9, 27, 123 o 56. Questo dovrebbe restituire Element con id 123 ma non con l'elemento 124 perché l'articolo deve soddisfare entrambe le condizioni. Vogliamo che la query sia il più efficiente possibile.

Questa query è efficiente, ma non soddisfa il requisito:

{$and : { "items.groups" : { $in : [5, 9, 27, 123, 56] }, "items.color" : "blue" }} 

quanto corrisponderà id = 124 perché ha un elemento che corrisponde a "blu" e un altro uno che corrisponde gruppo 9.

+0

ho trovato '$ elemMatch' specificato [nel mon vai doc] (http://docs.mongodb.org/manual/tutorial/query-documents/). Come principiante, ho trovato utile visualizzare tutti gli esempi da [lì] (http://docs.mongodb.org/manual/tutorial/query-documents/), forse qualcun altro lo farà. –

risposta

7

È necessario utilizzare $elemMatch perché si sta cercando di abbinare più attributi di un singolo elemento di un array:

db.test.find({ items: { $elemMatch: { 
    color: "blue", 
    groups: { $in: [5, 9, 27, 123, 56] } 
}}}); 
Problemi correlati