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 ).