我有 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 可以吗?
最佳答案
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/