Votre requête renvoie simplement tous les documents contenant un modules
élément où name == 'foo'
. Pour utiliser $elemMatch
pour filtrer la sortie, vous devez l'utiliser dans l'argument de projection du find
appeler au lieu d'une partie de la requête :
db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
Pour combiner les deux concepts, vous pouvez référencer l'index de l'élément de tableau correspondant dans la requête avec $
:
db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
Dans les deux cas, cela renvoie :
{
"_id": ObjectId("..."),
"modules": [
{
"name": "foo",
"mandatory": false,
"group": [
{
"name": "g1"
}
]
}
]
}
Si vous avez besoin d'autres champs inclus dans la sortie, ajoutez-les à l'objet de projection (par exemple, name: 1
).