Удаление повторяющихся записей в MongoDB

Прошу помощи.

Есть 50 миллионов записей в MongoDB, есть уникальное поле, но не выставлен индекс уникальности. Как мне разом удалить повторяющиеся записи, поделитель коммандой или каким-либо решением.

Использую RockMongo, там есть удалить дубликаты, но на таких объемах это критично. Нужно как-то напрямую к монге это провернуть.
  • Вопрос задан
  • 5792 просмотра
Пригласить эксперта
Ответы на вопрос 4
mr_null
@mr_null Автор вопроса
Не удалось. Похоже это годится до 1 мл.н записей, ошибка
too many dups on index build with dropDups=true

Вопрос открыт, вычитал что некоторые копируют все записи в новую коллекцию с уникальным полем. Но это не совсем вариант моей проблемы.

С таким же успехом я могу написать скрипт, который делает выборку и проходит поиском встречается ли еще уник поле, если нет то удаляет эту запись.
Ответ написан
Комментировать
@lega
Это едино-разовая задача, поэтому можно любым способом.
Например можно сделать
1) mongodump
2) drop коллекции
3) Сделать uniq индекс
4) mongorestore
Ответ написан
Комментировать
promsoft
@promsoft
Да, при создании чистой восстановит только уникальные. См. обсуждение

Можно еще скриптом удалить дубли, но забэкапить будет быстрее. Я на 10 миллионах пробовал. На Питоне это было так

from pymongo import MongoClient

connection = MongoClient('localhost', 27017)

db = connection.mydb

table = db.mytable
for doc in table.find():
  idx = doc['_id']
  qw = doc['qw']
  table.remove({'qw' : qw, '_id' : {'$ne':idx}})


И шло очень медленно (индекса-то нет)

А вот удаление агрегацией (примерно так) прошло меньше чем за минуту

db.table.aggregate([{$group:{'_id':'$qw'}}, {$out:'newtable'}], {allowDiskUse:true})
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы