MongoDB计算日期分组计数
我想计算每天的分配计数,通过使用天分组在分配上我可以得到每天的分配计数,但这些是每天的唯一计数 在这一点上,我还希望包括昨天或几天前分配但尚未释放的那张床 例如,我有以下记录MongoDB计算日期分组计数,mongodb,date,mongodb-query,aggregation-framework,Mongodb,Date,Mongodb Query,Aggregation Framework,我想计算每天的分配计数,通过使用天分组在分配上我可以得到每天的分配计数,但这些是每天的唯一计数 在这一点上,我还希望包括昨天或几天前分配但尚未释放的那张床 例如,我有以下记录 { "assigned_on":ISODate("2015-12-01T00:00:00Z"), "released_on":ISODate("2015-12-01T14:01:23Z"), "bed_id":1 }, { "assigned_on":ISODate("2015-12-01
{
"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
}
}
}
])
在第二个记录中,发布的日期是12月4日,这意味着第二张床在第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是各天分配的床位数
帮助或指针将非常有用您可以使用mongodb:
你的问题很难理解如果你观察我的样本数据,那么床位2的记录显示12月1日被分配,12月4日被发布,这意味着床位也在12月1日、2日、3日和4日被占用。目前我可以得到每天的计数,就像你们在结果中看到的一样,12月1日的计数是3,12月2日的计数是2,12月3日的计数是2。但我希望输出为12月1日计数3,12月2日计数3,12月3日计数3,因为床位2占用了4天,即1、2、3和4天。现在清楚了吗?你能公布一下你的预期结果吗?我真的不明白你想逃避什么我已经加上了
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 } ]