Ошибка дублирования ID в MongoDB: решение

Что произойдет, если попытаться вставить документ с уже существующим ID в коллекцию? Рассмотрим пример.

Исходные данные

В коллекции уже есть документ. Запрос find подтверждает его наличие.

Попытка вставки дубликата

Попробуем вставить этот же документ в ту же коллекцию. Выполним команду: db.first.insertOne({ /* скопированный документ */ }).

Результат – ошибка с кодом 11000 и сообщением: «duplicate key error collection: myDB.first index: _id». Сообщение указывает, что документ с таким же _id уже существует в коллекции first, и новый документ не был вставлен.

Влияние содержимого документа

Оставим в документе только поле _id и повторим попытку вставки. Результат тот же: ошибка. MongoDB игнорирует всё содержимое документа, кроме уникального ключа _id, сравнивая новый _id с существующими в коллекции. При совпадении возникает ошибка.

Ошибка в MongoDB Native Shell

Выполним ту же команду в MongoDB native shell. Результат: ошибка с кодом, сообщением и объектом, содержащим информацию об ошибке, включая ID документа, вызвавшего ошибку.

Вставка в другую коллекцию

Вставим документ в коллекцию «second», заменив db.first на db.second. Результат – успешная вставка.

Это подтверждает, что _id должен быть уникальным только в пределах одной коллекции. Документы в разных коллекциях и базах данных могут иметь одинаковые _id.

Частые случаи возникновения ошибки

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

Что будем искать? Например,программа