Betyder det, at hvis du bruger inputvariabler i en $lookuppipeline, skal du bruge $expr
Ja korrekt, som standard i filtre, dvs. i filterdelen af .find() eller i $match aggregeringsstadiet kan du ikke bruge et eksisterende felt i dokumentet.
Hvis du overhovedet skal bruge eksisterende felts værdi i dit forespørgselsfilter, så skal du bruge aggregeringspipeline, så for at bruge aggregeringspipeline i .find() eller i $match du skal pakke din filterforespørgsel med $expr. Samme måde at få adgang til lokale variabler blev oprettet ved hjælp af let af $lookup filtrer i $match skal ombrydes af $expr .
Lad os se på nedenstående eksempel:
Eksempel på dokumenter:
[ { "key":1, "value":2 }, { "key":2, "value":4 }, { "key":5, "value":5 }]
Forespørgsel:
db.collection.find({ nøgle:{ $gt:1 }, værdi:{ $gt:4 } }) Eller db.collection.aggregate([ { $match:{ key:{ $gt :1 }, værdi:{ $gt:4 } } ])
Test: mongolegeplads
Hvis du ser ovenstående forespørgsel, skal du både indtaste 1 &4 sendes ind i forespørgslen, men det tjekker du nedenstående forespørgsel, hvor du prøver at matche nøgle felt ==værdi felt - det virker ikke :
db.collection.aggregate([ { $match:{ key:{ $eq:"$value" } } ])
Test: mongolegeplads
Når du sammenligner to eksisterende felter ovenfor, kan du ikke gøre det, da det betyder, at du søger efter dokumenter med nøgle feltværdi som streng "$værdi" . Så for at sige, at det ikke er en streng, er det faktisk en reference til værdi felt skal du bruge $eq aggregeringsoperator i stedet for $eq forespørgselsoperator som nedenfor:
db.collection.aggregate([ { $match:{ $expr:{ $eq:[ "$key", "$value" ] } } ])
Test: mongolegeplads