Mongodb 计算日期在日期范围内的记录数?
我收集了以下文件:Mongodb 计算日期在日期范围内的记录数?,mongodb,mapreduce,mongodb-query,aggregation-framework,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,我收集了以下文件: {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("2
{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")}
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)
}
我想返回最小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}
请让我知道,如果这没有意义,我可以尝试解释更详细
我可以使用如下循环来完成此操作:
{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")}
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)
}
var startDate=ISODate(“2016-01-02T00:00:00Z”)
var endDate=ISODate(“2016-02-10T00:00:00Z”)
while(开始日期<结束日期){
变量计数=db.data.find(
{
startDate:{$lte:startDate},
结束日期:{$gte:startDate}
}
).count()
打印(起始日期、计数)
startDate.setDate(startDate.getDate()+1)
}
但我想知道是否有一种方法可以使用聚合框架来实现这一点?我的背景主要是SQL,循环获取数据通常是个坏主意。同样的规则是否适用于MongoDB?我应该考虑在这里使用循环并尝试使用聚合框架,还是这是一个有效的解决方案?在mongodb聚合框架中,有阶段而不是循环。它是一个管道,它通过每个阶段,直到达到指定的最后一个阶段。这就是为什么在使用聚合框架时会看到[]。这里有几个阶段(比赛、小组和项目)。看一下他们的文件,很简单。无论如何,那是非常简短的。关于你的问题,我的建议是: 我没有试过这个。如果您可以试试这个,并让我知道它是否有效: 首先,您只能使用$match将日期保持在您希望的范围内。接下来是$group阶段。 例如: 如果您只想使用示例中的startDate进行分组,请替换
_id: {startDate:"$startDate",endDate:"$endDate"
为此:
_id: "$startDate"
我希望这会有所帮助您最好的选择是mapReduce。这是因为您可以在每个文档中的“startDate”和“endDate”之间循环值,并在这些值之间的每一天(或其他所需的间隔)发出。然后,只需从所有数据中累积每个发出的日期键:
db.collection.mapReduce(
函数(){
对于(var d=this.startDate.valueOf();d),这是相关的,但并不完全返回我需要的数据。基本上,它返回一个不同的开始/结束对,以及有多少其他记录具有该开始/结束对。同样-与我需要的相似,但不完全相同。