sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB:jaký je rozdíl mezi $elemMatch a $a najít objekty uvnitř pole?

Vysvětlím to na příkladu. Zvažte kolekci arrays . Obsahuje pole s názvem arr což je řada vložených dokumentů (s poli a a b ).

Některé dokumenty v arrays kolekce:

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

Chci najít všechny dokumenty s poli embedded-document a="a1" AND b="b1" . Všimněte si, že to musí být v rámci stejného prvku embedded-document pole. Používám $elemMatch za tímto účelem a získejte požadovaný výsledek.

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

Nyní, když použiji $and operátor jako v následujícím dotazu, výsledky nejsou správné. Jak vidíte, je vybrán další dokument. Dotaz fungoval s poli vloženého dokumentu pole a="a1" NEBO 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" } ] }

Takže pomocí $and operátor NENÍ určen pro tento účel (tj. dotazování na více polí pole dílčích dokumentů).

Také k dotazu na pole vloženého dokumentu pole (pouze jedno pole ) $elemMatch není vyžadováno, například:

> 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. Správný způsob, jak rozdělit kolekci a jak interpretovat výsledky

  2. Porovnejte s podřetězcem v agregaci mongodb

  3. $vyhledat více úrovní bez $unwind?

  4. Jaký je ekvivalent shellového příkazu collection.getIndexes() v pymongo?