MapReduce还是普通查询?(每个贴图有几个发射)
MapReduce or Normal Queries? (Several emits per Map)
我在项目中使用了一些不同的映射/减少函数。但其中一个与其他有很大不同,因为它需要地图功能中的循环。对于循环中的每个计数,我都会发送一个发射。
我所拥有的是这个场景(在用户集合中):
"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功能很可怕,但我只是尽了我所能。我认为我的逻辑可能是错误的,但我找不到一个好的解决方案。现在我只想在每次页面加载时进行一系列查询,但速度会非常慢。
请帮忙!:)
在您的场景中,reduce函数应该如下所示:
var reduce = function (key, values) {
var result = 0;
values.forEach(function (value) {
result += value;
});
return result;
}
如果它仍然不工作,请告诉我,如果它工作了,请举一个输入和(不正确的)输出的例子。
MR有时有点慢。因此,您可能想要查看2.2附带的新聚合框架(我认为它目前处于发布阶段)。
请参阅:http://docs.mongodb.org/manual/applications/aggregation/
此外,您可能需要通过使用适当的索引来加快查询速度。或者将用户计数添加到频道,并在用户加入/离开频道时增加/减少。当然,这取决于你的应用程序的使用情况。
- MapReduce还是普通查询?(每个贴图有几个发射)
- 不像同时有几个Facebook粉丝页面
- 将鼠标悬停在 JavaScript 选项卡上,页面上有几个选项卡组
- 给一个有1个变量/对象的函数给定几个参数
- html5视频元素有任何错误?它不会在几个小时后继续播放内容
- 有没有一种方法可以获得与链接几个.next()方法相同的结果
- 几个按钮中有一个是't在JS和HTML中工作
- 当在一个表单中有几个jquery变量时,如何命名输入
- 当React/Flux中有几个小的、可重复的子组件时,如何管理组件渲染
- 如何从饼图中排除系列,如果有几个(Highcharts.js)
- 关于角形式有几个问题
- 下拉菜单,有几个评论选项
- 当一些函数有几个ajax调用时,按顺序执行几个js函数
- 我的JQuery脚本有几个问题
- Sharepoint 2013用iPad创建的网站有时会有几个javascript文件没有加载
- 在backbone.js中,每个页面有几个模型和视图
- 检查是否有几个点在path - JS Canvas中
- 无法读取未定义的值?有几个问题
- 我有几个与call()和apply()的使用有关的问题,或者在本例中如何调用这两个类型Array()和Math
- 有几个关于JSHint的问题:'并且'没有定义'