Python MongoDb:$sort by$in

Python MongoDb:$sort by$in,python,mongodb,sorting,pymongo,Python,Mongodb,Sorting,Pymongo,我正在使用$in操作符运行mongodb查找查询: collection.find({name: {$in: [name1, name2, ...]}}) 我希望结果按与我的名称数组相同的顺序排序:[name1,name2,…]。我如何做到这一点 注意:我是通过pymongo访问MongoDb的,但我认为这并不重要 编辑:由于在MongoDb中本机无法实现这一点,我最终使用了一个典型的Python解决方案: names = [name1, name2, ...] results = list(

我正在使用
$in
操作符运行mongodb
查找
查询:

collection.find({name: {$in: [name1, name2, ...]}})
我希望结果按与我的名称数组相同的顺序排序:
[name1,name2,…]
。我如何做到这一点

注意:我是通过pymongo访问MongoDb的,但我认为这并不重要

编辑:由于在MongoDb中本机无法实现这一点,我最终使用了一个典型的Python解决方案:

names = [name1, name2, ...]
results = list(collection.find({"name": {"$in": names}}))
results.sort(key=lambda x: names.index(x["name"]))

不可能$现场操作员检查是否存在。该列表被视为已设置

选项:

  • 拆分多个名称1的查询。。。以相同的方式命名或筛选结果。 更多名称-更多查询
  • 使用itertools groupby/ifilter。在这种情况下,向每个文档添加“排序优先级”标志,并将name1与PREC1、name2与PREC2……匹配,然后按PREC排序,然后按PREC分组
如果您的集合在“名称”字段上有索引,则选项1更好。
如果没有索引,或者由于写入/读取比率高,您无法创建索引-选项2适合您。

Vitaly是正确的,使用find无法做到这一点,但可以通过聚合实现:


聚合([{$match:{$name:{$in:[name1,name2,…]}},{$project:{'name':1,'name1':{$eq:['name1','$name']},'name2':{$eq:['name2','$name']}},{$sort:{'name1':1,'name2':1})

根据第2.6.5节进行测试


我希望这将向其他人提示正确的方向。

从即将发布的3.4版(2016年11月)开始,您可以通过聚合框架实现这一点

假设您想要的顺序是数组
order=[“David”、“Charlie”、“Tess”]
您可以通过以下管道执行此操作:

m = { "$match" : { "name" : { "$in" : order } } };
a = { "$addFields" : { "__order" : { "$indexOfArray" : [ order, "$name" ] } } };
s = { "$sort" : { "__order" : 1 } };
db.collection.aggregate( m, a, s );
“$addFields”
阶段在3.4中是新的,它允许您在不知道所有其他现有字段的情况下将新字段添加到现有文档中。新的
“$indexOfArray”
表达式返回给定数组中特定元素的位置


此聚合的结果将是符合您的条件的文档,按照输入数组中指定的顺序,文档将包括所有原始字段,再加上一个名为
\u order

的附加字段。您的意思是首先要包含name1的记录,然后是包含name2的记录吗?是的,例如没错。在本例中,名称是唯一的,但这并不相关,是吗?通过正常的查询,目前无法做到这一点。你说的唯一是什么意思?