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

consulta mongoDB para recuperar de la colección de matrices anidadas

Necesitará $elemMatch y agregar .

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

Entonces la consulta seguirá esos pasos:

  1. $unwind todas las Sessions elementos
  2. $match documentos dentro del intervalo de fechas
  3. $group juntar documentos por _id , First_Name , Last_Name
  4. $project documentos para que se vean como el formato original

Omití algunos campos, pero puedes agregarlos fácilmente en $group y $project pasos. Y, por supuesto, deberá cambiar el intervalo de fechas.

Me preocupa el rendimiento de esta consulta en una gran colección. Tal vez sea mejor si usa la primera consulta que le di y filtra las sesiones que desea en su código.

Editar:

Como dijo @chridam, esta consulta solo funcionará si cambia Last_Login a ISODate() , lo que se recomienda.

Edición 2:

Actualización de la consulta para usar aggregate y coincida con la solicitud de solo obtener Sessions dentro del intervalo de fechas.

Esta es la versión anterior:

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