es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtro de $filter de MongoDB en la agregación para comprobar múltiples valores de fecha.

Tengo un conjunto de datos como este:

"h_g" : [
        {
            "ip" : "111.111.22.22",
            "za" : 1,
            "zb" : 5,
            "cdate" : ISODate("2021-06-26T07:01:19.937Z"),
            "updatedAt" : [
                ISODate("2021-06-26T07:01:20.643Z"),
                ISODate("2021-06-27T07:01:21.404Z"),
                ISODate("2021-06-27T07:01:22.016Z"),
                ISODate("2021-06-28T07:01:22.625Z"),
                ISODate("2021-06-29T07:01:23.191Z")
            ]
        },
        {
            "ip" : "222.111.11.11",
            "za" : 1,
            "zb" : 3,
            "cdate" : ISODate("2021-06-28T07:01:29.026Z"),
            "updatedAt" : [
                ISODate("2021-06-28T07:01:29.609Z"),
                ISODate("2021-06-289T07:01:30.174Z"),
                ISODate("2021-06-29T07:01:30.696Z")
            ]
        }
]

Ahora quiero filtrar los datos utilizando la función $filter en una agregación. Necesito seleccionar los datos entre dos fechas. Puedo hacerlo en la columna “cdate”, pero no tengo ninguna idea sobre la columna “updatedAt”.

Esta es mi consulta para obtener los datos entre el rango de fechas:

db.getCollection('TableName').aggregate([
  { $project: { 
      h_g: {
        $filter: {
          input: '$h_g',
          as: 'content',
          cond: {
                $and: [
                {$gte: ['$$content.cdate', new Date('2021-06-27T18:30:00.000Z')]},
                {$lte: ['$$content.cdate', new Date('2021-06-29T18:30:00.000Z')]}
              ]
          }
        }
      }
    }
  }
])

Estoy buscando sugerencias para verificar si mi rango de fechas existe en el array “updatedAt” o no.

Cualquier ayuda o interacción es realmente apreciada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para filtrar los datos basados en un rango de fechas en el array updatedAt puedes usar el operador $map para iterar sobre el array y aplicar un $filter para obtener los elementos que se encuentran dentro del rango de fechas especificado. Aquí tienes un ejemplo de cómo podrías actualizar tu consulta para lograr esto:

    db.getCollection('TableName').aggregate([
      { $project: { 
          h_g: {
            $filter: {
              input: '$h_g',
              as: 'content',
              cond: {
                    $and: [
                      {$gte: ['$$content.cdate', new Date('2021-06-27T18:30:00.000Z')]},
                      {$lte: ['$$content.cdate', new Date('2021-06-29T18:30:00.000Z')]}
                    ]
              }
            }
          }
        }
      },
      {
        $project: {
          h_g: {
            $map: {
              input: '$h_g',
              as: 'doc',
              in: {
                $mergeObjects: [
                  '$$doc',
                  {
                    updatedAt: {
                      $filter: {
                        input: '$$doc.updatedAt',
                        as: 'updated',
                        cond: {
                          $and: [
                            {$gte: ['$$updated', new Date('2021-06-27T18:30:00.000Z')]},
                            {$lte: ['$$updated', new Date('2021-06-29T18:30:00.000Z')]}
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    En esta consulta, la primera etapa $project filtra el array principal basado en el campo cdate al igual que antes. La segunda etapa $project utiliza $map para iterar sobre cada documento en el array filtrado y aplica un $filter al campo updatedAt para obtener los elementos que se encuentran dentro del rango de fechas especificado. Finalmente, el operador $mergeObjects combina el documento original con el array filtrado updatedAt.

    ¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta adicional.

Comments are closed.