Din fråga returnerar helt enkelt alla dokument som innehåller en modules
element där name == 'foo'
. För att använda $elemMatch
för att filtrera utgången måste du använda den i projektionsargumentet för find
anrop istället för en del av frågan:
db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
För att kombinera båda begreppen kan du referera till indexet för arrayelementet som matchas i frågan med $
:
db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
Hur som helst returnerar:
{
"_id": ObjectId("..."),
"modules": [
{
"name": "foo",
"mandatory": false,
"group": [
{
"name": "g1"
}
]
}
]
}
Om du behöver andra fält inkluderade i utdata, lägg till dem i projektionsobjektet (t.ex. name: 1
).