Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 计算日期在日期范围内的记录数?_Mongodb_Mapreduce_Mongodb Query_Aggregation Framework - Fatal编程技术网

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),这是相关的,但并不完全返回我需要的数据。基本上,它返回一个不同的开始/结束对,以及有多少其他记录具有该开始/结束对。同样-与我需要的相似,但不完全相同。