Перемешал идентификаторы в mongodb - PullRequest
0 голосов
/ 13 марта 2012

У нас около 20 миллионов записей в нашем mongodb.В моей коллекции «posts» есть поле с именем «id», которое должно было быть уникальным, но теперь оно испортилось.Мы просто хотим, чтобы он был уникальным, и сейчас есть много дубликатов.

Мы просто хотели сделать что-то вроде перебора каждого reocrd и присвоения ему уникального идентификатора в цикле от 1 до 20 миллионов.

Какой самый простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Здесь не так много вариантов.

  1. Выберите ваш язык и драйвер на ваш выбор.

  2. Получить N документов.

  3. Назначьте им уникальные идентификаторы (несколько вариантов здесь: 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);

Do not Используйте skip здесь. Это будет слишком медленно.

И, конечно, вы всегда можете обрезать коллекцию, создать уникальный индекс для id и заполнить его снова.

1 голос
/ 13 марта 2012

Вы можете использовать простой скрипт вроде этого:

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

external-while, выбирая 1000 строк как времяи предотвращает таймауты курсора;внутреннее время присваивает каждой строке новый инкрементный идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...