MongoDB聚合范围

时间:2014-07-12 19:31:08

标签: mongodb

我有以下格式的文件:

[
  {
    date:"2014-07-07",
    value: 20
  },
  {
    date:"2014-07-08",
    value: 29
  },
  {
    date:"2014-07-09",
    value: 24
  },
  {
    date:"2014-07-10",
    value: 21
  }
]

我想运行一个聚合查询,它会在日期范围内给出结果。例如

[
  { sum: 49 },
  { sum:45 },
]

所以这些是每日价值,我需要知道过去7天的价值总和。在这些之前7天。例如5月1日至5月6日的总和,然后是5月7日至5月14日的总和。

我可以使用多个组和范围的聚合来在单个mongodb查询中获得此结果吗?

1 个答案:

答案 0 :(得分:1)

只要您确切知道要执行的操作,就可以使用聚合按源文档中可以计算的任何内容进行分组。

根据您的文档内容和示例输出,我猜测您要按两天的时间间隔求和。以下是如何编写聚合以在样本数据上输出此内容:

var range1={$and:[{"$gte":["$date","2014-07-07"]},{$lte:["$date","2014-07-08"]}]}
var range2={$and:[{"$gte":["$date","2014-07-09"]},{$lte:["$date","2014-07-10"]}]}
db.range.aggregate(
    {$project:{
         dateRange:{$cond:{if:range1, then:"dateRange1",else:{$cond:{if:range2, then:"dateRange2", else:"NotInRange"}}}},
         value:1}
    }, 
    {$group:{_id:"$dateRange", sum:{$sum:"$value"}}}
)
{ "_id" : "dateRange2", "sum" : 45 }
{ "_id" : "dateRange1", "sum" : 49 }

将范围替换为range1和range2中的字符串,并且可选地,您可以在开始仅对已聚合的整个范围内的文档进行操作之前进行过滤。