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

query mongoDB per il recupero dalla raccolta di array nidificati

Avrai bisogno di $elemMatch e aggregato .

db.users.aggregate([
    {
        $unwind: "$Sessions"
    },
    {
        $match: {
            "Sessions.Last_Login": {
                $gte: ISODate("2016-06-16T00:00:00.0Z"),
                $lt: ISODate("2016-06-17T00:00:00.0Z")
            }
        }
    },
    {
        $group: {
            _id: {
                _id: "$_id",
                First_Name: "$First_Name",
                Last_Name: "$Last_Name"
            },
            Sessions: {
                $push: "$Sessions"
            }
        }
    },
    {
        $project: {
            _id: "$_id._id",
            First_Name: "$_id.First_Name",
            Last_Name: "$_id.Last_Name",
            Sessions: "$Sessions"
        }
    }
])

Quindi la query eseguirà questi passaggi:

  1. $unwind tutte le Sessions elementi
  2. $match documenti all'interno dell'intervallo di date
  3. $group insieme documenti da _id , First_Name , Last_Name
  4. $project documenti in modo che assomiglino al formato originale

Ho omesso alcuni campi, ma puoi aggiungerli facilmente in $group e $project passi. E ovviamente dovrai cambiare l'intervallo di date.

Sono preoccupato per le prestazioni di questa query in una grande raccolta. Forse è meglio se usi la prima query che ho fornito e filtri le sessioni che desideri nel tuo codice.

Modifica:

Come ha detto @chridam, questa query funzionerà solo se modifichi Last_Login a ISODate() , cosa è consigliato.

Modifica 2:

Aggiornamento della query per utilizzare aggregate e corrisponde alla richiesta di solo recupero Sessions all'interno dell'intervallo di date.

Questa è la vecchia versione:

db.users.filter({
    'Sessions': {
        '$elemMatch': {
            'Last_Login': {
                '$gte': ISODate("2016-06-16T00:00:00.0Z"),
                '$lt': ISODate("2016-06-17T00:00:00.0Z")
            }
        }
    }
})