Con MongoDB 3.6 y posteriores, puede usar $expr
operador en su find()
consulta. Esto le permite crear expresiones de consulta que comparan campos del mismo documento en un $match
escenario.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Para otras versiones de MongoDB, considere ejecutar una canalización de agregación que use $redact
operador ya que le permite incorporar con una sola canalización, una funcionalidad con $project
para crear un campo que represente el mes de un campo de fecha y $match
para filtrar los documentos que coinciden con la condición dada del mes de septiembre.
En lo anterior, $redact
usa $cond
operador tenario como medio para proporcionar la expresión condicional que creará la variable del sistema que realiza la redacción. La expresión lógica en $cond
verificará la igualdad de un campo de operador de fecha con un valor dado, si eso coincide, entonces $redact
devolverá los documentos usando el $$KEEP
variable del sistema y descarta de lo contrario usando $$PRUNE
.
Ejecutar la siguiente canalización debería darte el resultado deseado:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Esto es similar a un $project
+$match
combo, pero luego deberá seleccionar el resto de los campos que se incluyen en la canalización:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Con otra consulta alternativa, aunque lenta, utilizando find()
método con $where
como:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })