MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo:come raggruppare per $week ma restituire invece la data di inizio e la data di fine di ogni settimana?

Sebbene sia fattibile, rende il codice meno leggibile e più complesso.

Riscriverò il $group fase per includere year insieme a weeks e aggiungi il $project fase di formattazione dei dati secondo il requisito.

db.collection.aggregate([
  {
    "$group": {
      "_id": {
        "week": {
          "$week": {"$subtract": ["$at", 25200000]}  // <-- Changes timezone to -07:00
        },
        "year": {
          "$year": {"$subtract": ["$at", 25200000]}  // <-- Changes timezone to -07:00
        },
      },
      // <-- Add keys to be added in group along with its logics
      "averageValue": {
        "$avg": "$readings.level_1"
      }
    },
  },
  {
    "$project": {
      "_id": {
        "startDate": {
          "$dateToString": {
            "date": {
              "$dateFromParts": {
                "isoWeekYear": "$_id.year",
                "isoWeek": "$_id.week"
              }
            },
            "format": "%Y-%m-%d",
          },
        },
        "endDate": {
          "$dateToString": {
            "date": {
              "$add": [
                {
                  "$dateFromParts": {
                    "isoWeekYear": "$_id.year",
                    "isoWeek": "$_id.week"
                  }
                },
                518400000,
              ],
            },
            "format": "%Y-%m-%d",
          },
        },
      },
      // <-- Add remaining keys to be projected
      "averageValue": 1,
    },
  },
])

Fammi sapere se hai bisogno di una spiegazione di ogni fase e operatore utilizzato e perché l'ho usato.

Esecuzione di esempio del parco giochi Mongo