sql >> Database >  >> NoSQL >> MongoDB

Mongodb-query specifieke maand|jaar niet datum

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


  1. Een overzicht van database-indexering voor MongoDB

  2. In Santander's Near Real-Time Data Ingest Architecture (deel 2)

  3. MongoDB - Object bijwerken of invoegen in array

  4. MongoDB $ne Aggregation Pipeline Operator