我遇到了创建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的帖子。这样做的正确方法是什么?
答案 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操作的详细分步演练,解释了函数的执行方式。