Truy vấn của bạn chỉ đơn giản là trả về tất cả tài liệu có chứa modules
phần tử trong đó name == 'foo'
. Để sử dụng $elemMatch
để lọc đầu ra, bạn cần sử dụng nó trong đối số chiếu của find
gọi thay vì một phần của truy vấn:
db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
Để kết hợp cả hai khái niệm, bạn có thể tham chiếu chỉ mục của phần tử mảng được so khớp trong truy vấn với $
:
db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
Dù theo cách nào thì cũng trả về:
{
"_id": ObjectId("..."),
"modules": [
{
"name": "foo",
"mandatory": false,
"group": [
{
"name": "g1"
}
]
}
]
}
Nếu bạn cần các trường khác có trong đầu ra, hãy thêm chúng vào đối tượng chiếu (ví dụ:name: 1
).