Đây thực sự là mã $ elemMatch >
toán tử cho mặc dù nó thường bị sử dụng sai. Về cơ bản, nó thực hiện các điều kiện truy vấn trên mỗi phần tử "bên trong" mảng. Tất cả các đối số MongoDB là một hoạt động "và" trừ khi được gọi một cách rõ ràng theo cách khác:
db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2 } } })
Có thể bạn cũng muốn "chiếu" ở đây nếu bạn chỉ mong đợi trường phù hợp chứ không phải toàn bộ tài liệu:
db.collection.find(
{ "arr": { "$elemMatch": { "name": "b", "num": 2 } } },
{ "arr.$": 1 }
)
Cuối cùng để giải thích lý do tại sao lần thử thứ hai của bạn không hoạt động, hãy truy vấn sau:
db.collection.find({
"arr": [
{ "name": "b", "num": 2 }
]
})
Không khớp với bất kỳ điều gì vì không có tài liệu thực tế nào trong đó "arr" chứa một phần tử số ít khớp chính xác với các điều kiện của bạn.
Ví dụ đầu tiên của bạn không thành công ..:
db.collection.find({
$and: [
{ "arr.name": "b" },
{ "arr.num": 2 }
]
});
Bởi vì có một số phần tử mảng thỏa mãn các điều kiện và điều này không chỉ được coi là cả hai điều kiện đều áp dụng cho cùng một phần tử. Đó là những gì $ elemMatch
thêm và khi bạn cần thêm một điều kiện để phù hợp, thì đây là nơi bạn sử dụng nó.