var fromMs = 1503641711307;
var toMs = 1506224754623;
var intervals = 200;
var intervalsInt = isNaN(parseInt(intervals)) ? 500 : parseInt(intervals);
var intervalMs = Math.round(Number((toMs - fromMs) / intervalsInt));
db.mycollection.aggregate(
[{
$match: {
timestamp: {
$gte: new Date(fromMs),
$lt: new Date(toMs)
},
source: 'graphs',
typedata: 'rainfall_rate',
}
}, {
$group: {
_id: {
$subtract: [
"$timestamp",
{
"$mod": [{
"$subtract": ["$timestamp", new Date("1970-01-01")]
}, intervalMs]
}
]
},
"timestamp": {
"$first": "$timestamp"
},
"source": {
"$first": "$source"
},
"pair": {
"$first": "$typedata"
}
}
}])

上面的代码将从mycollection返回来自集合中所有文档的N = 200个文档,日期范围从1503641711307开始,到1506224754623结束。
问题是200个返回的文件不一定准确地在1503641711307开始并且完全在1506224754623结束。由于mod计算,起始文件很可能是 - 1503641711307,最后一个文件将是-before- 1506224754623
有没有办法始终确保在返回的结果中总是有一个文档的开始时间戳非常接近或者恰好在1503641711307,并且文档的结束时间戳非常接近或者恰好在1506224754623?
(我包括 - '非常接近' - 在我的问题中,因为可能有文档并不总是在集合中的指定时间戳,但在这种情况下的开始和结束时间戳应该是尽可能接近指定的范围)