2011-08-23 44 views
0

我使用Pymongo来访问Mongo数据库。我想搜索名称中包含字符串的指定位置附近的所有人。例如,我想搜索附近的所有人[105.0133,21.3434],并且名称中包含“标记”。所以我写这样的查询:Pymongo自动排序输入字典

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 } } 

(“姓名”关键是前“location.coords”,这是不是我所期待 - 也MongoDB的预期)

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

感谢和问候

回答

0

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

最好是想词典作为一组无序的键:值 对,该密钥是唯一的(一个 字典之内)的要求。

如果你想索引你的字典在特定的顺序,你必须以某种方式存储您的订单。一个简单的方法来做到这一点是保持你的钥匙在一个列表,如:

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

您可能还需要investigate

collections.OrderedDict([项目])

返回字典 子类的实例,支持通常的字典方法。 OrderedDict是一个字典 ,它记住了键被首次插入的顺序。如果新条目 覆盖现有条目,则原始插入位置将保留 不变。删除一个条目并重新插入它将会将其移动到 的末尾。

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

+0

谢谢您的答复。你可以给我一个OrderedDict对象的建议,因为我使用Python 2.6,集合。OrderedDict仅在2.7版本中提供。 – ofecrpnr

+0

@ofecrpnr:我的建议是,你不要使用有序的字典。只要坚持基础知识,如果您将密钥顺序保留在列表中,那么您将始终有一致的顺序来索引到您的字典中。请记住,在Python中你想保持简单。你能解释为什么你需要订购吗?请将此详细信息添加到您的原始帖子,也许我可以建议一个更好的选择。 –

0

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

要使用正则表达式(“包含”)滤波器PyMongo,你需要传递一个Python正则表达式对象。试试这个:

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