Node.js 如何在MongoDB中通过单个查询获取计数和最大日期?
我有如下Node.js 如何在MongoDB中通过单个查询获取计数和最大日期?,node.js,mongodb,mongoose,aggregation-framework,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" : ISOD
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")}
{count: 0, [Date.now()]}
我需要得到总计数和最大日期后。因此,上述系数的预期结果如下:
{ "_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")}
{count: 0, [Date.now()]}
如何通过对MongoDB的单次查询而不在应用程序代码中进行处理和计数来获得所需的结果
编辑:@chridam感谢您的回复。我已经接受了你最好的答案!你能再帮我一件事吗
假设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")}
{count: 0, [Date.now()]}
是否可以使用MongoDB?将and运算符用作
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() }];
}
});
@Erik我已经回答了你的进一步问题,但是为了将来的参考,这里的一般情况是,如果你需要回答进一步的问题,最好创建一个新问题,而不是编辑原始问题,特别是当原始问题的答案被接受时。阅读更多关于@Erik的内容无需担心,总是乐于助人:)只需注意:即使您这样做了
\u id:null
我也会在响应结果中得到该字段。如何从结果中完全排除\u id