Com o MongoDB 3.6 e mais recente, você pode usar o
$expr
operador em seu find()
inquerir. Isso permite que você crie expressões de consulta que comparam campos do mesmo documento em um $match
etapa. db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Para outras versões do MongoDB, considere executar um pipeline de agregação que usa o
$redact
operador, pois permite incorporar com um único pipeline, uma funcionalidade com $project
para criar um campo que represente o mês de um campo de data e $match
para filtrar os documentos que correspondem à condição do mês de setembro. Acima,
$redact
usa $cond
operador tenário como meio de fornecer a expressão condicional que criará a variável de sistema que faz a redação. A expressão lógica em $cond
verificará a igualdade de um campo de operador de data com um determinado valor, se isso corresponder, $redact
retornará os documentos usando o $$KEEP
variável de sistema e descarta de outra forma usando $$PRUNE
. A execução do pipeline a seguir deve fornecer o resultado desejado:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Isso é semelhante a um
$project
+$match
combo, mas você precisaria selecionar todo o resto dos campos que entram no pipeline:db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Com outra alternativa, embora de consulta lenta, usando o
find()
método com $where
como:db.customer.find({ "$where": "this.bday.getMonth() === 8" })