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

Isi tanggal yang hilang dalam catatan

Anda memerlukan beberapa tahapan tambahan untuk mengembalikan nilai default. Pertama-tama Anda harus menggunakan $group dengan _id setel ke null untuk mengumpulkan semua hasil dalam satu dokumen. Kemudian Anda dapat menggunakan $map dengan array hari sebagai input. Di dalam $map . itu Anda dapat menggunakan $indexOfArray untuk menemukan apakah tanggal tersebut ada di kumpulan hasil Anda saat ini. Jika ya (index != -1 ) maka Anda dapat mengembalikan nilai itu, jika tidak, Anda harus mengembalikan subdokumen default dengan views setel ke 0 . Kemudian Anda dapat menggunakan $unwind untuk mendapatkan kembali daftar dokumen dan $replaceRoot untuk mempromosikan stats bersarang ke tingkat atas.

ProductView.aggregate([
    { $match: { productId: '5b8c0f3204a10228b00a1745' } },
    { $project: { day: { $substr: ["$createdAt", 0, 10] } } },
    {
        $group: {
            _id: "$day",
            count: { $sum: 1 },
            time: { $avg: "$createdAt" },
        }
    },
    { $sort: { _id: 1 } },
    {
        $project: {
            date: '$_id',
            views: '$count',
        },
    },
    {
        $group: {
            _id: null,
            stats: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            stats: {
                $map: {
                    input: [ "2018-09-01", "2018-09-02", "2018-09-03", "2018-09-04", "2018-09-05" ],
                    as: "date",
                    in: {
                        $let: {
                            vars: { dateIndex: { "$indexOfArray": [ "$stats._id", "$$date" ] } },
                            in: { 
                                $cond: {
                                    if: { $ne: [ "$$dateIndex", -1 ] },
                                    then: { $arrayElemAt: [ "$stats", "$$dateIndex" ] },
                                    else: { _id: "$$date", date: "$$date", views: 0 }
                                } 
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $unwind: "$stats"
    },
    {
        $replaceRoot: {
            newRoot: "$stats"
        }
    }
]).exec((err, result) => ...)

Anda dapat membuat daftar tanggal statis dalam logika aplikasi Anda menggunakan loop sederhana. Saya percaya itu mungkin juga di MongoDB (menggunakan $range) tetapi mungkin memperumit pipa agregasi ini. Beri tahu saya jika Anda setuju atau ingin mencoba membuat larik tanggal tersebut di MongoDB.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara menetapkan nilai default integer di mongodb?

  2. Buat Indeks Geospasial 2dsphere untuk Kueri Bulat di MongoDB

  3. Cara menggabungkan bidang array dalam dokumen dalam agregasi Mongo

  4. MongoDB sebagai penyimpanan file

  5. Gambar mongo Docker 'Koneksi ditolak' dari wadah lain