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



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

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

可能还有其他带有标签的帖子,例如:

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

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

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

有什么帮助吗?或者有没有更好的方法,如自定义排序功能来解决它?我目前正在使用pymongodb,因为我是python开发人员。

你应该在标签上创建一个索引:

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

并搜索与帖子 A 共享至少一个标签的帖子:

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 本身按交集的大小进行排序和限制。

相关内容

  • 没有找到相关文章

最新更新