node.js - 如何在 MongoDB 中通过单个查询获取计数和最大日期?

标签 node.js mongodb mongoose aggregation-framework

我有 Post 集合,如下所示:

{ "_id" : ObjectId(..), "date" : ISODate("2014-03-01T08:00:00Z") }
{ "_id" : ObjectId(..), "date" : ISODate("2014-03-01T09:00:00Z") }
{ "_id" : ObjectId(..), "date" : ISODate("2014-03-15T09:00:00Z") }
{ "_id" : ObjectId(..), "date" : ISODate("2014-04-04T11:21:39.736Z") }
{ "_id" : ObjectId(..), "date" : ISODate("2014-04-04T21:23:13.331Z") }

我需要获取帖子的总数和最大日期。因此,上述 coeumtns 的期望结果如下:

{count: 5, date: ISODate("2014-04-04T21:23:13.331Z")}

如何通过对 MongoDB 的单个查询获得所需的结果,而不需要在应用程序代码中进行处理和计数?

编辑:@chridam 感谢您的回复。我已接受您的答案作为最佳答案!还能帮我做一件事吗?

假设帖子尚不存在,因此我需要获取计数为零且当前日期作为时间戳的结果,如下所示:

{count: 0, [Date.now()]}

MongoDB 可以吗?

最佳答案

使用$max$sum运算符为

Model.aggregate([ 
    {
        "$group": {
            "_id": null,
            "count": { "$sum": 1 },
            "date": { "$max": "$date" }
        }
    }
]).exec(function (err, result) {
   console.log(result);
})

编辑:解决有关空集合的进一步问题,聚合函数将返回空游标,因为集合中不会有任何要聚合的文档。因此,您需要在客户端解决此逻辑,即检查上述聚合的结果,如果结果是空数组,则根据需要创建占位符文档:

Model.aggregate([ 
    {
        "$group": {
            "_id": null,
            "count": { "$sum": 1 },
            "date": { "$max": "$date" }
        }
    }
]).exec(function (err, result) {
     console.log(result);
     if (!result.length) {
         result = [{ count:0, date: new Date() }];   
     }
});

关于node.js - 如何在 MongoDB 中通过单个查询获取计数和最大日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37486920/

相关文章:

node.js - Heroku + mongoose 连接错误: no primary server found in set

javascript - 如何将文件上传到s3fs并获取公共(public)url?

javascript - 如何部署 Angular/Node 应用程序

node.js - 如何在 firebase node.js 云函数中推送通知?

mongodb - meteor restivus 端点配置

node.js - findById 返回文档列表而不是单个结果

node.js - 关闭错误的 Mongoose 连接

node.js - Express 覆盖react-router 客户端路由

php - Mongodb/Couchdb 代替 MySQL(从 PHP 切换到 Node)

mongodb - 使用monk在mongodb中只选择两个字段