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.
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:En esta consulta, la primera etapa
$project
filtra el array principal basado en el campocdate
al igual que antes. La segunda etapa$project
utiliza$map
para iterar sobre cada documento en el array filtrado y aplica un$filter
al campoupdatedAt
para obtener los elementos que se encuentran dentro del rango de fechas especificado. Finalmente, el operador$mergeObjects
combina el documento original con el array filtradoupdatedAt
.¡Espero que esto te ayude! Hazme saber si tienes alguna pregunta adicional.