Я объясню это на примере. Рассмотрим коллекцию 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" } ] }
Я хочу найти все документы с полями встроенного документа массива a="a1"
AND b="b1"
. Обратите внимание, что это должно быть в том же элементе встроенного документа массива. Я использую $ elemMatch для этого и получаю желаемый результат.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Теперь, если я использую операторы $ и , как в следующем запросе, результатыне правильно. Как видите, дополнительный документ выбран. Запрос работал с массивом полей встроенного документа 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" } ] }