未嵌入的子对象上的MapReduce

时间:2012-04-13 15:40:41

标签: mongodb mapreduce mongoid

我遇到了创建mapreduce算法的问题,该算法可以获得我需要的统计数据。我有一个用户对象,可以创建一个帖子,一个帖子可以有很多其他用户的喜欢。

用户
--Post
----喜欢

“帖子”未嵌入用户中,因为我们单独访问帖子而不仅仅是在用户上下文中。我需要的数据是作者已经获得的喜欢的数量,我需要通过用户的帖子得到这个。问题是因为帖子没有嵌入,我无法在我的地图功能中访问它们。以下是我目前拥有的地图和缩小功能

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的帖子。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

Map Reduce实际上是设计为一次在单个集合上运行。

从技术上讲,可以像你一样从Map函数内部查询单独的集合,但要小心,因为不建议也不支持。你可能会遇到问题,特别是如果集合是分片的。

前一段时间问了一个类似的问题:How to call to mongodb inside my map/reduce functions? Is it a good practice?

如果要汇总多个集合的结果,您可能会发现最安全,最直接的方法是在应用程序中。

或者,如果每个作者的喜欢是一个将以某种频率搜索的值,则最好将其作为每个文档中的值包含在内,并在每次更新上花费更多的开销来增加此值,而不是而不是定期对每位作者的所有选票进行资源大量计算。

希望这会为您提供一些思考,以便检索您需要的值。

如果您希望获得一些帮助,为单个集合编写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操作的详细分步演练,解释了函数的执行方式。