Met MongoDB 3.6 en nieuwer kunt u de $expr
. gebruiken operator in uw find()
vraag. Hiermee kunt u query-expressies maken die velden uit hetzelfde document vergelijken in een $match
podium.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Overweeg voor andere MongoDB-versies een aggregatiepijplijn uit te voeren die gebruikmaakt van de $redact
operator omdat het u in staat stelt om met een enkele pijplijn een functionaliteit op te nemen met $project
om een veld te maken dat de maand van een datumveld vertegenwoordigt en $match
om de documenten te filteren die overeenkomen met de gegeven voorwaarde van de maand september.
In het bovenstaande, $redact
gebruikt $cond
tenary operator als middel om de voorwaardelijke expressie te leveren die de systeemvariabele zal creëren die de redactie uitvoert. De logische uitdrukking in $cond
zal controleren op een gelijkheid van een datumoperatorveld met een gegeven waarde, als dat overeenkomt, dan $redact
zal de documenten retourneren met de $$KEEP
systeemvariabele en negeert anders met $$PRUNE
.
Het uitvoeren van de volgende pijplijn zou u het gewenste resultaat moeten geven:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Dit is vergelijkbaar met een $project
+$match
combo, maar je moet dan alle andere velden selecteren die in de pijplijn gaan:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Met een andere alternatieve, zij het langzame zoekopdracht, met behulp van de find()
methode met $where
als:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })