MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

GroupBy Aggregation termasuk tanggal yang hilang di mongo

Mungkin di bawah ini yang Anda inginkan.

1)Buat satu koleksi dengan penghitung misalnya di sini 1-10 selama 10 hari

  [
  {
    "date": 0
  },
  {
    "date": 1
  },
  {
    "date": 2
  },
  {
    "date": 3
  },
  {
    "date": 4
  },
  {
    "date": 5
  },
  {
    "date": 6
  },
  {
    "date": 7
  },
  {
    "date": 8
  },
  {
    "date": 9
  }
  ]
  1. Perbarui koleksi ini dan buat datanya,10 tanggal menggunakan $addDi sini kita mulai dari tanggal "2021-08-01T00:00:00+00:00" dan kita akan mengakhiri tanggal "2021-08-10T00:00:00 +00:00"

Pembaruan ini akan melakukannya (q=filter,u=pembaruan,ini pembaruan salurannya)

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

Hasil dalam (10 tanggal, perbedaan 1 hari)

{
  "_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)Sekarang kami memiliki koleksi tanggal dengan 10 tanggal, semua dengan perbedaan 1 harikami akan membuat $lookup dengan koleksi pesanan

Koleksi pesanan

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

Kueri (ambil jalurnya, filter pertama tanggal yang diinginkan, lalu gabung hanya jika pesanan dilakukan pada hari yang sama)

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

Hasil

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

Ini memberikan untuk setiap tanggal (untuk setiap hari), pesanan yang dibuat hari itu. Jika satu tanggal tidak ada pesanan yang dibuat, array kosong. Di sini hanya 10 hari, Anda dapat membuat koleksi tanggal 5 tahun berdasarkan kebutuhan Anda.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 5 Manfaat Teratas dari Hosting Bersama MongoDB

  2. Permintaan untuk bidang dalam objek dalam array dengan Mongo?

  3. Cara mengambil detail dari mongo db dan mengirim atau menyimpan objek dalam metode nodejs Fork

  4. Kelompokkan Berdasarkan Kondisi di MongoDB

  5. pembaruan mongodb yang cocok dengan dokumen gagal