MongoDB 聚合 : Combine two arrays

标签 mongodb mapreduce mongodb-query aggregation-framework

我在集合中存储了以下类型的文档。

{
  "_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 的解决方案也可以。我怎样才能产生想要的结果?

最佳答案

既没有聚合框架也没有 map/reduce 的替代解决方案:

db.sens.find().forEach(function (doc) {
   doc.data.forEach(function(dataElement) {
      var sumArray = [];
      for (var j = 0; j < dataElement.flow.length; j++) {
         sumArray[j] = dataElement.flow[j] + dataElement.occupancy[j];
      }
      dataElement.sum = sumArray;
      collection.save(doc);
   });
});

关于MongoDB 聚合 : Combine two arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26232821/

相关文章:

mongodb - MongoDB 中的 ISO8601 日期字符串(索引和查询)

node.js - mongodb - 使用 $geoNear 在使用 maxDistance 时给出 "geo near accepts just one argument when querying for a GeoJSON point"

hadoop - reduce任务输入不平衡如何处理?

javascript - MongoDB - 如何使用 GEO 和地址的最佳方式?

MongoDB 过滤器(如果所有键都作为字段存在)

mongodb - 在 ansible playbook for mongodb 中出现 rs.add() 问题

google-app-engine - GAE MapReduce 并行性和配额

hadoop - 在 postgres 中插入数据时,Reduce 代码随机卡住

MongoDB Setunion 和 Group by

javascript - 如何使用socket.io从客户端向服务器插入数据?