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.

MongoDB agrupa los resultados por intervalo de tiempo

Tengo una colección como la siguiente.

{
"campo1":"valor1",
"created_at":"2022-01-01T11:42:01Z"
},
{
"campo1":"valor2",
"created_at":"2022-01-01T11:22:15Z"
}

Necesito agrupar los resultados por intervalos de tiempo de 15 minutos y proyectar los resultados de la siguiente manera a partir de esta colección.

[{
"desde":"2022-01-01T11:15:00Z",
"hasta":"2022-01-01T11:30:00Z",
"conteo":1
},
{
"desde":"2022-01-01T11:30:00Z",
"hasta":"2022-01-01T11:45:00Z",
"conteo":1
}]

Puedo obtener el conteo por intervalo de tiempo de 15 minutos utilizando la siguiente consulta. Pero también quiero proyectar las fechas desde y hasta.

db.collection.aggregate([
  { "$group": {
    "_id": {
      "año": { "$year": "$created_at" },
      "díaDelAño": { "$dayOfYear": "$created_at" },
      "hora": { "$hour": "$created_at" },
      "intervalo": {
        "$subtract": [ 
          { "$minute": "$created_at" },
          { "$mod": [{ "$minute": "$created_at"}, 15] }
        ]
      }
    }},
    "conteo": { "$sum": 1 }
  }}
])
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para proyectar los resultados con fechas de inicio y fin, puedes modificar la consulta anterior para incluir una etapa $project que muestre los campos deseados.

    Aquí tienes un ejemplo de consulta que agrupa los resultados en intervalos de tiempo de 15 minutos y proyecta los resultados con las fechas “from” y “to” junto con el recuento:

    db.collection.aggregate([
      {
        "$group": {
          "_id": {
            "year": { "$year": "$created_at" },
            "dayOfYear": { "$dayOfYear": "$created_at" },
            "hour": { "$hour": "$created_at" },
            "interval": {
              "$subtract": [
                { "$minute": "$created_at" },
                { "$mod": [{ "$minute": "$created_at" }, 15] }
              ]
            }
          },
          "count": { "$sum": 1 }
        }
      },
      {
        "$project": {
          "_id": 0,
          "from": {
            "$dateFromParts": {
              "year": "$_id.year",
              "month": 1,
              "day": "$_id.dayOfYear",
              "hour": "$_id.hour",
              "minute": "$_id.interval"
            }
          },
          "to": {
            "$dateFromParts": {
              "year": "$_id.year",
              "month": 1,
              "day": "$_id.dayOfYear",
              "hour": "$_id.hour",
              "minute": { "$add": ["$_id.interval", 15] }
            }
          },
          "count": 1
        }
      }
    ])
    

    La etapa $project en esta consulta crea los campos “from” y “to” utilizando el operador $dateFromParts para construir una fecha a partir de los componentes de año, día del año, hora y minuto del campo _id. El operador $add se utiliza para sumar 15 minutos al tiempo “from” y obtener el tiempo “to”.

    Esta consulta debería generar resultados en el formato que especificaste:

    [
      {
        "from": "2022-01-01T11:15:00Z",
        "to": "2022-01-01T11:30:00Z",
        "count": 1
      },
      {
        "from": "2022-01-01T11:30:00Z",
        "to": "2022-01-01T11:45:00Z",
        "count": 1
      }
    ]
    

Comments are closed.