MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

GroupBy Aggregation bao gồm các ngày bị thiếu trong mongo

Có thể phần dưới là những gì bạn muốn.

1) Tạo một bộ sưu tập với bộ đếm, ví dụ ở đây là 1-10 trong 10 ngày

  [
  {
    "date": 0
  },
  {
    "date": 1
  },
  {
    "date": 2
  },
  {
    "date": 3
  },
  {
    "date": 4
  },
  {
    "date": 5
  },
  {
    "date": 6
  },
  {
    "date": 7
  },
  {
    "date": 8
  },
  {
    "date": 9
  }
  ]
  1. Cập nhật bộ sưu tập này và tạo dữ liệu, 10 ngày sử dụng $ add Ở đây chúng tôi bắt đầu từ ngày "2021-08-01T00:00:00 + 00:00" và chúng tôi sẽ kết thúc vào ngày "2021-08-10T00:00:00 +00:00 "

Bản cập nhật này sẽ thực hiện điều đó (q =bộ lọc, u =bản cập nhật, đây là bản cập nhật đường dẫn của nó)

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

Kết quả trong (10 ngày, chênh lệch 1 ngày)

{
  "_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) Bây giờ chúng tôi có bộ sưu tập ngày với 10 ngày, tất cả đều có chênh lệch 1 ngày, chúng tôi sẽ thực hiện tra cứu $ với bộ sưu tập đơn đặt hàng

Thu thập đơn đặt hàng

[
  {
    "_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"
  }
]

Truy vấn (thực hiện theo quy trình, trước tiên lọc các ngày mong muốn, sau đó chỉ tham gia nếu đơn hàng được thực hiện trong cùng một ngày)

{
  "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
}

Kết quả

[
  {
    "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"
      }
    ]
  }
]

Điều này cung cấp cho mỗi ngày (cho mỗi ngày), các đơn đặt hàng đã được thực hiện vào ngày hôm đó.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Viết cố vấn đầu tiên của bạn

  2. Sử dụng bản đồ / thu nhỏ để ánh xạ các thuộc tính trong một bộ sưu tập

  3. MongoDB thả mọi cơ sở dữ liệu

  4. Spring Mongo Populator từng cái một

  5. Bài đăng dịch vụ Node Mongo REST