Tôi sẽ giải thích điều này bằng một ví dụ. Xem xét tập hợp arrays
. Nó có một trường tên là arr
là một mảng tài liệu nhúng (với các trường a
và b
).
Một số tài liệu trong arrays
bộ sưu tập:
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Tôi muốn tìm tất cả các tài liệu có các trường tài liệu nhúng mảng a="a1"
VÀ b="b1"
. Lưu ý rằng điều này phải nằm trong cùng một tài liệu nhúng phần tử của mảng. Tôi sử dụng $ elemMatch cho điều này và nhận được kết quả mong muốn.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Bây giờ, nếu tôi sử dụng $ và như trong truy vấn sau, kết quả không đúng. Như bạn có thể thấy, một tài liệu bổ sung được chọn. Truy vấn đã hoạt động với các trường tài liệu nhúng mảng a="a1"
HOẶC b="b1"
.
> db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Vì vậy, bằng cách sử dụng $and
toán tử KHÔNG dành cho mục đích này (tức là truy vấn trên nhiều trường của một mảng tài liệu con).
Ngoài ra, để truy vấn trên một trường tài liệu nhúng mảng ( chỉ một trường ) $elemMatch
không bắt buộc, ví dụ:
> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }