2016-04-05 15 views
1

我是MongoDB的初學者,我有一個文件是這樣的:關於MongoDB的:原子獲取和設置

{ 
    "_id": "abc", 
    "names": { 
     "1" : "name1", 
     "2" : "name2", 
     "3" : "name3" 
    } 
} 

我想用多線程加載「NAME4」,「NAME5」,「nameX」 .. 。以 「名」

我的方式:

  • 第一步:讓所有的名字
  • 第二步:添加 'nameN' 爲名稱(姓名[N] = 'nameN')
  • 第3步:設置新名稱

我知道這不是原子-_-!所以我的問題是如何使其原子?

我的另一種方式: 添加一個「版本」字段來記錄,得到的結果時,記錄「版本」,然後用像「版本」設置「名稱」:

update_one({"_id": "abc", "version": currentVersion}, {$set: {"names": newNames}}) 

如果它與'版本'不匹配,更新失敗,新的'nameN'不會添加到文檔中。我希望它隨時獲得成功。

有人可以幫助我嗎?謝謝

+0

'names'是一個對象不是數組。所以你不能'名字[n] ='nameN' –

+0

@Siddharth Ajmera謝謝你,我使用pymongo客戶端 – yangbinnnn

回答

2

MongoDB只保證文檔級的事務。

對於您的要求,您必須使用線程同步來確保應用程序級別的原子性。