C'est en fait ce que le $elemMatch
l'opérateur est pour même s'il est souvent mal utilisé. Il exécute essentiellement les conditions de requête sur chaque élément "dans" le tableau. Tous les arguments de MongoDB sont une opération "et" à moins qu'ils ne soient explicitement appelés autrement :
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Vous voudrez probablement aussi "projeter" ici aussi si vous n'attendez que le champ correspondant et non tout le document :
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Enfin pour expliquer pourquoi votre seconde tentative n'a pas fonctionné, cette requête :
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Ne correspond à rien car il n'y a pas de document réel où "arr" contient un élément singulier correspondant exactement à vos conditions.
Votre premier exemple a échoué... :
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Parce qu'il y a plusieurs éléments de tableau qui satisfont aux conditions et cela n'est pas seulement considéré que les deux conditions s'appliquent au même élément. C'est ce que $elemMatch
ajoute, et lorsque vous avez besoin de plus d'une condition, c'est ici que vous l'utilisez.