Получение "err": "Ошибка повторения ключа E11000 при вставке в монго с использованием драйвера Java
Исключение в потоке "main" com.mongb.MongoException $DuplicateKey: { "serverUsed": "localhost/127.0.0.1: 27017", "err": "E11000 duplicate ключевой индекс ошибки: twitterdb03.LevelAFollowers. $id dup key: {: ObjectId ('52d5636de408652b4853a8fe')}", "code": 11000, "n": 0, "connectionId": 12, "ok": 1.0}
Я использую mongo 2.11.1
Никогда не было проблем с простыми операциями записи в java
myMap.put(inid, followersList);
myObj.putAll(myMap);
myIdMapCollection.insert(myObj);
Ответы
Ответ 1
Я нашел ответ на этой странице. Я предполагаю, что ваш код выглядит примерно так (очень упрощен)?:
doc = {}
for i in xrange(2):
doc['i'] = i
collection.insert(doc)
Проблема заключается в том, что PyMongo вводит в документ поле _id, если поле _id
не существует, перед его вставкой (_id
всегда создается клиентской стороной с драйверами 10gen). Это означает, что первый раз через цикл _id
добавляется методом вставки. Поскольку doc
определяется вне цикла, каждый последующий проход через цикл использует то же значение для _id
.
Решение:
for i in xrange(2):
doc['i'] = i
if '_id' in doc:
del doc['_id']
collection.insert(doc)
- Или создайте вручную новую:
from bson.objectid import ObjectId
for i in xrange(2):
doc['i'] = i
doc['_id'] = ObjectId()
collection.insert(doc)
Ответ 2
Попробуйте вызвать myIdMapCollection.save(myObj);
вместо myIdMapCollection.insert(myObj);
Метод save
, в отличие от insert
, имеет значение upsert, то есть если документ содержит _id
, он заменяет этот документ.
Я предполагаю, что вы взяли DBObject
с помощью курсора | запрос, манипулировал им, и вы хотите сохранить изменения. В этом случае save
- правильный способ сделать это.
Итак, при вызове insert
DBObject
уже связан с _id
, вызов insert
таким образом завершается с ошибкой, потому что у вас уже есть документ с этим _id
в коллекции, который должен быть уникальным (дубликат индексная ошибка).