【问题标题】:MongoDB: convert array elements to fieldsMongoDB:将数组元素转换为字段
【发布时间】:2014-06-12 12:14:36
【问题描述】:

我在 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,
  ...
}

这看起来应该可以通过聚合框架实现,但我真的不知道如何根据“ts”的值重新投影数据数组的“kwh”元素。

有人知道怎么做吗?

感谢您的帮助!

【问题讨论】:

  • 您确定要这样做吗?当您保留数据数组结构时,大多数查询将更容易执行。
  • 这里可能不清楚。你真的想要数组数据中的平均值或其他东西吗?

标签: mongodb mapreduce aggregation-framework


【解决方案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 不会给出“完全”相同的输出,因为它是如何工作的。但它是您在没有明确命名键的情况下获得的最接近的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2019-11-02
    • 2012-12-11
    相关资源
    最近更新 更多