分享

MongoDB 嵌套 mapreduce 问题

huazailmh 发表于 2013-10-17 21:37:50 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 6367
数据如下:
{
        "_id":ObjectId("50c1b9932cec6ac068140c37"),
        "totalNum":10,
        "userData":[
                    {"user":"aaa", "num":2},
                    {"user":"bbb", "num":5},
                    {"user":"ccc", "num":3}
                    ],
                 "category":"china"
}
{
        "_id":ObjectId("50c1a4782cece24074bc4ac5"),
        "totalNum":6,
        "userData":[
                    {"user":"aaa", "num":4},
                    {"user":"ddd", "num":2}
                    ],
                 "category":"china"
}
以category字段做group,对totalNum和userData求sum,其中userData为嵌套文档,在以category做mapreduce时,把userData嵌套文档再次做mapreduce,期望结果如下:
{
        "_id":ObjectId("50c1a4782cece24074bc4ac3"),
        "totalNum":16,
        "userData":[
                    {"user":"aaa", "num":6},
                    {"user":"bbb", "num":5},
                    {"user":"ccc", "num":3}
                    {"user":"ddd", "num":2}
                    ],
                 "category":"china"
}
不知如何实现,请各位大侠指点啊。。。
              
               
               

已有(2)人评论

跳转到指定楼层
strike2368168 发表于 2013-10-17 21:38:21

            function Map() {
    emit({'category':this.category}, {'totalNum':this.totalNum,'userData':this.userData});
}
function Reduce(key, arr_values) {
        var totalNum = 0; //a document
        var temp;
        var userData = new Array();
        for(var i in arr_values) {
                temp = arr_values[i];
                totalNum += temp.totalNum;
                if(userData.length == 0){
                        userData = temp.userData;
                } else {
                        for(var m = 0;m < temp.userData.length; m++){
                                var newData = temp.userData[m];
                                var flag = false;
                                for(var n in userData){
                                        if(newData.user == userData[n].user){
                                                userData[n].num = userData[n].num + newData.num;
                                                flag = true;
                                                break;
                                        }
                                }
                                if(!flag){
                                        userData.push(newData);
                                }
                        }
                }
        }
        return {'totalNum':totalNum,'userData':userData};
}
        
回复

使用道具 举报

zhouyimei 发表于 2013-10-17 21:39:12

            function () {
  var map = function(){
               emit(this.category,
                    {total:this.totalNum,userData:this.userData});
               };
    var reduce=function(key,values){
                var total=0;
                var data={};
                var totaldata=[];
                values.forEach(function(value){
                     value.userData.forEach(function(objuser){
                           if(data[objuser["user"]]
                             && data[objuser["user"]]!=null)
                           {data[objuser["user"]]+=objuser["num"];}
                           else{data[objuser["user"]]=objuser["num"];}
                           });
                      total+=value.total;
                     });
               for(obj in data)
               {
                   totaldata.push({"user":obj,"num":data[obj]});
               }
              return {total:total,userData:totaldata};
           };
     return db.maptest.mapReduce(map,reduce,{out:{inline:1}});
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条