2014-07-19 47 views
1

蒙戈返回上一個upserts寫結果:MongoDB的:獲取UPSERT結果pymongo

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

有什麼辦法,我可以從pymongo訪問這些領域?我需要這樣做,因爲更新始終在pymongo中不返回任何內容,我想知道我正在查詢的文檔是否已被修改,或者即使沒有執行其他查詢也存在。你能告訴我如何做到這一點嗎?

P.S.我知道這已經被問過,但幾年前,我能在谷歌找到的所有東西都沒有包含一個例子。

既然我們在這裏,有沒有辦法從upsert的結果中獲取文檔中的字段? (或者至少是_id)

解決方案:正如Neil Lunn所說,如果您希望從更新中發生的更多數據中獲得更多數據,Bulk API就是您的選擇。我只想指出這個API的快速walkthrough

+0

哪個版本的MongoDB? PyMongo的哪個版本?哪個客戶端類(Connection/MongoClient)? –

+0

@JoachimIsaksson如所示的WriteResult來自批量操作API的MongoDB 2.6實現。當shell連接到支持這個的實例時,shell中的所有方法都會嘗試使用這個「引擎蓋下」。在前兩個小版本中,pymongo可以使用批量操作。那些跨越一段合理的時間。 –

回答

3

來自MongoDB 2.6及更高版本的較新的MongoDB shell實現實際上定義了.update().insert()等的shell幫助器方法,在可用的地方使用"Bulk operations API"

因此,基本上在外殼連接到MongoDB 2.6實例或更高版本的情況下,「散裝」方法在「隱藏」下使用。即使他們實際上一次只能處理一個文檔,或者實際上只能發出「一個」更新請求或類似內容。

一般駕駛者界面還沒有趕上這一點,你需要還援引明確:

bulk = db.test.initialize_ordered_bulk_op() 

bulk.find({}).upsert().update({ "$set" { "this": "that" } } 

result = bulk.execute() 

的「結果」回到這裏的「批量寫結果」說明你在shell看到相匹配,這與標準驅動程序方法中當前使用的「傳統」實現的返回方式不同。

+0

感謝您指引我朝着正確的方向,以及在過去幾天對我的其他問題的所有幫助。 – thehousedude