我在我的项目中使用了一些不同的 Map/Reduces 函数。但其中一个与其他有很大不同,因为它需要地图功能中的循环。对于循环中的每个计数,我发送一个发射。
我所拥有的是这种情况(在用户集合中):
"channels" : [
"Channel 1",
"Channel 2",
],
我想做的是统计每个频道有多少用户。因此,我可以使用db.users.find({channels: "Channel 1"}).count()
但不幸的是频道是动态的,这意味着我不知道所有可能的频道名称,并且将来可能会发生变化。
所以我认为 Map/Reduce 工作会非常完美。但问题是我写的第一个 Reduce 作业计算错误。而另一个我为每个发射使用查询的地方,将永远花费(在 ssh 会话关闭前 3 个多小时)。
所以现在我被困住了,我需要帮助,最好是我想要一份 Map/Reduce 工作,因为它比一堆实时运行速度慢的查询要好。
这是我写的最新的Map
和功能:Reduce
var map = function() {
if(this.channels) {
for(var i = 0, imax = this.channels.length; i<imax; i++) {
emit(this.channels[i], 1);
}
}
}
var reduce = function (key, values) {
var result = 0;
values.forEach(function (value) {
// had this before: result += 1;
result = db.users.find({'channels' : key}).count();
});
return result;
}
我知道 reduce 函数很可怕,但我只是尽力而为。我认为我的逻辑可能看起来错误,但我找不到一个好的解决方案。现在我想在每个页面加载时只做一堆查询,但这会很慢。
请帮忙!:)