Получение "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.

Решение:

  • Удалить ключ _id
for i in xrange(2): 
    doc['i'] = i 
    if '_id' in doc: 
        del doc['_id'] 
    collection.insert(doc)
  1. Или создайте вручную новую:
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 в коллекции, который должен быть уникальным (дубликат индексная ошибка).