我们有一个包含时间序列快照的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
。
答案 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
值作为最后一点,我不认为这对于很长时间的系列都是时间有效的,因为基本上MongoDB必须遍历所有项目才能到达最后一个项目。