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