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