Mit MongoDB 3.6 und höher können Sie den $expr
verwenden Operator in Ihrem find()
Anfrage. Auf diese Weise können Sie Abfrageausdrücke erstellen, die Felder aus demselben Dokument in einem $match
vergleichen Stufe.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Ziehen Sie für andere MongoDB-Versionen in Betracht, eine Aggregationspipeline auszuführen, die $redact
verwendet -Operator, da Sie damit eine Funktionalität mit $project
in eine einzelne Pipeline integrieren können um ein Feld zu erstellen, das den Monat eines Datumsfelds darstellt, und $match
um die Dokumente zu filtern, die der gegebenen Bedingung des Monats September entsprechen.
Oben $redact
verwendet $cond
Tenary-Operator als Mittel zur Bereitstellung des bedingten Ausdrucks, der die Systemvariable erstellt, die die Schwärzung durchführt. Der logische Ausdruck in $cond
prüft auf Gleichheit eines Datumsoperatorfelds mit einem gegebenen Wert, wenn dieser übereinstimmt, dann $redact
gibt die Dokumente mit $$KEEP
zurück Systemvariable und verwirft sie andernfalls mit $$PRUNE
.
Das Ausführen der folgenden Pipeline sollte das gewünschte Ergebnis liefern:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Dies ähnelt einem $project
+$match
Combo, aber Sie müssten dann alle anderen Felder auswählen, die in die Pipeline gehen:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Mit einer anderen Alternative, wenn auch langsamen Abfrage, unter Verwendung von find()
Methode mit $where
als:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })