Как переиндексировать индекс Mongo по умолчанию?

Что ж, я исправляю коллекцию MongoDB, в которой 100 миллионов записей. предыдущий разработчик перезаписал _id по умолчанию чем-то действительно неправильным. Теперь, когда я это исправлю, как я могу восстановить индекс _id? Кроме mongoRestore, есть ли более быстрый способ?


вот моя процедура обновления:

1) скопировать базу данных из исходной БД в другую БД.

2) удалить _id для всех записей.

3) перегенерировать _id для всех записей (это то, что я не знаю, как это сделать)

4) Скопируйте коллекцию обратно в исходную БД с новым _id (или другим способом сделайте mongoDump из новой/временной БД, затем отправьте файл в исходную БД, MongoRestore т.е. (тогда каждая запись будет иметь новый _id . Это способ будет работать, но кажется медленнее.)


person murvinlai    schedule 17.07.2012    source источник
comment
почему вы думаете, что вам нужно регенерировать?   -  person Karoly Horvath    schedule 18.07.2012
comment
Ну ... потому что _id был перезаписан неправильным значением хеш-функции, что вызвало конфликт. Итак, мне нужно удалить старый. а затем восстановите его по умолчанию в Mongo.   -  person murvinlai    schedule 18.07.2012
comment
Как вы восстанавливаете значения _id? Если вы читаете каждый документ, а затем обновляете _id, вам не нужно перестраивать индекс. Если вы хотите восстановить значение из резервной копии, то, как вы можете это сделать, зависит от того, как была сделана ваша резервная копия.   -  person William Z    schedule 18.07.2012
comment
это то, что я хочу знать. Как восстановить значение _id, сгенерированное Mongo по умолчанию. Вот мой шаг. (см. выше)   -  person murvinlai    schedule 18.07.2012


Ответы (1)


Значение MongoDB '_id' по умолчанию генерируется драйвером MongoDB на стороне клиента при первой вставке документа. Он генерируется с использованием текущего времени, имени хоста компьютера, на котором работает клиент, идентификатора процесса клиента и возрастающего значения, используемого для различения нескольких операций одного и того же процесса.

Подробности см. на странице http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

В результате у вас нет возможности восстановить исходное значение '_id' MongoDB по умолчанию, если только вы не сохранили всю информацию, упомянутую выше, в виде записей в вашем документе.

Кроме того, поле _id неизменяемое — его нельзя изменить. Я не уверен, как предыдущий разработчик вообще перезаписал поле _id — скорее всего, он извлек документ, изменил значение поля _id, удалил старое и вставил новое.

Если содержимое ваших документов, кроме поля «_id», не изменилось с тех пор, как вы выполнили «mongodump», то самым быстрым способом вернуть данные будет восстановление этого файла дампа.

Если содержимое ваших документов изменилось, и вы хотите сохранить изменения, вам нужно будет сделать то же самое, что и предыдущий разработчик, в обратном порядке: получить каждый документ в коллекции, использовать возможности собственного драйвера для создания нового документа. ObjectID, удалите старый документ и сохраните данные как новый документ с новым _id.

person William Z    schedule 18.07.2012