MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb fragt einen bestimmten Monat|Jahr ab, nicht ein Datum

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