Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Python Pymongo自动排序输入字典_Python_Dictionary_Geospatial_Pymongo - Fatal编程技术网

Python Pymongo自动排序输入字典

Python Pymongo自动排序输入字典,python,dictionary,geospatial,pymongo,Python,Dictionary,Geospatial,Pymongo,我正在使用Pymongo访问Mongo数据库。我想搜索指定位置附近所有姓名包含字符串的人。例如,我想搜索[105.0133,21.3434]附近的所有人,并且名称包含“Mark”。所以我这样写查询: db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" }) { "name": "/Mark/", "

我正在使用Pymongo访问Mongo数据库。我想搜索指定位置附近所有姓名包含字符串的人。例如,我想搜索[105.0133,21.3434]附近的所有人,并且名称包含“Mark”。所以我这样写查询:

db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" })
{ "name": "/Mark/", "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }
(我的“用户”集合中有一个索引“location.coords”)

查询在Mongodb控制台中工作正常,但在Pymongo执行时,字典将按如下方式重新排序:

db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" })
{ "name": "/Mark/", "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }
(name键在location.coords之前,这不是我所期望的,也是Mongodb所期望的)

这导致Mongodb无法理解查询,并且不返回任何结果。有谁能帮我弄清楚如何强制Pymongo不对我的字典重新排序


感谢并问候

字典类型本质上是无序的。从:

最好将字典视为一组无序的键:值 配对,要求密钥是唯一的(在一个 字典)

如果你想按特定的顺序索引你的字典,你必须以某种方式存储你的顺序。一种简单的方法是将密钥保存在列表中,如:

mongo_keys = ["location.coords", "name"]
for k in mongo_keys:
    do_something(mongo_result[k])
您可能还想:

集合。订购信息([项目])

返回dict的实例 子类,支持常用的dict方法。有条理的话就是口述 它会记住第一次插入键的顺序。如果有新条目 覆盖现有条目,则保留原始插入位置 不变。删除条目并重新插入会将其移动到 结束


不幸的是,如果您需要更多的帮助,您需要提供更多的情况详情。

问题不在于订购,而在于
“/Mark/”
。带有正斜杠的表示法是javascript shell提供的一种方便,并且不构成正则表达式模式本身的一部分(除非您希望它们是文字斜杠,在这种情况下,我误解了您的问题)

要在PyMongo中使用正则表达式(“contains”)过滤器,需要传递一个Python正则表达式对象。试试这个:

{ "name": re.compile("Mark"), "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }

谢谢你的回复。因为我使用的是Python 2.6,所以collections.OrderedDict仅在2.7中可用。@ofecrpnr:我的建议是,您不使用OrderedDict。只要坚持基本原则,如果您在列表中保留键顺序,那么您将始终有一个一致的顺序来索引到词典中。记住,在python中,您希望保持简单。你能解释一下为什么需要订购吗?请把这个细节添加到你原来的帖子中,也许我可以建议一个更好的选择。