2011-08-23 25 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 } }