MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoose ottiene i documenti corrispondenti all'array

Finché ti rendi conto che stai corrispondendo su ObjectId e in realtà non nulla nella raccolta di riferimento, puoi utilizzare $in operatore:

db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })

Dove ovviamente quelli sono i tuoi valori ObjectId effettivi.

Ma se intendi davvero un documento che ha esattamente quell'array, devi semplicemente passare l'array:

db.collection.find({ "members": [ "some id 1", "some id 2" ] })

E se deve avere entrambi gli elementi ma potrebbe averne altri, al momento è necessario utilizzare un $and espressione:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" } 
]})

Ma dalla versione 2.6 in poi puoi usare correttamente $all operatore per fare lo stesso in modo efficace:

db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })

L'altra forma corrisponde solo a questi due elementi, ma in qualsiasi ordine. Quindi ci sono due approcci:

db.collection.find({ "$or": [
    { "members": [ "some id 1", "some id 2" ] },
    { "members": [ "some id 2", "some id 1" ] }
]})

Questo utilizza un $or per dire che l'array deve essere esatto ma può essere organizzato in entrambi i modi. E l'altro approccio:

db.collection.find({ "$and": [ 
    { "members": "some id 1" },
    { "members": "some id 2" }
    { "members": { "$size": 2 } }
]})

Quindi questo userebbe $size per assicurarsi che quando l'array conteneva entrambi gli elementi corrispondenti, anche quello ne avesse solo due elementi. Che è una sintassi migliore rispetto all'utilizzo di $or , soprattutto per array più grandi.

E nelle versioni future, come accennato, questo diventa ancora più pulito:

db.collection.find({ "$and": [ 
    { "members": { "$all": [ "some id 1", "some id 2" ] } },
    { "members": { "$size": 2 } }
]})

Questo copre praticamente ogni interpretazione