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

cara menampilkan 0 untuk minggu ketika tidak ada catatan yang cocok dengan minggu itu dalam kueri mongodb $week

Sebagai $week dapat mengembalikan nilai antara 0 dan 53 Saya berasumsi Anda mengharapkan 54 dokumen sebagai hasilnya dengan 0 atau nilai bukan nol untuk documentCount . Untuk mencapainya, Anda harus mengumpulkan semua dokumen Anda menjadi satu ($ grup -ing dengan null ) dan kemudian menghasilkan output.

Untuk menghasilkan rentang angka, Anda dapat menggunakan $range operator dan kemudian Anda dapat menghasilkan output menggunakan $map . Untuk mengubah susunan dokumen menjadi beberapa dokumen, Anda dapat menggunakan $ bersantai .

db.collectionName.aggregate([
    //where query
    { "$match": {  $and:[{CreatedOn:{$lte:ISODate("2018-07-14T13:59:08.266+05:30")}},{CreatedOn:{$gte:ISODate("2018-06-10T13:59:08.266+05:30")}}] } },
    //distinct column 
    {
        "$group": {
            _id: {$week: '$CreatedOn'},
            documentCount: {$sum: 1}
        }
    },
    {
        $group: {
            _id: null,
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            docs: {
                $map: {
                    input: { $range: [ {$week:ISODate("2018-06-10T13:59:08.266+05:30")}, {$week:ISODate("2018-07-14T13:59:08.266+05:30")}]},
                    as: "weekNumber",
                    in: {
                        $let: {
                            vars: { index: { $indexOfArray: [ "$docs._id", "$$weekNumber" ] } },
                            in: {
                                $cond: {
                                    if: { $eq: [ "$$index", -1 ] },
                                    then: { _id: "$$weekNumber", documentCount: 0 },
                                    else: { $arrayElemAt: [ "$docs", "$$index" ] }
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$docs"
    },
    {
        $replaceRoot: {
            newRoot: "$docs"
        }
    }
])

Menggunakan $indexOfArray untuk memeriksa apakah larik dokumen saat ini berisi dokumen (-1 sebaliknya) dan $arrayElemAt untuk mendapatkan dokumen yang ada dari docs . Langkah terakhir ($replaceRoot ) hanya untuk menghilangkan satu tingkat sarang (docs ). Keluaran:

{ "_id" : 0, "documentCount" : 0 }
{ "_id" : 1, "documentCount" : 0 }
{ "_id" : 2, "documentCount" : 0 }
...
{ "_id" : 22, "documentCount" : 0 }
{ "_id" : 23, "documentCount" : 2 }
{ "_id" : 24, "documentCount" : 9 }
{ "_id" : 25, "documentCount" : 1 }
{ "_id" : 26, "documentCount" : 1 }
{ "_id" : 27, "documentCount" : 0 }
...
{ "_id" : 52, "documentCount" : 0 }
{ "_id" : 53, "documentCount" : 0 }

Anda dapat dengan mudah menyesuaikan hasil yang dikembalikan dengan memodifikasi input $map panggung. Misalnya Anda dapat melewatkan array const seperti input: [21, 22, 23, 24] juga.

EDIT:Untuk mendapatkan minggu di antara tanggal yang ditentukan, Anda dapat menggunakan $week untuk tanggal mulai dan akhir untuk mendapatkan nomornya.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mencari cara untuk mengembalikan dokumen dari koleksi lain berdasarkan kumpulan dari yang lain, MongoDB

  2. Dapatkan nilai berbeda yang diurutkan dengan MongoTemplate

  3. Permintaan Mongodb bulan tertentu | tahun bukan tanggal

  4. Mengapa middleware nodejs-mongodb memiliki sintaks yang berbeda dari mongo shell?

  5. Kesalahan:queryTxt ETIMEOUT saat menghubungkan ke MongoDb Atlas menggunakan luwak