这里看到这个有一条带有createdAt和14Feb的记录和一个带有16Feb的记录,现在查询集合上的聚合,例如我想添加15Feb的文档,因为它在集合中丢失viewCount 和 clickCount 为 0。
因此寻找某种方法在聚合管道中添加丢失的日期记录/文档。
[
{
$group: {
_id: {
$dateToString: { format: "%Y-%m-%d", date: "$createdAt" },
},
viewCount: { $sum: "$viewCount" },
clickCount: { $sum: "$clickCount" },
},
},
{ $sort: { _id: 1 } },
{
$group: {
_id: null,
data: {
$push: {
k: "$_id",
v: { viewCount: "$viewCount", clickCount: "$clickCount" },
},
},
},
},
{
$project: {
_id: 0,
data: { $arrayToObject: "$data" },
},
},
]```
I looking for some operator in mongo or some way to do this
$densify
和 $fill
阶段来填补数据中的空白。作为示例,我已将您的管道更改为不按字符串分组,而是使用 $dateTrunc
来剪切当天之后的日期,因此您可以按天分组,但仍然使用 ISODate
以便之后更容易进行插值。
请注意,此示例管道仅包含管道的第一个阶段,可以作为起点。为了展示如何填写缺失值,我已经停止了:
[
{
$group: {
_id: {
$dateTrunc: {
date: "$createdAt",
unit: "day"
}
},
viewCount: {
$sum: "$viewCount"
},
clickCount: {
$sum: "$clickCount"
}
}
},
{
$sort: {
_id: 1
}
},
{
$densify: {
field: "_id",
range: {
step: 1,
bounds: "full",
unit: "day"
}
}
},
{
$fill: {
output: {
viewCount: {
value: 0
},
clickCount: {
value: 0
}
}
}
}
]
使用这个mongoplayground来测试。