2012-03-13 88 views
0

我們已經在我們的MongoDB約20萬條記錄。在我的名爲'posts'的集合中,有一個名爲'id'的字段,它應該是獨一無二的,但現在它已經全部搞砸了。我們只是希望它是獨一無二的,現在有很多很多重複的東西。混亂了IDS MongoDB中

我們只是想做一些事情,比如迭代每個reocrd,並在1到2000萬的循環中爲它分配一個唯一的id。

什麼是做到這一點的最簡單的方法?

+0

你沒有關於它的唯一索引?那麼_id領域呢? – 2012-03-13 11:46:32

+0

@Sergio Tulentsev - _id未觸及。我只是在id字段上創建了一個索引,但是在id被搞砸之後。我對mongo很陌生 – 2012-03-13 11:50:56

+0

你想用重複的id值做什麼? – 2012-03-13 11:52:42

回答

1

您可以使用一個簡單的腳本是這樣的:

db.posts.dropIndex("*id index name here*"); // Drop Unique index 

counter = 0; 

page = 1; 
slice = 1000; 

total = db.posts.count(); 
conditions = {}; 

while (counter < total) { 

    cursor = db.posts.find(conditions, {_id: true}).sort({_id: 1}).limit(slice); 

    while (cursor.hasNext()) { 
     row = cursor.next(); 
     db.posts.update({_id: row._id}, {$set: {id: ++counter}}); 
    } 

    conditions['_id'] = {$gt: row._id}; 
    print("Processed " + counter + " rows"); 
} 

print('Adding id index'); 
db.posts.ensureIndex({id: 1}, {unique: true, background: false}); 

print("done");     

保存到assignids.js,並運行作爲

$ mongo dbname assignids.js 

外,同時選擇1000行的時間,並防止光標超時;內部爲每個行分配一個新的增量ID。

+0

我現在正在運行腳本..它可能需要大約6個小時,但我有時間。另一方面,劇本不會像你說的那樣運行。也許我們需要在腳本中包含'use db'命令。無論如何,我只是複製並粘貼您的腳本的命令行上,我做了「使用DB」命令,現在 – 2012-03-13 14:13:24

+0

其工作是你忘了「DBNAME」 ARG後?當你在cli上連接到mongo時,它會告訴你它連接的數據庫 - 默認情況下它是測試。 6小時聽起來很慢。像一個數量級緩慢 - 耐心:) – AD7six 2012-03-13 14:55:07

+0

是的,我沒有忘記數據庫名稱。抱歉。 – 2012-03-13 15:03:18

2

不會有很多選擇這裏,真的。

  1. 選擇您的語言和選擇的驅動程序。

  2. 取N個文件。

  3. 爲它們分配唯一的ID(這裏有幾個選項:1)copy _id; 2)分配新的ObjectID; 3)分配普通整數)

  4. 保存這些文件。

  5. 取下N個文件。轉到步驟3

爲了獲取下N個文檔,你應該注意最後處理文檔的_id和做到這一點:

db.collection.find({_id: {$gt: last_processed_id}}).sort({_id: 1}).limit(N); 

使用跳過這裏。它會太慢。

而且,當然,您始終可以截斷集合,在id上創建唯一索引並重新填充它。

+0

我如何在循環中獲取n個文檔?我沒有一個ID來取勝。我想我會使用_id?但是,我又怎麼做限制呢? – 2012-03-13 12:04:24

+0

@ImranOmarBukhsh:更新了答案 – 2012-03-13 12:08:28

+0

做我不需要排序? – 2012-03-13 12:43:06