【发布时间】:2016-05-18 12:00:49
【问题描述】:
我有一个包含如下文档的集合:
{startDate: ISODate("2016-01-02T00:00:00Z"), endDate: ISODate("2016-01-05T00:00:00Z")},
{startDate: ISODate("2016-01-02T00:00:00Z"), endDate: ISODate("2016-01-08T00:00:00Z")},
{startDate: ISODate("2016-01-05T00:00:00Z"), endDate: ISODate("2016-01-08T00:00:00Z")},
{startDate: ISODate("2016-01-05T00:00:00Z"), endDate: ISODate("2016-01-10T00:00:00Z")},
{startDate: ISODate("2016-01-07T00:00:00Z"), endDate: ISODate("2016-01-10T00:00:00Z")}
我想返回最小值 startDate 和最大值 endDate 之间每个日期的记录。除了这些记录中的每一个,我还想返回 startDate 和 endDate 包含此日期的记录数。
所以对于我上面的例子,最小startDate 是1/2/2016,最大endDate 是1/10/2016,所以我想返回这两者之间的所有日期以及计数。请参阅下面的所需输出:
{date: ISODate("2016-01-02T00:00:00Z"), count: 2}
{date: ISODate("2016-01-03T00:00:00Z"), count: 2}
{date: ISODate("2016-01-04T00:00:00Z"), count: 2}
{date: ISODate("2016-01-05T00:00:00Z"), count: 4}
{date: ISODate("2016-01-06T00:00:00Z"), count: 3}
{date: ISODate("2016-01-07T00:00:00Z"), count: 4}
{date: ISODate("2016-01-08T00:00:00Z"), count: 4}
{date: ISODate("2016-01-09T00:00:00Z"), count: 2}
{date: ISODate("2016-01-010T00:00:00Z"), count: 2}
如果这没有意义,请告诉我,我可以尝试更详细地解释。
我可以使用如下循环来做到这一点:
var startDate = ISODate("2016-01-02T00:00:00Z")
var endDate = ISODate("2016-02-10T00:00:00Z")
while(startDate < endDate){
var counts = db.data.find(
{
startDate: {$lte: startDate},
endDate: {$gte: startDate}
}
).count()
print(startDate, counts)
startDate.setDate(startDate.getDate() + 1)
}
但我想知道是否有办法使用聚合框架来做到这一点?我主要来自 SQL 背景,其中循环获取数据通常是一个坏主意。同样的规则是否适用于 MongoDB?我应该担心在这里使用循环并尝试使用聚合框架还是这是一个有效的解决方案?
【问题讨论】:
标签: mongodb mapreduce mongodb-query aggregation-framework