2015-04-25 35 views
-1

當使用Python和pymongo從Mongo數據庫獲取子文檔的對象結果時,出現這個奇怪的問題。與MongoDb和Python返回的相同子文檔的多個記錄問題

我有一份包含子文檔列表的文檔,例如

User: { 
    "_id": .... 
    hats: [{"colour": "blue" }] 
} 

我用find_one()來查詢它。它返回文檔的細節和一個子文檔記錄。然而,接下來我會回答兩個「帽子」,第二個是第一個複製品。隨着下一個我拿回三個「帽子」,並繼續像這樣。

如果我重新啓動應用程序,上面的「count」將被重置,所以find_one()查詢將再次返回一個子文檔。

數據庫中肯定只有一個子文檔記錄,所以這不是問題。在內存方面,它一定會做些奇怪的事情。

我正在使用Python「Tornado」框架,該應用程序是一個tornado.wsgi.WSGIApplication。每次有新的請求時,都應該打開一個新的連接。

請求處理程序一起,我真的很困惑關於它可能是什麼

class Handler(RequestHandler): 
    def initialize(self): 
     self.db = MongoClient("localhost", 27017) 

線的東西。

+0

我們需要更多信息來幫助調試。你可以在它周圍顯示「find_one」調用和幾行代碼嗎?你提到了一個「count」,但在你的例子中沒有「count」字段,所以你沒有向我們展示相關的代碼。 –

+0

我指的是重複子文檔的數量。不是數據庫調用。找到的一切都不復雜,它只是.find_one({「_ id」:as_objectid(lobby_id)})。 as_objectid只是一個函數,如果值爲None,則返回None None ObjectId(str(value))「 – John

+0

謝謝John。到目前爲止,您分享的內容並沒有指向我的解決方案,因此如果您實際上可以粘貼執行find_one的代碼以及其他任何循環代碼?你寫道,「接下來我做了查詢,我找回兩個帽子」,那麼觸發額外查詢的是什麼?這不是MongoDB或PyMongo中的一個已知錯誤,所以我期待看到足夠的*你的*代碼,我可以看到這個錯誤。 –

回答

0

最終它與MongoDb無關。

對於數據庫中的每個集合類型,我都有一個模型類。有了這個,我可以將它與數據如何從服務器返回的方式進行分離,以確切確定數據的細節。

class User(ModelBase): 
    name = None 
    hats = [] 

@staticmethod 
def from_db(document): 
    model = User() 
    model.name = document.get("name") 

    hats = document.get("hats", list()) 
    from document in hats: 
     hat = Hat.from_db(document) 
     model.hats.append(hat) 
    return model 

問題是我直接在模型上定義了屬性,而不是在init函數中設置。

也就是說

class User(ModelBase): 
    name = None 
    hats = [] 

,而不是

class User(ModelBase): 
    def __init__(self): 
     self.name = None 
     self.hats = [] 

我還以爲他們是等價的,但它似乎變量時,直接它們是靜態變量的所有實例之間共享類集合類。所以當我爲一個User對象添加一個Hat到列表中時,下一個User對象已經將該Hat添加到列表中並添加了另一個。

相關問題