【问题标题】:MongoDB aggregation over a range范围内的 MongoDB 聚合
【发布时间】:2014-07-13 04:17:02
【问题描述】:

我有以下格式的文件:

[
  {
    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 查询中获得此结果吗?

【问题讨论】:

  • 这些总和代表什么?你想按日期求和吗?每两天一次?别的东西?一切皆有可能,但你需要清楚自己想要什么。
  • 哇!这个 sum 代表 value 字段的总和不是很清楚吗?
  • 我还提到我需要日期范围内的结果。很简单,给我给定范围内的日期值的总和
  • 很明显这是一个总和,不清楚是什么日期范围,它们来自哪里,有多少等等。
  • 我根据非常具体的需要编辑了我的问题.. 我希望这能说明问题

标签: mongodb


【解决方案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 中的字符串,并且您可以选择在开始仅对已在您聚合的完整范围内的文档进行操作之前进行过滤。

【讨论】:

  • 可选地,您可以使用 {$sort:{_id:1}} 添加最后一个阶段以按范围排序。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2018-12-15
相关资源
最近更新 更多