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

consulta mongoDB para recuperar da coleção de matrizes aninhadas


Você precisará de $elemMatch e agregado .
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"
        }
    }
])

Portanto, a consulta fará essas etapas:
  1. $unwind todas as Sessions elementos
  2. $match documentos dentro do período
  3. $group juntar documentos por _id , First_Name , Last_Name
  4. $project documentos para se parecerem com o formato original

Eu omiti alguns campos, mas você pode adicioná-los facilmente em $group e $project degraus. E é claro que você precisará alterar o intervalo de datas.

Estou preocupado com o desempenho desta consulta em uma grande coleção. Talvez seja melhor se você usar a primeira consulta que dei e filtrar as sessões que deseja em seu código.

Editar:

Como @chridam disse, esta consulta funcionará apenas se você alterar Last_Login para ISODate() , o que é recomendado.

Editar 2:

Atualizando a consulta para usar aggregate e corresponda à solicitação de buscar apenas Sessions dentro do intervalo de datas.

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