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