我已经被这个问题困扰了好几天了。我试图获取给定时间段内没有文档的 count: 0
。这是我目前正在使用的聚合函数:
var getCount = function(timeBlock, start, end, cb) {
Document.aggregate(
{
$match: {
time: {
$gte: new Date(start),
$lt: new Date(end)
}
}
},
{
$project: {
time: 1,
delta: { $subtract: [
new Date(end),
'$time'
]}
}
},
{
$project: {
time: 1,
delta: { $subtract: [
"$delta",
{ $mod: [
"$delta",
timeBlock
]}
]}
}
},
{
$group: {
_id: { $subtract: [
end,
"$delta"
]},
count: { $sum: 1 }
}
},
{
$project: {
time: "$_id",
count: 1,
_id: 0
}
},
{
$sort: {
time: 1
}
}, function(err, results) {
if (err) {
cb(err)
} else {
cb(null, results)
}
})
}
我尝试使用$cond
,但没有运气
最佳答案
小组阶段根据给定的 _id 进行分组来生成文档,并计算上一阶段最终进入该组的文档数量。因此,计数为零将是从属于该组的 0 个输入文档创建文档的结果。以这种方式思考,很明显聚合管道无法为您执行此操作。它不知道所有“缺失”的时间段是什么,也无法凭空发明适当的文档。如果您需要将空时间段的显式计数设为 0,那么重新应用有关缺失时间段的额外知识来完成最后的图片似乎是一个合理的解决方案(而不是“hacky”)。
关于javascript - 聚合函数中跳过计数 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25039406/