Znamená to, že pokud používáte vstupní proměnné v $lookuppipeline, musíte použít $expr
Ano správně, ve výchozím nastavení ve filtrech, tj. v části filtru .find()
nebo v $match
fázi agregace nemůžete použít existující pole v dokumentu.
Pokud vůbec potřebujete použít existující hodnotu pole ve vašem filtru dotazů, musíte použít agregační kanál, takže abyste mohli použít agregační kanál v .find()
nebo v $match
musíte svůj dotaz na filtr zabalit do $expr. Stejný způsob přístupu k místním proměnným byl vytvořen pomocí let
z $lookup
filtrovat v $match
musí být zabalen do $expr
.
Uvažujme níže uvedený příklad:
Ukázkové dokumenty:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Dotaz:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Test: mongohřiště
Pokud vidíte výše uvedený dotaz, zadejte 1
&4
jsou předány do dotazu, ale pokud se podíváte na dotaz níže, pokusíte se najít key
pole ==value
pole - nefunguje to :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Test: mongohřiště
Pokud výše porovnáváte dvě existující pole, nemůžete to udělat, protože to znamená, že kontrolujete dokumenty pomocí key
hodnotu pole jako řetězec "$value"
. Takže říci, že to není řetězec, je to ve skutečnosti odkaz na value
musíte použít $eq agregační operátor namísto $eq operátoru dotazu, jak je uvedeno níže:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Test: mongohřiště