不幸的是,更多的是mapReduce 问题,否则您将无法发出完成这项工作所需的日期。
db.events.mapReduce(
function() {
var oneDay = ( 1000 * 60 * 60 * 24 ),
start = this.startDate.valueOf()
- ( this.startDate.valueOf() % oneDay ),
end = ((this.endDate.valueOf()
- ( this.endDate.valueOf() % oneDay )) + oneDay);
for ( var day = start; day < end; day += oneDay ) {
emit ( new Date( day ), 1 );
}
},
function(key, values) {
return Array.sum( values );
},
{
"query": {
"startDate": { "$gte": new Date("2014-01-01") },
"endDate": { "$lt": new Date("2014-01-06") }
},
"out": { "inline": 1 }
}
)
如果您真的想要日期范围内不存在的事件的零值,您可以稍作更改:
db.events.mapReduce(
function() {
var oneDay = ( 1000 * 60 * 60 * 24 ),
start = this.startDate.valueOf()
- ( this.startDate.valueOf() % oneDay ),
end = ((this.endDate.valueOf()
- ( this.endDate.valueOf() % oneDay )) + oneDay);
for ( var day = start; day < end; day += oneDay ) {
emit ( new Date( day ), 1 );
}
for ( var day = end; day <= ending.valueOf(); day += oneDay ) {
emit( new Date( day ), 0 );
}
},
function(key, values) {
return Array.sum( values );
},
{
"query": {
"startDate": { "$gte": new Date("2014-01-01") },
"endDate": { "$lt": new Date("2014-01-06") }
},
"scope": { "ending": new Date("2014-01-06") },
"out": { "inline": 1 }
}
)
这会给你想要的输出:
"results" : [
{
"_id" : ISODate("2014-01-01T00:00:00Z"),
"value" : 1
},
{
"_id" : ISODate("2014-01-02T00:00:00Z"),
"value" : 1
},
{
"_id" : ISODate("2014-01-03T00:00:00Z"),
"value" : 1
},
{
"_id" : ISODate("2014-01-04T00:00:00Z"),
"value" : 2
},
{
"_id" : ISODate("2014-01-05T00:00:00Z"),
"value" : 1
},
{
"_id" : ISODate("2014-01-06T00:00:00Z"),
"value" : 0
}
]