我在项目中使用了一些不同的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;
}
我知道减少功能是可怕的,但我只是尝试了我能想到的最好的。我认为我的逻辑可能看似错误,但我找不到一个好的解决方案。现在我想在每个页面加载上做一堆查询,但它会很慢。
请帮忙! :)
答案 0 :(得分:1)
在您的场景中,reduce函数应如下所示:
var reduce = function (key, values) {
var result = 0;
values.forEach(function (value) {
result += value;
});
return result;
}
让我知道它是否仍然无效,如果确实如此,请举例说明输入和(错误的)输出。
答案 1 :(得分:1)
请参阅:http://docs.mongodb.org/manual/applications/aggregation/
此外,您可能需要通过使用适当的索引来加快查询速度。或者在用户加入/离开频道时向频道添加用户数并增加/减少。当然取决于您的应用程序的用例。