2012-05-11 150 views
0

我们有一个发布分析需求,也就是说,对于某个特定的帖子,我们需要返回一个主要与它相关的帖子列表,逻辑是比较帖子中的常见标签。例如:通过计数MongoDB中的两个列表的交集排序

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

也有可能是其他职位与像标签:

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

所以基本上,postB得到2个字,postC组相比在波斯塔标签时,得到1个计数。 postD得到0并且不会被包含在结果中。

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

任何帮助?还是有更好的方法,像自定义排序功能来解决它​​?我目前正在使用pymongodb,因为我是python开发人员。

回答

1

你应该创建标签索引:

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

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

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