【发布时间】:2014-12-01 16:36:35
【问题描述】:
我在集合中存储了以下类型的文档。
{
"_id" : "318036:2014010100",
"data": [
{"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], time: 0},
{"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], time: 30},
...
]
}
我想从流和占用数组中的第一个、第二个、...、第 n 个值计算聚合值。应保留数组中的顺序。假设我想计算总和。结果应如下所示:
{
"_id" : "318036:2014010100",
"data": [
{"flow": [6, 10, 12], "occupancy": [0.0356, 0.06, 0.0856], sum: [6.0356, 10.006, 12.00856], time: 0},
{"flow": [2, 1, 4], "occupancy": [0.01, 0.0056, 0.0422], sum: [2.01, 1.0056, 4.0422], time: 30},
...
]
}
我试图通过使用聚合框架来解决这个问题,但我目前的方法不保留排序并产生很多总和。
db.sens.aggregate([
{$match: {"_id":/^318036:/}},
{$limit: 1},
{$unwind: "$data"},
{$unwind: "$data.flow"},
{$unwind: "$data.occupancy"},
{
$group: {
_id: {id: "$_id", time: "$data.time", o: "$data.occupancy", f: "$data.flow", s: {$add: ["$data.occupancy", "$data.flow"]}}
}
},
{
$group: {
_id: {id: "$_id.id", time: "$_id.time"}, occ: { $addToSet: "$_id.o"}, flow: {$addToSet: "$_id.f"}, speed: {$addToSet: "$_id.s"}
}
}
])
我不确定聚合框架是否可以解决这个问题,所以使用 MapReduce 的解决方案也可以。我怎样才能产生想要的结果?
【问题讨论】:
-
我相信jira.mongodb.org/browse/SERVER-5919 会阻止您解决聚合框架的问题。另一方面,使用 map reduce 完全可以做到这一点。
-
我个人对您对结果的期望感到有些困惑。 “套装”没有排序。 CTO 自己也是这么说的,这基本上是一个通用的数学原理。
$group她的 e 上的“双泵”不是必需的,因为它可以在一个阶段完成。鉴于您的原始输入,这基本上让我回到“您想要实现什么”?好像没有说清楚。 -
我不相信在 2.6 聚合框架中有办法做到这一点。考虑 map/reduce 或客户端(预)处理。
-
如果我正确理解了这个问题,那么既不需要使用聚合框架,也不需要使用 map/reduce。迭代正确的文档并根据需要更新每个文档。
标签: mongodb mapreduce mongodb-query aggregation-framework