Ще обясня това с пример. Разгледайте колекцията 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" } ] }