如何在MongoDB中使用单个查询来计算最大date?
我有Post
collections,如下所示:
{ "_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") }
我需要得到总数和最大date。 所以上面的coeumtns所需的结果如下:
{count: 5, date: ISODate("2014-04-04T21:23:13.331Z")}
如何获得所需的结果与单个查询到MongoDB没有处理和计数在应用程序代码?
编辑: @chridam感谢您的答复。 我接受你的答案是最好的! 可以帮助我多一件事?
比方说,post还没有存在,所以我需要获取零计数和当前date的结果作为时间戳,如下所示:
{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); })
编辑 :解决您的进一步的问题与空集合,聚合函数将返回一个空的游标,因为那里不会是集合中的任何文档进行聚合。 所以你需要在客户端上解决这个逻辑,即检查上述聚合的结果,如果结果是一个空数组,则根据需要创build占位符文档:
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() }]; } });