0

我在创建 mapreduce 算法时遇到问题,该算法将为我提供所需的统计信息。我有一个可以创建帖子的用户对象,并且帖子可以得到其他用户的很多赞。

用户——
发帖
——喜欢

帖子没有嵌入到用户中,因为我们单独访问帖子,而不仅仅是在用户上下文中。我需要的统计数据是作者获得的点赞数,我需要通过用户帖子的点赞数来获得。问题是因为帖子没有嵌入,我无法在我的地图功能中访问它们。这是我目前拥有的 map 和 reduce 函数

def reputation_map
 <<-MAP
   function() {      
       var posts = db.posts.find({user_id:this._id});
       emit(this._id, {posts:posts});      
   }
 MAP
end

def reputation_reduce
  <<-REDUCE
    function(key, values) {
      var count = 0;
      while(values.hasNext()){
        values.next();
        count+=1;
      }
      return {posts:count};
     }
 REDUCE
end   

这应该只返回每个用户的帖子,所以我什至还没有达到喜欢的级别,但不是计数,这只会返回帖子的 dbquery。这样做的正确方法是什么?

4

1 回答 1

1

Map Reduce 的设计目的是一次对单个集合进行操作。

从技术上讲,可以像您所做的那样从 Map 函数内部查询单独的集合,但要小心,因为不推荐也不支持这样做。您可能会遇到问题,尤其是当集合被分片时。

不久前有人问了一个类似的问题: 如何在我的 map/reduce 函数中调用 mongodb?这是一个好习惯吗?

如果您正在聚合来自多个集合的结果,您可能会发现最安全和最直接的方法是在应用程序中。

或者,如果每个作者的赞是一个会以某种频率搜索的值,则最好将其作为一个值包含在每个文档中,并在每次更新上花费更多的开销来增加该值,而不是定期执行每个作者的所有投票的潜在资源繁重的计算。

希望这会给您一些思考,以检索您需要的值。

如果您在为单个集合编写 Map Reduce 操作时需要一些帮助,社区随时为您提供帮助。请包括一个示例输入文档,以及所需输出的描述。

有关 Map Reduce 的更多信息,可以在此处找到文档: http ://www.mongodb.org/display/DOCS/MapReduce

此外,MongoDB Cookbook 中有一些很好的 Map Reduce 示例:http: //cookbook.mongodb.org/

食谱文章“使用版本化文档查找最大值和最小值” http://cookbook.mongodb.org/patterns/finding_max_and_min/的“附加”部分包含一个很好的 Map Reduce 操作的逐步演练,解释了如何功能被执行。

于 2012-04-13T18:32:05.763 回答