javascript - 在 Mongo 中重新加入拆分 MapReduce 数组

标签 javascript arrays mongodb mapreduce

我正在学习 mapReduce。我对一组用户调用了以下 map reduce 函数。

function () {

    m = function () {
            emit(this.city, {num:1, arr:this});
    }

    r = function (key, arr_values) {
            var resultArray = [];
            var count = 0;
            arr_values.forEach(function (value) {
                                    resultArray.push(value);
                                    count++;
                                });
            return {num:count, arr:resultArray};
    }

    res = db.AdsOnPage.mapReduce(m, r, {out:"ReducedCollection"});


}

这最终给了我我需要的东西——“城市”作为键,然后是该城市中的一组用户作为值。但它实际上是在荒谬数量的嵌套数组中给我的。我假设这是分片的结果?但是我该如何重新加入一切呢?现在,结果看起来像这样:

{
  "city":"Chicago",
  "value" : {
    "num" : 2.0,
    "arr" : [{
        "num" : 2.0,
        "arr" : [{
            "num" : 1.0,
            "arr" : [{
                <user doc is here>
              }]
          }, {
            "num" : 1.0,
            "arr" : [{
                <user doc is here>
              }]
          }]
      }
.......
for many many arrays

为什么会这样?有什么方法可以将我的结果重新加入一个连贯的单一数组中吗?

最佳答案

与分片无关,这与 Map/Reduce 逻辑有关。

map 函数的value 需要与 reduce 的返回值具有相同的形状。

请记住,reduce 可以运行多次。事实上,在分片的情况下,它将为每个分片运行一次,然后由发出请求的 mongos 再次运行。

你在想你运行时会发生什么

减少(键,[a,b,c])

要使 Map/Reduce 工作,输出必须与以下内容相同:

reduce(key, [a, reduce(key, [b,c]) )

减少(键,[减少(键,[a,b]),c])

在你的例子中,reduce(key, [b,c]) 返回一个数组,所以你得到以下内容:

reduce(key, [a, reduce(key, [b,c]) ) => reduce(key, [a, [b,c] ])

注意到额外的数组了吗?这就是你要嵌套的原因。

解决这个问题需要两部分。

  1. 如果 values 是一个数组,那么 emit 应该输出一个包含其中一项的数组。
  2. 当您进行此更改时,arr_values 将成为“数组的数组”。您必须正确组合它们。

希望这能为您指明正确的方向。有关调试的更多详细方法,您可能需要查看 Troubleshooting M/R 上的页面.

关于javascript - 在 Mongo 中重新加入拆分 MapReduce 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099991/

相关文章:

c++ - 如何从数组中并行删除零值

arrays - XCode 7 Beta 3 - 数组扩展

c - 如何从存储的字符串数组中使用 getchar() 函数?

mysql - MongoDB 或 SQL - 使用 RegEx 创建新分组

javascript - 如何使用刚刚在命名空间内创建的 jQuery 变量?

javascript - 从缓存中重新加载 iframe

javascript - 如何从 ngModel 渲染 HTML 标签?

javascript - Google Closure - 将数据形成为 json 对象

mongodb - 如何让 MongoDB Server 在 Linux Startup (CentOS) 上启动

linux - MongoDB安装错误: "mongod: error while loading shared libraries: libc++.so.1..."