MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb consulta mês específico | ano não data


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