MongoDB:将数组元素转换为字段

时间:2014-06-12 12:14:37

标签: mongodb mapreduce aggregation-framework

我在MongoDB 2.6.0上,我有一个包含这样文档的集合:

{ "mid" : 1021, 
  "day" : 298,
  "data":[
  {"ts" : 1,"kwh" : 0.017},
  {"ts" : 2,"kwh" : 0.018},
  {"ts" : 3,"kwh" : 0.019},
  ... ] }

我想将数组元素压缩成单独的字段,如下所示:

{ "mid" : 1021, 
  "day" : 298,
  "ts1" : 0.017,
  "ts2" : 0.018,
  "ts3" : 0.019,
  ...
}

这看起来应该可以使用Aggregation框架,但我真的无法弄清楚如何根据“ts”的值重新投影数据数组的“kwh”元素。

有人知道怎么做吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

确实更多的mapReduce任务:

db.collection.mapReduce(
    function () {

      var copy = this;
      var tdata = copy.data;
      delete copy.data;

      tdata.forEach(function(data) {
        var key = "ts" + data.ts;
        copy[key] = data.kwh;
      });

      var id = copy._id;
      delete copy["_id"];

      emit( id, copy );

    },
    function(){},
    { "out": { "inline": 1 } }
)

目前您无法灵活地指定"键"使用聚合框架。您必须通过投影明确命名每个键,以获得所需的输出。

MapReduce没有给出"确切地说"您想要的相同输出如何工作。但它是没有明确命名键的最接近的。