MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongo :Comment regrouper par $week mais renvoyer à la place la date de début et la date de fin de chaque semaine ?

Bien que cela soit faisable, cela rend le code moins lisible et plus complexe.

Je vais réécrire le $group étape pour inclure year avec weeks et ajoutez le $project étape pour formater les données selon les besoins.

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,
    },
  },
])

Faites-moi savoir si vous avez besoin d'une explication de chaque étape et opérateur utilisé et pourquoi je l'ai utilisé.

Exécution de l'exemple de Mongo Playground