如何在MongoDB中使用单个查询获取计数和最大日期?

时间:2016-05-27 15:12:19

标签: 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") }

我需要获得帖子的总数和最长日期。所以上述系数的期望结果如下:

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

如何在不处理和计算应用程序代码的情况下使用MongoDB单一查询获得所需结果?

编辑: @chridam感谢您的回复。我已经接受了你最好的答案!可以帮助我一件事吗?

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

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

MongoDB可以吗?

1 个答案:

答案 0 :(得分:2)

使用$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() }];   
     }
});