javascript - 将 MongoDB 文档字段合并到一个文档中

标签 javascript mongodb mapreduce mongodb-query

我使用的是 MongoDB 2.6.6

我在 MongoDB 集合中有这些文档,下面是一个示例:

{ ..., "field3" : { "one" : [ ISODate("2014-03-18T05:47:33Z"),ISODate("2014-06-02T20:00:25Z") ] }, ...}
{ ..., "field3" : { "two" : [ ISODate("2014-03-18T05:47:33Z"),ISODate("2014-06-02T20:00:25Z") ] }, ...}
{ ..., "field3" : { "three" : [ ISODate("2014-03-18T05:47:39Z"),ISODate("2014-03-19T20:18:38Z") ] }, ... }

我想将这些文档合并到一个字段中。例如,我希望新结果如下:

{ "field3", : { "all" : [ ISODate("2014-03-18T05:47:39Z"),ISODate("2014-03-19T20:18:38Z"),......  ] },}

我只是不确定如何获得这个结果!

最佳答案

这里确实没有太多可做的,但你可以说可以使用mapReduce获得那种合并结果:

db.collection.mapReduce(
  function() {
    var field = this.field3;

    Object.keys(field).forEach(function(key) {
      field[key].forEach(function(date) {
        emit( "field3", { "all": [date] } )
      });
    });
  },
  function (key,values) {

    var result  = { "all": [] };

    values.forEach(function(value) {
      value.all.forEach(function(date) {
        result.all.push( date );
      });
    });

    result.all.sort(function(a,b) { return a.valueOf()-b.valueOf() });

    return result;

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

考虑到其自身的操作限制,mapReduce 的输出格式并不完全相同:

{
    "results" : [
            {
                    "_id" : "field3",
                    "value" : {
                            "all" : [
                                    ISODate("2014-03-18T05:47:33Z"),
                                    ISODate("2014-03-18T05:47:33Z"),
                                    ISODate("2014-03-18T05:47:39Z"),
                                    ISODate("2014-03-19T20:18:38Z"),
                                    ISODate("2014-06-02T20:00:25Z"),
                                    ISODate("2014-06-02T20:00:25Z")
                            ]
                    }
            }
    ],
    "timeMillis" : 86,
    "counts" : {
            "input" : 3,
            "emit" : 6,
            "reduce" : 1,
            "output" : 1
    },
    "ok" : 1
}

由于这里聚合到单个文档中是相当任意的,因此您几乎可以说您只是在客户端代码中采用了相同的方法。

无论如何,这仅对相对较小的数据集有用,并且对客户端处理具有类似的限制。超过 MongoDB 的 16MB BSON 限制,但肯定受到要消耗的内存的限制。

所以我认为您需要添加一个“查询”参数,但您的问题并不清楚。无论是使用mapReduce还是您的客户端代码,您基本上都需要遵循这种过程将数组“混搭”在一起。

我个人会选择这里的客户端代码。

关于javascript - 将 MongoDB 文档字段合并到一个文档中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824411/

相关文章:

附加 html 后的 Javascript 函数

javascript - 定义哪个方法可以被链接

javascript - 垂直 - 具有固定列的水平滚动 HTML 表格

java - 在Hadoop的WordCount程序中获取异常

hadoop - 在hadoop hipi中,hibimport文件只支持jpg和png图片格式,任何可能支持hibImport中的所有图片格式

javascript - 如何使用 JavaScript/AngularJS 访问 _embedded 资源中的 HAL _links

javascript - 没有字段名的Mongodb返回值

mongodb - 在 MongoDB java 中使用 ordered as false 批量写入时处理异常

json - 尝试从本地主机服务器连接 mLAB DB?认证失败

java - MapReduce 用于使用 Java 查找字符串