sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb fråga specifik månad|år inte datum

Med MongoDB 3.6 och senare kan du använda $expr operatorn i din find() fråga. Detta låter dig bygga frågeuttryck som jämför fält från samma dokument i en $match skede.

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

För andra MongoDB-versioner, överväg att köra en aggregeringspipeline som använder $redact operatör eftersom den låter dig integrera med en enda pipeline, en funktionalitet med $project för att skapa ett fält som representerar månaden för ett datumfält och $match för att filtrera de dokument som matchar det givna villkoret för månaden som är september.

I ovanstående, $redact använder $cond tenary operator som ett medel för att tillhandahålla det villkorliga uttrycket som skapar systemvariabeln som gör redaktionen. Det logiska uttrycket i $cond kommer att kontrollera om ett datumoperatorfält är lika med ett givet värde, om det stämmer överens med $redact kommer att returnera dokumenten med $$KEEP systemvariabel och kasserar annars med $$PRUNE .

Att köra följande pipeline bör ge dig det önskade resultatet:

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

Detta liknar ett $project +$match combo men du måste sedan välja alla övriga fält som går in i pipelinen:

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

Med ett annat alternativ, om än långsam fråga, med find() metod med $where som:

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


  1. Varför misslyckas mina MongooseJS ObjectIds i likhetstestet?

  2. 6 viktiga Redis-övervakningsstatistik du behöver titta på

  3. Hur MongoDB skiljer sig från en SQL-databas

  4. spring session redis 'Ingen böna med namnet 'springSessionRepositoryFilter' är definierad'