MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB:каква е разликата между $elemMatch и $and за намиране на обекти в масив?

Ще обясня това с пример. Разгледайте колекцията arrays . Има поле, наречено arr което е масив от вградени документи (с полета a и b ).

Някои документи в arrays колекция:

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

Искам да намеря всички документи с полетата на масива embedded-document a="a1" И b="b1" . Обърнете внимание, че това трябва да е в рамките на същия елемент embedded-document на масива. Използвам $elemMatch за това и да получите желания резултат.

> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }

Сега, ако използвам $and оператор като в следната заявка, резултатите не са правилни. Както можете да видите, избран е допълнителен документ. Заявката работи с полетата за вграден документ в масива a="a1" ИЛИ 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" } ] }

И така, използвайки $and оператор НЕ е предназначен за тази цел (т.е. заявка в множество полета на масив от поддокументи).

Също така, за заявка в поле за вграден документ в масив (само едно поле ) $elemMatch не е задължително, например:

> 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. Как да валидирам членове на поле на масив?

  2. Големи работни потоци от данни с помощта на панди

  3. mongo-go-driver се проваля с времето за изчакване на избора на сървър при използване на MongoDB Atlas

  4. ValueError:<Твърде много стойности за разопаковане>

  5. Как да наложа външни ключове в бази данни NoSql (MongoDB)?