MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB:sự khác biệt giữa $ elemMatch và $ và để tìm các đối tượng bên trong mảng là gì?

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 một mảng tài liệu nhúng (với các trường ab ).

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"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" } ] }


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Đã nhúng MongoDB khi chạy thử nghiệm tích hợp

  2. lược đồ mongo (nhúng so với tham chiếu)

  3. Phản ứng lạ khi tìm tài liệu trong MongoDB bằng Mongoose trong Node.js

  4. Loại bỏ các bản sao khi sử dụng $ unionWith trong MongoDB

  5. Meteor.js - cách thực hiện tìm kiếm của người dùng trên nhiều bộ sưu tập