javascript - 聚合函数中跳过计数 0

标签 javascript node.js mongodb mongodb-query aggregation-framework

我已经被这个问题困扰了好几天了。我试图获取给定时间段内没有文档的 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/

相关文章:

javascript moment 单独的日期和时间

javascript - 选项卡无法在同一页面上同时使用多个选项卡

c# - ASP.NET MVC 使用 JavaScript 通知重定向

javascript - 哪个更糟?多一个数据库访问权限还是一个过时的值?

json - 导轨 3 : Create a valid JSON Object from an Array of data

javascript - 从ajax页面获取js变量

javascript - 确定 Node.js 应用程序中的请求是否为本地请求

node.js - 为什么无法列出全局安装的 npm 模块?

javascript - 在 Electron 应用程序中接收管道数据流

php - 使用 PHP 删除嵌入的 MongoDB 文档