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