gpt4 book ai didi

MongoDB MapReduce 关于深层嵌套文档问题

转载 作者:可可西里 更新时间:2023-11-01 10:44:38 26 4
gpt4 key购买 nike

对于我的 Rails+MongoId 应用程序,我需要聚合数据以用于统计目的。我的模型正在呈现一个通用的 Web 应用程序,它有_许多版本(又名: bundle )和相关用户激活:

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

现在,我要做的是返回每个应用程序 CATEGORY_ID 的激活数,例如:

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

我可以使用此 mapreduce 函数轻松获得每个 CATEGORY_ID 的 BUNDLES 总数:

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;
};

非常感谢任何想法。最好的问候

迈克·科斯塔

最佳答案

感谢 NOMOA 的提示,

我可以通过如下修改 map 函数来解决我的问题:

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 结构以支持更传统的 for..i++,添加一个“未定义”检查(如您建议的那样)并且它工作得很好(我也避免了双循环)!

最好的问候M·科斯塔

关于MongoDB MapReduce 关于深层嵌套文档问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com