【问题标题】:How to get count and max date with single query in MongoDB?如何在 MongoDB 中使用单个查询获取计数和最大日期?
【发布时间】:2016-09-25 23:55:00
【问题描述】:

我有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 可以吗?

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

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

    【讨论】:

    • @Erik 我已经解决了您的进一步问题,但只是为了让您知道以供将来参考,这里的一般情况是如果您需要解决进一步的问题,最好创建一个新问题,而不是编辑原始问题,尤其是当原始问题的答案已被接受时。阅读更多关于meta.stackexchange.com/questions/43478
    • @Erik 不用担心,总是乐于提供帮助 :)
    • 请注意:即使您这样做 _id: null 我也会在响应中得到该字段。如何从结果中完全排除 _id
    • @Erik 关注这个问题的答案How to hide _id from Aggregation?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2015-12-08
    • 2020-07-29
    相关资源
    最近更新 更多