Con MongoDB 3.6 e versioni successive, puoi utilizzare $expr
operatore nel tuo find()
interrogazione. Ciò ti consente di creare espressioni di query che confrontano i campi dello stesso documento in una $match
fase.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Per altre versioni di MongoDB, considera l'esecuzione di una pipeline di aggregazione che utilizza il $redact
operatore in quanto consente di incorporare con un'unica pipeline una funzionalità con $project
per creare un campo che rappresenti il mese di un campo data e $match
per filtrare i documenti che corrispondono alla condizione data del mese che è settembre.
In quanto sopra, $redact
utilizza $cond
operatore tenary come mezzo per fornire l'espressione condizionale che creerà la variabile di sistema che esegue la redazione. L'espressione logica in $cond
verificherà l'uguaglianza di un campo dell'operatore di data con un determinato valore, se corrisponde a $redact
restituirà i documenti utilizzando il $$KEEP
variabile di sistema e scarta altrimenti utilizzando $$PRUNE
.
L'esecuzione della seguente pipeline dovrebbe darti il risultato desiderato:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
È simile a un $project
+$match
combo ma dovresti quindi selezionare tutti gli altri campi che entrano nella pipeline:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Con un'altra alternativa, anche se lenta query, utilizzando find()
metodo con $where
come:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })