sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb forespørgsel specifik måned|år ikke dato

Med MongoDB 3.6 og nyere kan du bruge $expr operator i din find() forespørgsel. Dette giver dig mulighed for at bygge forespørgselsudtryk, der sammenligner felter fra det samme dokument i en $match scene.

db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })

For andre MongoDB-versioner kan du overveje at køre en aggregeringspipeline, der bruger $redact operatør, da det giver dig mulighed for at inkorporere med en enkelt pipeline, en funktionalitet med $project for at oprette et felt, der repræsenterer måneden for et datofelt og $match at filtrere de dokumenter, der matcher månedens givne tilstand, nemlig september.

I ovenstående, $redact bruger $cond tenæroperator som et middel til at give det betingede udtryk, der vil skabe den systemvariabel, der udfører redaktionen. Det logiske udtryk i $cond vil kontrollere for en lighed af et datooperatorfelt med en given værdi, hvis det matcher, så $redact returnerer dokumenterne ved hjælp af $$KEEP systemvariabel og kasserer ellers ved at bruge $$PRUNE .

Kørsel af følgende pipeline skulle give dig det ønskede resultat:

db.customer.aggregate([
    { "$match": { "bday": { "$exists": true } } },
    {
        "$redact": {
            "$cond": [
                { "$eq": [{ "$month": "$bday" }, 9] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

Dette ligner et $project +$match combo, men du skal derefter vælge alle de øvrige felter, der går ind i pipelinen:

db.customer.aggregate([
    { "$match": { "bday": { "$exists": true } } },
    {
        "$project": {
            "month": { "$month": "$bday" },
            "bday": 1,
            "field1": 1,
            "field2": 1,
            .....
        }
    },
    { "$match": { "month": 9 } }
])

Med et andet alternativ, omend langsom forespørgsel, ved at bruge find() metode med $where som:

db.customer.find({ "$where": "this.bday.getMonth() === 8" })


  1. Spring RedisTemplate :Serialiser flere modelklasser til JSON. Skal du bruge flere RedisTemplates?

  2. En oversigt over Percona MongoDB Kubernetes-operatøren

  3. Meteor:forskel mellem navne på samlinger, variabler, publikationer og abonnementer?

  4. Inde i Santanders Near Real-Time Data Ingest Architecture