2016-11-23 167 views
3

我有一個在Ubuntu 14.04上運行的MongoDB 3.2實例。單節點設置。昨天晚上,我進行了遷移,我在集合中跑〜1400個文件驗證碼:

for r in responses: # find cursor with ~1400 documents in it 
    database.responses.update_one({ 
     "_id" : r["_id"] 
    }, { 
     "$set" : { 
      "client_id" : client["_id"] 
     } 
    }) 

遷移後,一些在responses集合在我的響應文件中的字段已經從DateObject類型切換到Int32時間戳表示。部分Int32字段已更改爲Double s。這些字段沒有在我的$set聲明中更新(顯然)。 這隻影響遊標的一小部分(〜75個文檔)。

這造成了災難性的失敗,因爲我們的模型預計這些領域有他們不再擁有的數據類型。有人能向我解釋這裏出了什麼問題嗎?

回答

0

讀你的問題我想知道哪裏出了問題後,我想,如果你已經明確地坐在你的類型,你就不會遇到這個問題,這些記錄的創建/更新,例如: -

for r in responses: # find cursor with ~1400 documents in it 
database.responses.update_one({ 
    "_id" : r["_id"] 
}, { 
    "$set" : { 
     "client_id" : new DateObject(client["_id"]); 
    } 
}) 
+0

'client_id'已經是ObjectId類型,並不是受影響的字段之一,但是謝謝! –

0

我的猜測是你的代碼python中的其他地方已經對類型進行了更改(可能是一些試圖自動推斷類型的代碼!)。

我很確定,在你的「for r in responses:」代碼之前還有一些東西可能試圖檢測字段的類型。是這樣嗎?你能在你提供的代碼片段之前提供代碼嗎?

+0

它可能是Pymongo,我正在使用的MongoDB庫,但它以前從未這樣做過......響應列表中的對象是一個帶有Pymongo結果的遊標對象(BSON dicts) –