Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 通过计算MongoDB中两个列表的交集进行排序_Sorting_Mongodb_Mapreduce - Fatal编程技术网

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本身无法根据交叉点的大小进行排序和限制