Sorting 通过计算MongoDB中两个列表的交集进行排序
我们有一个帖子分析需求,也就是说,对于一个特定的帖子,我们需要返回一个与之相关的帖子列表,逻辑是比较帖子中常用标签的数量。例如:Sorting 通过计算MongoDB中两个列表的交集进行排序,sorting,mongodb,mapreduce,Sorting,Mongodb,Mapreduce,我们有一个帖子分析需求,也就是说,对于一个特定的帖子,我们需要返回一个与之相关的帖子列表,逻辑是比较帖子中常用标签的数量。例如: postA = {"author":"abc", "title":"blah blah", "tags":["japan","japanese style","england"], } 可能还有其他带有标签的帖子,如: postB:["japan", "england"] postC:["japan"] postD:[
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)])
并搜索至少与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本身无法根据交叉点的大小进行排序和限制