MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongodb specifica il mese|anno non la data

Con MongoDB 3.6 e versioni successive, puoi utilizzare $expr operatore nel tuo find() interrogazione. Ciò ti consente di creare espressioni di query che confrontano i campi dello stesso documento in una $match fase.

db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })

Per altre versioni di MongoDB, considera l'esecuzione di una pipeline di aggregazione che utilizza il $redact operatore in quanto consente di incorporare con un'unica pipeline una funzionalità con $project per creare un campo che rappresenti il ​​mese di un campo data e $match per filtrare i documenti che corrispondono alla condizione data del mese che è settembre.

In quanto sopra, $redact utilizza $cond operatore tenary come mezzo per fornire l'espressione condizionale che creerà la variabile di sistema che esegue la redazione. L'espressione logica in $cond verificherà l'uguaglianza di un campo dell'operatore di data con un determinato valore, se corrisponde a $redact restituirà i documenti utilizzando il $$KEEP variabile di sistema e scarta altrimenti utilizzando $$PRUNE .

L'esecuzione della seguente pipeline dovrebbe darti il ​​risultato desiderato:

db.customer.aggregate([
    { "$match": { "bday": { "$exists": true } } },
    {
        "$redact": {
            "$cond": [
                { "$eq": [{ "$month": "$bday" }, 9] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

È simile a un $project +$match combo ma dovresti quindi selezionare tutti gli altri campi che entrano nella pipeline:

db.customer.aggregate([
    { "$match": { "bday": { "$exists": true } } },
    {
        "$project": {
            "month": { "$month": "$bday" },
            "bday": 1,
            "field1": 1,
            "field2": 1,
            .....
        }
    },
    { "$match": { "month": 9 } }
])

Con un'altra alternativa, anche se lenta query, utilizzando find() metodo con $where come:

db.customer.find({ "$where": "this.bday.getMonth() === 8" })