MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb requête spécifique mois|année pas date

Avec MongoDB 3.6 et plus récent, vous pouvez utiliser le $expr opérateur dans votre find() requête. Cela vous permet de créer des expressions de requête qui comparent les champs du même document dans un $match scène.

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

Pour les autres versions de MongoDB, envisagez d'exécuter un pipeline d'agrégation qui utilise le $redact car il permet d'intégrer avec un seul pipeline, une fonctionnalité avec $project pour créer un champ qui représente le mois d'un champ de date et $match pour filtrer les documents qui correspondent à la condition donnée du mois de septembre.

Dans ce qui précède, $redact utilise $cond opérateur tenaire comme moyen de fournir l'expression conditionnelle qui créera la variable système qui effectue la rédaction. L'expression logique dans $cond vérifiera l'égalité d'un champ d'opérateur de date avec une valeur donnée, si cela correspond alors $redact retournera les documents en utilisant le $$KEEP variable système et supprime sinon en utilisant $$PRUNE .

L'exécution du pipeline suivant devrait vous donner le résultat souhaité :

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

Ceci est similaire à un $project +$match combo, mais vous devrez ensuite sélectionner tous les autres champs qui entrent dans le pipeline :

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

Avec une autre alternative, quoique lente, en utilisant le find() méthode avec $where comme :

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