【问题标题】:MongoDB calculate count on date groupingMongoDB计算日期分组计数
【发布时间】:2015-12-29 04:22:34
【问题描述】:

我想计算每天的分配计数,通过使用 assigned_on 上的 day 分组我可以获得每天的分配计数,但这些是唯一计数每天。

我还希望将昨天或几天前分配但尚未释放的床包括在内。

例如,我有以下记录

{
    "assigned_on":ISODate("2015-12-01T00:00:00Z"),
    "released_on":ISODate("2015-12-01T14:01:23Z"),
    "bed_id":1
},

{
    "assigned_on":ISODate("2015-12-01T00:00:00Z"),
    "released_on":ISODate("2015-12-04T14:01:23Z"),
    "bed_id":2
},

{
    "assigned_on":ISODate("2015-12-01T00:00:00Z"),
    "released_on":ISODate("2015-12-01T14:01:23Z"),
    "bed_id":3
},

{
    "assigned_on":ISODate("2015-12-02T00:00:00Z"),
    "released_on":ISODate("2015-12-02T14:01:23Z"),
    "bed_id":1
},


{
    "assigned_on":ISODate("2015-12-02T00:00:00Z"),
    "released_on":ISODate("2015-12-02T14:01:23Z"),
    "bed_id":3
},

{
    "assigned_on":ISODate("2015-12-03T00:00:00Z"),
    "released_on":ISODate("2015-12-03T14:01:23Z"),
    "bed_id":1
},


{
    "assigned_on":ISODate("2015-12-03T00:00:00Z"),
    "released_on":ISODate("2015-12-03T14:01:23Z"),
    "bed_id":3
}

当前查询

 db.test.aggregate([
      {
        "$match": {
          "assigned_on": {
            "$gte": ISODate("2015-12-01T00:00:00Z"),
            "$lt": ISODate("2015-12-03T23:59:59Z")
          }
        }
      },
      {
        "$group": {
          "_id": {
            "$dayOfMonth": "$assigned_on"
          },
          "Count": {
            "$sum": 1
          }
        }
      }
    ])

按照 day 对assigned_on 进行分组,我在第 1、2 和 3 天得到上述结果,但我想将第 1、2 和 3 天的计数结果中的每个结果都设为 3,因为在第二记录 released_on 日期是 12 月 4 日,这意味着床 2 在第 1、2、3 和 4 天被占用。

当前输出:

{ "_id" : 3, "Count" : 2 }
{ "_id" : 2, "Count" : 2 }
{ "_id" : 1, "Count" : 3 }

预期输出:

{ "_id" : 3, "Count" : 3 }
{ "_id" : 2, "Count" : 3 }
{ "_id" : 1, "Count" : 3 }

编辑:_id 是 12 月 1 日、12 月 2 日和 12 月 3 日的日期,count 是在各自日期分配的床位数量

帮助或指针会很有帮助

【问题讨论】:

  • 你的问题很难理解
  • 如果你观察我的样本数据,床 2 的记录显示 assignment_on 为 12 月 1 日,released_on 为 12 月 4 日,这意味着床在 12 月 1 日、2 日、3 日和 4 日也被占用。目前我可以得到每一天的计数,就像你在结果中看到的那样,12 月 1 日计数为 3,12 月 2 日计数为 2,12 月 3 日计数为 2。但我希望输出为 12 月 3 日计数 3,12 月 2 日计数 3, 12 月 3 日计数 3,因为床 2 被占用了 4 天,即 1、2、3 和 4。现在清楚了吗?
  • 您能发布您的预期输出吗?我真的不明白你要做什么
  • 大卫我已经添加了它

标签: mongodb date mongodb-query aggregation-framework


【解决方案1】:

你可以用 mongodb mapReduce:

var map = function(){

    var startDate = new Date(this.assigned_on.getTime());
    //set time to midnight
    startDate.setHours(0,0,0,0);

    //foreach date in date range [assigned_on, released_on) emit date with value(count) 1 
    for (var date = startDate; date < this.released_on; date.setDate(date.getDate() + 1)) {
        if(this.bed_id) {
            emit(date, 1);
        }
    }
};

//calculate total count foreach emitted date(key) 
var reduce = function(key, values){
    return Array.sum(values)
};

db.collection.mapReduce(map, reduce, {out : {inline : 1}}, callback);

对于您的数据,我得到了这样的结果:

[ { _id: Tue Dec 01 2015 02:00:00 GMT+0200 (EET), value: 3 },
  { _id: Wed Dec 02 2015 02:00:00 GMT+0200 (EET), value: 3 },
  { _id: Thu Dec 03 2015 02:00:00 GMT+0200 (EET), value: 3 },
  { _id: Fri Dec 04 2015 02:00:00 GMT+0200 (EET), value: 1 } ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多