$expr
umožňuje použití agregačních výrazových operátorů pouze . Tečkový zápis, který používáte, nebude fungovat pro přístup k prvku pole pro pole "values" : [ 1 ]
. Musíte použít $arrayElemAt
a funguje to dobře.
Váš kód find({$expr: {$eq: ["$value1", "$value2"]}})
fungovalo, protože $expr
použil operátor agregačního výrazu $eq
, ne operátor dotazovacího jazyka MongoDB (MQL) $eq . Všimněte si, že oba operátory vypadají podobně, ale použití a syntaxe se liší.
A kód find({$expr: {$eq: ["$value1", "$values.0"]}})
nefungovalo - podle očekávání. V operátoru agregace $values.0
, 0
je interpretován jako název pole, nikoli index pole pole.
Tečkový zápis funguje dobře v $expr
taky. Zde je příklad s ukázkovým dokumentem:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Nyní pomocí $expr
a tečkovaný zápis:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Oba dotazy vracejí dokument - shoda nastane s filtrem pomocí $expr
a tečkovou notaci. To však platí pouze pro vložené (nebo dílčí) dokumenty ne s poli pole.
Vytvořte dokumentaci, Operátoři agregačního potrubí říká:
výrazy :