Вашата заявка просто връща всички документи, които съдържат modules елемент, където name == 'foo' . За да използвате $elemMatch за да филтрирате изхода, трябва да го използвате в аргумента за проекция на find извикване вместо част от заявката:
db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
За да комбинирате и двете концепции, можете да посочите индекса на елемента на масива, съвпадащ в заявката с $ :
db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
Така или иначе връща:
{
"_id": ObjectId("..."),
"modules": [
{
"name": "foo",
"mandatory": false,
"group": [
{
"name": "g1"
}
]
}
]
}
Ако имате нужда от други полета, включени в изхода, добавете ги към обекта за проектиране (напр. name: 1 ).