我們已經在我們的MongoDB約20萬條記錄。在我的名爲'posts'的集合中,有一個名爲'id'的字段,它應該是獨一無二的,但現在它已經全部搞砸了。我們只是希望它是獨一無二的,現在有很多很多重複的東西。混亂了IDS MongoDB中
我們只是想做一些事情,比如迭代每個reocrd,並在1到2000萬的循環中爲它分配一個唯一的id。
什麼是做到這一點的最簡單的方法?
我們已經在我們的MongoDB約20萬條記錄。在我的名爲'posts'的集合中,有一個名爲'id'的字段,它應該是獨一無二的,但現在它已經全部搞砸了。我們只是希望它是獨一無二的,現在有很多很多重複的東西。混亂了IDS MongoDB中
我們只是想做一些事情,比如迭代每個reocrd,並在1到2000萬的循環中爲它分配一個唯一的id。
什麼是做到這一點的最簡單的方法?
您可以使用一個簡單的腳本是這樣的:
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。
我現在正在運行腳本..它可能需要大約6個小時,但我有時間。另一方面,劇本不會像你說的那樣運行。也許我們需要在腳本中包含'use db'命令。無論如何,我只是複製並粘貼您的腳本的命令行上,我做了「使用DB」命令,現在 – 2012-03-13 14:13:24
其工作是你忘了「DBNAME」 ARG後?當你在cli上連接到mongo時,它會告訴你它連接的數據庫 - 默認情況下它是測試。 6小時聽起來很慢。像一個數量級緩慢 - 耐心:) – AD7six 2012-03-13 14:55:07
是的,我沒有忘記數據庫名稱。抱歉。 – 2012-03-13 15:03:18
不會有很多選擇這裏,真的。
選擇您的語言和選擇的驅動程序。
取N個文件。
爲它們分配唯一的ID(這裏有幾個選項:1)copy _id; 2)分配新的ObjectID; 3)分配普通整數)
保存這些文件。
取下N個文件。轉到步驟3
爲了獲取下N個文檔,你應該注意最後處理文檔的_id和做到這一點:
db.collection.find({_id: {$gt: last_processed_id}}).sort({_id: 1}).limit(N);
做不使用跳過這裏。它會太慢。
而且,當然,您始終可以截斷集合,在id
上創建唯一索引並重新填充它。
我如何在循環中獲取n個文檔?我沒有一個ID來取勝。我想我會使用_id?但是,我又怎麼做限制呢? – 2012-03-13 12:04:24
@ImranOmarBukhsh:更新了答案 – 2012-03-13 12:08:28
做我不需要排序? – 2012-03-13 12:43:06
你沒有關於它的唯一索引?那麼_id領域呢? – 2012-03-13 11:46:32
@Sergio Tulentsev - _id未觸及。我只是在id字段上創建了一個索引,但是在id被搞砸之後。我對mongo很陌生 – 2012-03-13 11:50:56
你想用重複的id值做什麼? – 2012-03-13 11:52:42