【问题标题】:MongoDB how to get count of records by 30 hours ago, 48 hour ago, and one month ago?MongoDB如何获取30小时前、48小时前和一个月前的记录数?
【发布时间】:2017-04-13 15:52:38
【问题描述】:

我的结构如下:

{
   "_id" : ObjectId("58d8bcf01caf4ebddb842855"),
   "publishDate" : ISODate("2017-03-14T00:00:00.000Z")
},
{
   "_id" : ObjectId("58e87ed516b51f33ded59eb3"),
   "publishDate" : ISODate("2017-04-14T00:00:00.000Z")
},
{
   "_id" : ObjectId("58eb5b01c21fbad780bc74b6"),
   "publishDate" : ISODate("2017-04-09T00:00:00.000Z")
},
{
   "_id" : ObjectId("58eb5b01c21fbad780bc74b9"),
   "publishDate" : ISODate("2017-04-12T00:00:00.000Z")
}

现在我想统计一个月前发布的记录、48 小时前发布的记录和 30 小时前发布的记录。

我目前的尝试是:

db.JobPosting.aggregate([
   {$project:{
      "thirtyDaysAgo":{"publishDate":{$lt:["$publishDate",new Date(ISODate().getTime() - 1000*60*60*24*30)]}}, 
      "fourtyEightHourAgo":{"publishDate":{$lt:["$publishDate",new Date(ISODate().getTime() - 1000*60*60*48)]}}, 
      "thirtyHourAgo":{"publishDate":{$lt:["$publishDate",new Date(ISODate().getTime() - 1000*60*60*30)]}}
  }}, 
  {$group:{
      _id:{thirtyDaysAgo:"$thirtyDaysAgo", fourtyEightHourAgo:"$fourtyEightHourAgo", thirtyHourAgo:"$thirtyHourAgo"}, 
      "count":{$sum:1}
  }}
])

但是结果是错误的:

{ "_id" : { "thirtyDaysAgo" : { "publishDate" : false }, "fourtyEightHourAgo" : { "publishDate" : true }, "thirtyHourAgo" : { "publishDate" : true } }, "count" : 1 }
{ "_id" : { "thirtyDaysAgo" : { "publishDate" : false }, "fourtyEightHourAgo" : { "publishDate" : false }, "thirtyHourAgo" : { "publishDate" : false } }, "count" : 1 }
{ "_id" : { "thirtyDaysAgo" : { "publishDate" : true }, "fourtyEightHourAgo" : { "publishDate" : true }, "thirtyHourAgo" : { "publishDate" : true } }, "count" : 1 }

我想要的是: {moreThanThirtyDayAgo:{count:1}, moreThanFourtyEightHourAgo:{count:2}, moreThanThirtyHourAgo:{count:1}}

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework loopback


    【解决方案1】:

    使用 $cond 条件表达式创建二叉决策树,将评估结果提供给 $sum 累加器。以以下管道为例:

    var dateThirtyHoursAgo = new Date();
    dateThirtyHoursAgo.setHours(dateThirtyHoursAgo.getHours()-30);
    
    var dateFourtyEightHoursAgo = new Date();
    dateFourtyEightHoursAgo.setHours(dateFourtyEightHoursAgo.getHours()-48);
    
    var dateMonthAgo = new Date();
    dateMonthAgo.setMonth(dateMonthAgo.getMonth()-1);
    
    var pipeline = [
        {
            "$group": {
                "_id": null,
                "thirtyHourAgo": {
                    "$sum": {
                        "$cond": [ 
                            { "$gte": [ "$publishDate", dateThirtyHoursAgo ] }, 
                            1, 0 
                        ]
                    }
                },
                "fourtyEightHourAgo": {
                    "$sum": {
                        "$cond": [ 
                            { "$gte": [ "$publishDate", dateFourtyEightHoursAgo ] }, 
                            1, 0 
                        ]
                    }
                },
                "thirtyDaysAgo": {
                    "$sum": {
                        "$cond": [ 
                            { "$gte": [ "$publishDate", dateMonthAgo ] }, 
                            1, 0 
                        ]
                    }
                }
            }
        }
    ];
    
    db.JobPosting.aggregate(pipeline);
    

    【讨论】:

    • 另一个问题,添加两个或三个其他条件,如ALL_OTHER_FIELDS like %IT% OR like %Software% OR like %xyz%ALL_OTHER_FIELDS 是我拥有的所有字段。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多