我有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可以吗?
答案 0 :(得分:2)
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() }];
}
});