MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Попълнете липсващите дати в записите

Имате нужда от няколко допълнителни етапа, за да върнете стойностите по подразбиране. Преди всичко трябва да използвате $group с _id зададен на null за събиране на всички резултати в един документ. След това можете да използвате $map с масив от дни като вход. Вътре в тази $map можете да използвате $indexOfArray, за да разберете дали тази дата съществува във вашия текущ набор от резултати. Ако да (index != -1 ), тогава можете да върнете тази стойност, в противен случай трябва да върнете поддокумента по подразбиране с views зададен на 0 . След това можете да използвате $unwind, за да върнете списък с документи и $replaceRoot за популяризиране на вложени stats до най-високо ниво.

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

Можете да генерирате статичен списък с дати в логиката на приложението си, като използвате прост цикъл. Вярвам, че това е възможно и в MongoDB (използвайки $range), но може да усложни този конвейер за агрегиране. Кажете ми дали сте добре с това или искате да опитате да генерирате този масив от дати в MongoDB.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Управление на MySQL, MongoDB и PostgreSQL с ChatOps от Slack

  2. mongodb:намиране на най-високата числова стойност на колона

  3. Променете и пуснете отново MongoDB oplog

  4. Има ли функция за етаж в рамката за агрегиране на Mongodb?

  5. Как да създадете индекси, нечувствителни към главни букви в MongoDB