【问题标题】:MongoDB MapReduce, second argument of reduce function is multidimensional arrayMongoDB MapReduce,reduce函数的第二个参数是多维数组
【发布时间】:2014-06-18 19:03:00
【问题描述】:

我尝试将 mapReduce 用于我的收藏。只是为了调试,我返回 vals 值作为第二个参数传递给 reduce 函数,如下所示:

db.runCommand({
 "mapreduce":"MyCollection",
 "map":function() {
    emit( {
       country_code:this.cc,
       partner:this.di,
       registeredPeriod:Math.floor((this.ca - 1399240800)/604800)
    },
    {
       count:Math.ceil((this.lla - this.ca)/86400)
    });
 },
 "reduce":function(k, vals) {
    return {
       'count':vals
    }; 
 },
 "query":{
    "ca":{
       "$gte":1399240800
    },
    "di":405,
    "cc":"1"
 },
 "out":{
    "inline":true
 }
});

我得到了这样的结果:

{
"results" : [
    {
        "_id" : {
            "country_code" : "1",
            "distribution" : 405,
            "installationPeriod" : 0
        },
        "value" : {
            "count" : [
                {
                    "count" : 37
                },
                {
                    "count" : 38
                }
            ]
        }
    },
    {
        "_id" : {
            "country_code" : "1",
            "distribution" : 405,
            "installationPeriod" : 1
        },
        "value" : {
            "count" : 36
        }
    },
    {
        "_id" : {
            "country_code" : "1",
            "distribution" : 405,
            "installationPeriod" : 4
        },
        "value" : {
            "count" : [
                {
                    "count" : [
                        {
                            "count" : 16
                        },
                        {
                            "count" : 16
                        }
                    ]
                },
                {
                    "count" : 15
                }
            ]
        }
    }
],
"timeMillis" : 38,
"counts" : {
    "input" : 130,
    "emit" : 130,
    "reduce" : 5,
    "output" : 6
},
"ok" : 1
}

我真的不知道为什么我将多维数组作为reduce 函数的第二个参数。我的意思是这部分结果:

        {
        "_id" : {
            "country_code" : "1",
            "distribution" : 405,
            "installationPeriod" : 4
        },
        "value" : {
            "count" : [
                {
                    "count" : [ // <= Why is this multidimensional?
                        {
                            "count" : 16
                        }

为什么这是多维的?为什么嵌入式数组的key和reduce函数返回的key一样?

【问题讨论】:

    标签: mongodb multidimensional-array mapreduce


    【解决方案1】:

    原因是因为这是 mapReduce 的作品。来自documentation point

    MongoDB 可以为同一个键多次调用 reduce 函数。在这种情况下,该键的 reduce 函数的先前输出将成为该键的下一个 reduce 函数调用的输入值之一。

    还有一点:

    返回对象的类型必须与map函数发出的值的类型相同,以确保以下操作为真:

    因此,即使您没有像文档指出的那样“更改签名”,您仍然只在一次减少过程中一次处理 n 项目,然后在下一次通过中处理另一个 n 项目。最终处理的结果是一个片段中返回的数组与另一个片段中的数组组合在一起。

    所以发生的事情是你的 reduce 返回一个数组,但它不是你为键发出的“所有”项目,只是其中的一些。然后在同一个“键”上的另一个减少处理更多的项目。最后,这两个数组(或可能更多)再次发送到 reduce,以尝试按预期实际“减少”这些项目。

    这是一般概念,所以当你只是推回数组时,这就是你得到的,这并不奇怪。

    短版,mapReduce 以块的形式处理输出“键”,而不是一次全部处理。最好现在就了解这一点,以免以后成为您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      相关资源
      最近更新 更多