Tant que vous vous rendez compte que vous correspondez à l'ObjectId et non à quoi que ce soit dans la collection référencée, vous pouvez utiliser le $in
opérateur :
db.collection.find({ "members": { "$in": [ "some id 1", "some id 2" ] } })
Où bien sûr ce sont vos valeurs ObjectId réelles.
Mais si vous voulez vraiment dire un document qui a exactement ce tableau, alors vous transmettez simplement le tableau :
db.collection.find({ "members": [ "some id 1", "some id 2" ] })
Et s'il doit avoir les deux éléments mais pourrait en avoir d'autres, vous devez actuellement utiliser un $and
expression :
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
]})
Mais à partir de la version 2.6 et suivantes, vous pouvez utiliser correctement le $all
opérateur de faire effectivement la même chose :
db.collection.find({ "members": { "$all": [ "some id 1", "some id 2" ] } })
L'autre forme correspond à ces deux éléments uniquement, mais dans n'importe quel ordre. Il existe donc deux approches :
db.collection.find({ "$or": [
{ "members": [ "some id 1", "some id 2" ] },
{ "members": [ "some id 2", "some id 1" ] }
]})
Cela utilise un $or
logique
pour dire que le tableau doit être exact mais peut être arrangé dans les deux sens. Et l'autre approche :
db.collection.find({ "$and": [
{ "members": "some id 1" },
{ "members": "some id 2" }
{ "members": { "$size": 2 } }
]})
Donc, cela utiliserait $size
afin de s'assurer que lorsque le tableau contenait les deux éléments correspondants, il n'en avait que deux éléments. Ce qui est une syntaxe plus agréable que d'utiliser $or
, en particulier pour les grands tableaux.
Et dans les futures versions, comme mentionné, cela devient encore plus propre :
db.collection.find({ "$and": [
{ "members": { "$all": [ "some id 1", "some id 2" ] } },
{ "members": { "$size": 2 } }
]})
Cela couvre à peu près toutes les interprétations