Sua consulta está simplesmente retornando todos os documentos que contêm um
modules
elemento onde name == 'foo'
. Para usar $elemMatch
para filtrar a saída, você precisa usá-la no argumento de projeção do find
call em vez de parte da consulta:db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
Para combinar os dois conceitos, você pode fazer referência ao índice do elemento array correspondente na consulta com
$
:db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
De qualquer forma retorna:
{
"_id": ObjectId("..."),
"modules": [
{
"name": "foo",
"mandatory": false,
"group": [
{
"name": "g1"
}
]
}
]
}
Se você precisar de outros campos incluídos na saída, adicione-os ao objeto de projeção (por exemplo,
name: 1
).