Pymongo自动对输入字典进行排序

时间:2011-08-23 03:39:25

标签: python dictionary geospatial pymongo

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

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

(我的“用户”集合中有一个索引“location.coords”)

查询在Mongodb控制台中运行正常,但是在Pymongo执行时,字典会重新排序如下:

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

(“name”键在“location.coords”之前,这不是我的预期 - 也是Mongodb预期的)

这导致Mongodb无法理解查询并且不返回任何结果。任何人都可以帮我弄清楚如何强迫Pymongo不重新排序我的字典。

谢谢和问候

2 个答案:

答案 0 :(得分:0)

字典类型本质上是无序的。来自python documentation

  

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

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

mongo_keys = ["location.coords", "name"]
for k in mongo_keys:
    do_something(mongo_result[k])

您可能还想要investigate

  

class collections.OrderedDict([items])

     

返回一个dict的实例   子类,支持通常的dict方法。 OrderedDict是一个词典   它会记住第一次插入密钥的顺序。如果是新条目   覆盖现有条目,保留原始插入位置   不变。删除一个条目并重新插入它将把它移动到   端。

不幸的是,如果您需要更多帮助,则需要提供有关您情况的更多详细信息。

答案 1 :(得分:0)

问题不在于排序,而是"/Mark/"。带有正斜杠的符号是javascript shell提供的便利,并不构成正则表达式模式本身的一部分(除非你的意思是它们是字面斜杠,在这种情况下我误解了你的问题)。 / p>

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

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