通过计算MongoDB中两个列表的交集进行排序

时间:2012-05-11 21:33:37

标签: sorting mongodb mapreduce

我们有一个发布分析要求,也就是说,对于特定帖子,我们需要返回与其主要相关的帖子列表,逻辑是比较帖子中常见标签的数量。例如:

    postA = {"author":"abc",
        "title":"blah blah",
        "tags":["japan","japanese style","england"],
    }

可能有其他帖子包含以下标签:

postB:["japan", "england"]
postC:["japan"]
postD:["joke"]

所以基本上,postB获得2个计数,postC在与postA中的标签比较时获得1个计数。 postD获得0并且不会包含在结果中。

我现在的理解是使用map / reduce来产生结果,我理解map / reduce的基本用法,但我无法找到针对这个特定目的的解决方案。

有任何帮助吗?或者有一种更好的方式,如自定义排序功能来解决它​​?我正在使用pymongodb,因为我是python开发人员。

1 个答案:

答案 0 :(得分:1)

您应该在代码上创建索引:

db.posts.ensure_index([('tags', 1)])

并搜索与postA共享至少一个标记的帖子:

posts = list(db.posts.find({_id: {$ne: postA['_id']}, 'tags': {'$in': postA['tags']}}))

最后,在Python中用交集排序:

key = lambda post: len(tag for tag in post['tags'] if tag in postA['tags'])
posts.sort(key=key, reverse=True)

请注意,如果postA共享至少一个包含大量其他帖子的标签,则效果不佳,因为您将从Mongo向您的应用程序发送大量数据;遗憾的是,没有办法使用Mongo本身对交叉点的大小进行排序和限制。