Python Pymongo自动排序输入字典
我正在使用Pymongo访问Mongo数据库。我想搜索指定位置附近所有姓名包含字符串的人。例如,我想搜索[105.0133,21.3434]附近的所有人,并且名称包含“Mark”。所以我这样写查询: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/", "
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中,您希望保持简单。你能解释一下为什么需要订购吗?请把这个细节添加到你原来的帖子中,也许我可以建议一个更好的选择。