2012-04-30 105 views

回答

3

您可以在整個架構上運行更新,刪除字段或添加字段並將其設置爲計算值(如果這就是您所得到的)。

假設您有一個X字段,並要添加應被設置爲x/2 AY場,你可以做這樣的事情:

PRIMARY> db.test.insert({x:15}); 
PRIMARY> db.test.insert({x:30}); 
PRIMARY> db.test.insert({x:50}); 
PRIMARY> db.test.find(); 
{ "_id" : ObjectId("4f9df1ebed2b924eedb8cad9"), "x" : 15 } 
{ "_id" : ObjectId("4f9df1eeed2b924eedb8cada"), "x" : 30 } 
{ "_id" : ObjectId("4f9df1f1ed2b924eedb8cadb"), "x" : 50 } 
PRIMARY> db.test.find().forEach(function(doc) { 
      doc.y = doc.x/2; 
      db.test.save(doc); 
     }); 
PRIMARY> db.test.find(); 
{ "_id" : ObjectId("4f9df1ebed2b924eedb8cad9"), "x" : 15, "y" : 7.5 } 
{ "_id" : ObjectId("4f9df1eeed2b924eedb8cada"), "x" : 30, "y" : 15 } 
{ "_id" : ObjectId("4f9df1f1ed2b924eedb8cadb"), "x" : 50, "y" : 25 } 
+0

有時候,這是不是讓你的應用程序代碼檢查更容易對於缺失值(這就是我想要的)。 –

+0

感謝您的回答。但這就像將所有數據遷移到新的模式。我們有兩個每週發行版,我們支持許多金融產品。由於新功能,這些產品的架構經常發生變化。如果您有超過百萬條記錄來修改每個版本,我認爲這會是一個問題。你有沒有遇到過這樣的問題? – Jany

+0

你關心那些舊記錄的數據嗎?如果是這樣,你可能想要這樣做。如果您不關心這些字段中的數據,則可以讓代碼檢查其存在情況(並且在將數據帶到應用程序時懶惰地忽略缺少這些值的記錄,或者應用計算值或默認值)。你有具體的例子嗎? –