sql >> データベース >  >> NoSQL >> MongoDB

Mongoで欠落している日付を含むGroupByAggregation

    たぶん、以下はあなたが望むものです。

    1)カウンターを使用して1つのコレクションを作成します。たとえば、ここでは1〜10を10日間作成します

      [
      {
        "date": 0
      },
      {
        "date": 1
      },
      {
        "date": 2
      },
      {
        "date": 3
      },
      {
        "date": 4
      },
      {
        "date": 5
      },
      {
        "date": 6
      },
      {
        "date": 7
      },
      {
        "date": 8
      },
      {
        "date": 9
      }
      ]
    
    1. このコレクションを更新し、$ addを使用してデータを作成します。ここでは、日付「2021-08-01T00:00:00 + 00:00」から開始し、日付「2021-08-10T00:00:00」で終了します。 +00:00 "

    この更新はそれを行います(q =フィルター、u =更新、ここではパイプライン更新)

    {
      "update": "dates",
      "updates": [
        {
          "q": {},
          "u": [
            {
              "$addFields": {
                "date": {
                  "$add": [
                    "2021-08-01T00:00:00Z",
                    {
                      "$multiply": [
                        "$date",
                        24,
                        60,
                        60000
                      ]
                    }
                  ]
                }
              }
            }
          ],
          "multi": true
        }
      ]
    }
    

    結果は(10日、1日差)

    {
      "_id": {
        "$oid": "610c4bf99ccb15d9c9d67b55"
      },
      "date": {
        "$date": "2021-08-01T00:00:00Z"
      }
    },{
      "_id": {
        "$oid": "610c4bf99ccb15d9c9d67b56"
      },
      "date": {
        "$date": "2021-08-02T00:00:00Z"
      }
    },{
      "_id": {
        "$oid": "610c4bf99ccb15d9c9d67b57"
      },
      "date": {
        "$date": "2021-08-03T00:00:00Z"
      }
    }
    ...
    

    3)これで10の日付の日付コレクションができました。すべて1日の差があり、注文コレクションで$lookupを作成します

    注文コレクション

    [
      {
        "_id": 1,
        "date": "2021-08-01T00:00:00Z"
      },
      {
        "_id": 2,
        "date": "2021-08-01T00:00:00Z"
      },
      {
        "_id": 3,
        "date": "2021-08-05T00:00:00Z"
      },
      {
        "_id": 4,
        "date": "2021-08-03T00:00:00Z"
      }
    ]
    

    クエリ(パイプラインを取得し、最初に必要な日付をフィルタリングしてから、注文が同じ日に行われた場合にのみ参加します)

    {
      "aggregate": "dates",
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$and": [
                {
                  "$gte": [
                    "$date",
                    {
                      "$dateFromString": {
                        "dateString": "2021-08-01T00:00:00"
                      }
                    }
                  ]
                },
                {
                  "$lte": [
                    "$date",
                    {
                      "$dateFromString": {
                        "dateString": "2021-08-05T00:00:00"
                      }
                    }
                  ]
                }
              ]
            }
          }
        },
        {
          "$lookup": {
            "from": "orders",
            "let": {
              "datesDate": "$date"
            },
            "pipeline": [
              {
                "$match": {
                  "$expr": {
                    "$eq": [
                      {
                        "$dateToString": {
                          "format": "%Y-%m-%d",
                          "date": "$$datesDate"
                        }
                      },
                      {
                        "$dateToString": {
                          "format": "%Y-%m-%d",
                          "date": "$date"
                        }
                      }
                    ]
                  }
                }
              }
            ],
            "as": "found-orders"
          }
        },
        {
          "$project": {
            "_id": 0
          }
        }
      ],
      "cursor": {},
      "maxTimeMS": 1200000
    }
    

    結果

    [
      {
        "date": "2021-08-01T00:00:00Z",
        "found-orders": [
          {
            "_id": 1,
            "date": "2021-08-01T00:00:00Z"
          },
          {
            "_id": 2,
            "date": "2021-08-01T00:00:00Z"
          }
        ]
      },
      {
        "date": "2021-08-02T00:00:00Z",
        "found-orders": []
      },
      {
        "date": "2021-08-03T00:00:00Z",
        "found-orders": [
          {
            "_id": 4,
            "date": "2021-08-03T00:00:00Z"
          }
        ]
      },
      {
        "date": "2021-08-04T00:00:00Z",
        "found-orders": []
      },
      {
        "date": "2021-08-05T00:00:00Z",
        "found-orders": [
          {
            "_id": 3,
            "date": "2021-08-05T00:00:00Z"
          }
        ]
      }
    ]
    

    これにより、各日付(各日)にその日に行われた注文が与えられます.1つの日付で注文が行われなかった場合、配列は空になります.10日しかない場合は、必要に応じて5年の日付収集を行うことができます。




    1. mongodbのコレクションの最大サイズはいくつですか

    2. SpringBootMongodb監査エラー

    3. MeteorjsでMongoデータを暗号化する

    4. MongoDB $ sample