sql >> データベース >  >> NoSQL >> MongoDB

レコードに不足している日付を入力します

    デフォルト値を返すには、いくつかの追加ステージが必要です。まず、$groupを使用する必要があります _idを使用 nullに設定 すべての結果を1つのドキュメントに収集します。次に、日数の配列を入力として$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. BookSleeveを使用してオープンなRedis接続を維持する

    2. MongodbホットフィックスKB2731284

    3. MongoDB $ range

    4. ClusterControlでのクラスタートポロジの視覚化