2013-09-25 143 views
0

在我的程序中,通過更新(key,doc,upsert = true)寫入mongodb的十個過程mongodb更新(使用upsert = true)不更新存在數據,插入新數據?

「key」是mongodb索引,但不是唯一的。

查詢= { 'hotelid':hotelid, 「arrivedate」:arrivedate, 「leavedate」:leavedate}

其中= 「數據%S。」 %的SourceID
data_value_where = {其中:value}
self.collection.update(查詢,{ '$集':data_value_where},真)

「查詢」 的id不是唯一的指標

我發現有時更新不更新存在數據,但創建新數據。

我爲update方法返回一個日誌,返回值爲「{u'ok':1.0,u'err':None,u'upserted':ObjectId('5245378b4b184fbbbea3f790'),u'singleShard':u 'rs1/192.168.0.21:10000,192.168.1.191:10000,192.168.1.192:10000,192.168.1.41:10000,192.168.1.113:10000',u'connectionId':1894107,u'n':1,u'我更改了更新方法(query,{'$ set':data_value_where},upsert = True,safe = True),但是三個沒有改變對於這個問題。

+3

誰降低了某人試圖提出一個合法的問題,但顯然有限的英語打字技巧?真丟臉。爲什麼不幫助句容重寫它,因此它更容易理解? –

+0

@DanGayle謝謝 – chjuheng

+0

我修改了這個問題,並在上​​面寫了一些日誌。感謝所有的重播。 – chjuheng

回答

0

你可以稱之爲「線程安全」,因爲更新本身不是在Python中完成的,而是在mongodb中,它是爲一次處理多個請求而構建的。

總而言之:您可以安全地做到這一點。

+0

Uninformed answeres:MongoDB寫入被序列化。 –

+0

我在我的程序中發現,同時寫入相同的數據,使用相同的密鑰,並創建重複的文檔,所以我不知道發生了什麼。 – chjuheng

0

由於您使用的操作符,您不會因爲重複的文檔而結束。你實際上使用一個原子操作符來更新。

原子(不要與SQL中的所有或全部原子操作相混淆)操作按順序完成,因此每個進程永遠不會拿起陳舊的文檔或被允許將兩個id寫入同一個數組,因爲每個文檔都是$set操作拾取將會產生最後的$set的結果。

事實上,您獲取重複文檔最有可能意味着您的代碼中存在錯誤。

+0

如果更新未命中索引,是否會插入日期? – chjuheng

+0

@chjuheng如果索引沒有被觸發(其中我沒有看到發生在這個更新中的事件,那麼你會顯示),那麼不,不應該插入日期 – Sammaye