sql >> Database >  >> NoSQL >> MongoDB

Vul ontbrekende datums in records in

U hebt enkele extra fasen nodig om de standaardwaarden te retourneren. Allereerst moet je $group . gebruiken met _id ingesteld op null om alle resultaten in één document te verzamelen. Dan kun je $map gebruiken met een array van dagen als invoer. Binnen die $map je kunt $indexOfArray gebruiken om te zien of die datum bestaat in je huidige resultatenset. Zo ja (index != -1 ) dan kunt u die waarde retourneren, anders moet u het standaard subdocument retourneren met views ingesteld op 0 . Dan kun je $unwind gebruiken om een ​​lijst met documenten terug te krijgen en $replaceRoot om geneste stats te promoten naar een topniveau.

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) => ...)

U kunt een statische lijst met datums in uw toepassingslogica genereren met behulp van een eenvoudige lus. Ik geloof dat dat ook mogelijk is in MongoDB (met $range), maar het kan deze aggregatiepijplijn bemoeilijken. Laat het me weten als je dat goed vindt of als je wilt proberen die reeks datums in MongoDB te genereren.



  1. Hoe RedisCacheManager te maken in spring-data 2.0.x

  2. MongoDB $verdelen

  3. Redis zoekt naar env redis url-variabele weet niet waar env-variabele slechte URI (is geen URI?):(URI::InvalidURIError)

  4. Converteer string naar ObjectID in MongoDB