2015-04-03 27 views
1

我需要將數據從一個字段填充到同一個集合中的多個字段。例如: 目前我有類似下面的文檔:對於10億份文檔,使用MongoDB將數據從一個字段填充到同一個集合中的另一個字段

{ _id: 1, temp_data: {temp1: [1,2,3], temp2: "foo bar"} } 

我想填充到兩個不同的領域在同一個集合作爲象下面這樣:

{ _id: 1, temp1: [1,2,3], temp2: "foo bar" } 

我有一頁十億的文件遷移。請給我建議更新所有十億份文件的有效方法?

+2

是的,沒有「在數據庫中」的方式。您必須獲取每個文檔,在應用中更改並保存。 – 2015-04-03 12:39:52

+0

謝謝。 @SergioTulentsev那也是我的計劃。 :-) – Arun 2015-04-07 05:30:51

回答

2

用你喜歡的語言編寫一個貫穿所有文檔的工具,將它們遷移並存儲到一個新的數據庫中。

一些提示:

  • 當迭代的結果,確保它們進行分類(例如,在_id),這樣就可以實現簡歷應該遷移代碼暴跌90%...
  • 待辦事項批插入:讀取1000個項目,遷移它們,然後在單個批處理中將1000個項目寫入新數據庫。讀數會自動分批。
  • 在遷移之後而不是之前創建索引。這將是更快,導致較少的碎片
-1

在這裏,我做了一個查詢你,使用下面的查詢來遷移數據

db.collection.find().forEach(function(myDoc) { 
    db.collection_new.update(
    {_id: myDoc._id}, 
    { 
     $unset: {'temp_data': 1}, 
     $set: { 
      'temp1': myDoc.temp_data.temp1, 
      'temp2': myDoc.temp_data.temp2 
     } 
    }, 
    { upsert: true } 
    ) 
}); 

要了解更多有關的foreach光標,請訪問link

需要$ limit$ skip運營商批量遷移數據。在更新查詢中,我已經使用了upsert,如果已經存在,那麼它會更新,否則插入條目將是新的。

謝謝

+0

$ limit和$ skip?不,他們在聚合框架中。 limit()和skip()非常慢。這與配料有什麼關係?你爲什麼使用插入的插入?爲什麼不簡單地在JavaScript中遷移數據?使用$ set和$ unset需要的寫入次數比第一次寫入時多一倍,並增加了碎片。 – mnemosyn 2015-04-03 12:48:44

+1

'limit'和'skip'爲數十億文件的集合?不,我不這麼認爲:) – 2015-04-07 07:31:40