2012-07-03 103 views
2

对于我的Rails + MongoId应用程序,为了统计目的,我需要汇总数据。 我的模型rapresenting是HAS_MANY版本的通用Web应用程序(又名:束)和相对的用户激活:关于深嵌套文档问题的MongoDB MapReduce问题

App = { 
    "_id" : ObjectId("4ff2e2eab528571384000eb4"), 
    "name" : "my app", 
    "category_id": "4ff2e2eab528571384000cc0", 
    "bundles": [{ 
    "_id" : ObjectId("4ff2e2eab528571384000dca"), 
    "activations" : [{ 
     "user" : "user_0", 
     "_id" : ObjectId("4ff2e2eab528571384000dd0") 
    }, 
    ... 
    }, 
    ... 
    ] 
} 

现在,我要做的就是返回每个应用CATEGORY_ID激活数,ALA:

results = [ 
    { 
    "_id": "4ff2e2eab528571384000cc0", 
    "value": 243 
    }, 
    ... 
] 

我可以很容易地获得每CATEGORY_ID束这个MapReduce的功能总数:

map = function() { 
    for (var bundle in this.bundles) { 
    emit(this.category_id, 1); 
    } 
}; 
reduce = function(key, values) { 
    var sum = 0; 
    values.forEach(function(value) { 
    sum += value; 
    }); 
    return sum; 
}; 

但是,当我尝试进入更深层次,我根本没有得到任何结果:

map = function() { 
    for (var bundle in this.bundles) { 
    for (var activation in bundle.activations) { 
     emit(this.category_id, 1); 
    } 
    } 
}; 
reduce = function(key, values) { 
    var sum = 0; 
    values.forEach(function(value) { 
    sum += value; 
    }); 
    return sum; 
}; 

任何想法是非常感谢。此致敬礼

迈克科斯塔

回答

0

您确定您的地图缩小功能运行正常吗?

我想你应该检查bundle.activations是否为非null。 检查服务器日志中是否有任何错误。 也可以使用服务器日志查看调试打印语句。

1

感谢您的提示NOMOA,

我能够通过修改地图功能如下解决我的问题:

map = function() { 
    var len = this.bundles.length; 
    for (var i = 0; i < len; i++) { 
    if (this.bundles[i].activations !== undefined) { 
     emit(this.category_id, this.bundles[i].activations.length); 
    } 
    } 
}; 

,我不得不删除了赞成的for..in contruct一个更传统的..i ++,添加一个“未定义”的检查(如你所建议的),它完美的工作(我也避免了双循环)!

致以问候 M. Costa