Không có gì sai với hoạt động của $elemMatch
. Nó hoạt động như mong đợi. Tài liệu cũng cho biết:
Theo nguyên tắc chung bất cứ khi nào bạn chiếu một array
sử dụng $elemMatch
, chỉ một trong số các phần tử sẽ được chiếu tối đa . Nếu không có phần tử nào trong mảng phù hợp, trường sẽ không được chiếu.
Vì vậy, kết quả bạn nhận được là chính xác, chỉ có mục đầu tiên trong mảng phù hợp với điều kiện trong $elemMatch
sẽ được projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Bạn có thể thử thay đổi thứ tự của tài liệu trong mảng trạng thái và có thể nhận được một tài liệu phù hợp khác nếu tài liệu đó xuất hiện trước các tài liệu phù hợp khác trong mảng.
Tham khảo: $ elemMatch
Theo yêu cầu của bạn, nếu bạn muốn tất cả các phần tử mảng phù hợp trong kết quả của mình, bạn cần thực hiện một phép toán tổng hợp.
-
Match
những tài liệu có _id bắt buộc và những tài liệu đó chứa tài liệu phụ trạng thái mà chúng tôi đang tìm kiếm. -
unwind
mảng trạng thái. - Một lần nữa
match
các tài liệu được giải nén riêng lẻ. - Cuối cùng là nhóm
group
các tài liệu phù hợp theo_id
.
Mã:
db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])
sẽ cung cấp cho bạn tất cả các tài liệu con phù hợp trong mảng.