2012-07-17 42 views
1

那麼,我正在修復一個擁有1億條記錄的MongoDB集合。以前的開發人員會用錯誤的東西覆蓋默認的_id。現在,當我修復它時,如何重新生成_id索引?除了mongoRestore,有沒有更快的方法?如何重新索引默認的Mongo索引?


這裏是我的更新過程:

1)從原來的DB花葯DB複製數據庫。

2)刪除所有記錄的_id。

3)再生_id所有記錄(這就是我不知道該怎麼做)

4)複製收集回原籍DB與新_id(或另一種方法是從做mongoDump新/臨時數據庫,然後將文件發送到原始數據庫,MongoRestore ie(然後每個記錄將有新的_id。這種方式將工作,但似乎更慢)。

+0

爲什麼你認爲你必須重新生成? – 2012-07-17 21:28:29

+0

呃..因爲_id被重寫了導致碰撞的重要哈希值。所以,我需要刪除舊的。然後用Mongo的默認方式恢復。 – murvinlai 2012-07-17 21:31:36

+0

你如何恢復_id值?如果您正在閱讀每個文檔,然後更新_id,則不需要重建索引。如果您想恢復到備份中的值,您可以如何做到這一點取決於您的備份是如何進行的。 – 2012-07-17 22:09:52

回答

1

默認的MongoDB'_id'值是由首次插入文檔時客戶端的MongoDB驅動程序,它使用當前時間,客戶端運行的機器的主機名,客戶端的進程ID以及用於區分多個o的增量值生成由相同的過程perations。

有關詳細信息,請參閱http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

其結果是,有沒有辦法爲你,除非你碰巧在儲存了所有的我的文檔上面提到的條目中的信息重構原始默認MongoDB的「_id」值。

另外,'_id'字段是不可變的 - 它不能被改變。我不知道以前的開發人員如何覆蓋_id字段 - 我最好的猜測是他提取了文檔,更改了_id字段的值,刪除了舊字段,並插入了新字段。

如果從'_id'字段以外的文檔內容在您執行'mongodump'後沒有改變,那麼最快的獲取數據的方法是恢復該轉儲文件。

如果您的文檔內容發生了變化,並且想要保留更改,那麼您需要執行與以前的開發者相反的操作:從集合中獲取每個文檔,使用本地驅動程序的設施要創建一個新的ObjectID,請刪除舊文檔並將數據保存爲具有新_id的新文檔。