sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb consulta mes específico | año no fecha

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