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" })