MongoDB聚合嵌套数组的元素

时间:2015-07-02 14:31:10

标签: arrays mongodb

我们有一个包含时间序列快照的MongoDB(v2.4)集合:

{"foo": "bar",
 "timeseries": [{"a": 1, "b": 2},
                {"a": 2, "b": 3},
                ...]}
{"foo": "baz",
 "timeseries": [{"a": 0, "b": 1},
                {"a": 2, "b": 3},
                ...]}

我需要按foo键对所有条目进行分组,然后对每个文档的每个a值中最后一个条目的timeseries值求和({{每个键1}},就像它一样。我想相信timeseries[-1].a$group$project的某种组合可以做我想做的事情,而不必诉诸$unwind

1 个答案:

答案 0 :(得分:0)

您是否正在寻找以下内容:

> db.collection.aggregate([
  {$unwind: "$timeseries"},
  {$group: {_id: "$_id", foo: {$last: "$foo"},
                         last_value: {$last: "$timeseries.a"}}},
  {$group: { _id: "$foo", total: { $sum: "$last_value" }}}
])
{ "_id" : "baz", "total" : 2 }
{ "_id" : "bar", "total" : 2 }
  • $unwind阶段将在时间服务器中为每个项目生成一个文档
  • 之后,文档将再次分组,仅保留$last
  • 最后,第二个group子句将按 foo 字段对(和值)进行分组。

作为最后一点,我不认为这对于很长时间的系列都是时间有效的,因为基本上MongoDB必须遍历所有项目才能到达最后一个项目。