MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongo:Wie kann man nach $Woche gruppieren, aber stattdessen Startdatum und Enddatum jeder Woche zurückgeben?

Obwohl es machbar ist, macht es den Code weniger lesbar und komplexer.

Ich werde die $group umschreiben Phase, um year einzuschließen zusammen mit weeks und fügen Sie das $project hinzu Phase, um die Daten gemäß den Anforderungen zu formatieren.

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

Lassen Sie mich wissen, wenn Sie eine Erklärung für jede Stufe und jeden verwendeten Operator benötigen und warum ich sie verwendet habe.

Mongo-Spielplatz-Beispielausführung