デフォルト値を返すには、いくつかの追加ステージが必要です。まず、$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でその日付の配列を生成したい場合はお知らせください。