Вставка MongoDB повышает повторяемость ключа

При попытке сделать объемную вставку в пустую коллекцию mongodb возникает следующая ошибка.

pymongo.errors.DuplicateKeyError: E11000 повторяющийся индекс ошибок ключа: cmdDistros.locDistro. $ id dup key: {: ObjectId ('51dac9d0c74cd81acd85c0fd')}

Я не указываю _id, когда я создаю любой из документов, поэтому mongodb должен создать уникальный индекс правильно? Вот код, который я использовал:

#Populate database with uniform distribution entries = [] for coor in freeIndices: for theta in range(360): entry = {"x" : coor[0], "y" : coor[1], "heading" : theta} for i in range(numData): entry["data" + str(i)] = 1./numData entries.append(entry) print "Entries created, loading into database..." locDistro.insert(entries) 

Принимая судьбу из рук mongoDB, я попытался создать свой собственный индекс, используя:

 #Populate database with uniform distribution entries = [] idNum = 0 for coor in freeIndices: for theta in range(360): print idNum entry = {"_id" : idNum, "x" : coor[0], "y" : coor[1], "heading" : theta} idNum += 1 for i in range(numData): entry["data" + str(i)] = 1./numData entries.append(entry) print "Entries created, loading into database..." locDistro.insert(entries, manipulate = False) 

Заявление о печати показывало каждый idnum, поскольку документы были созданы, и все они были уникальными и увеличивались так же, как ожидалось. Однако при вставке я получил ошибку:

pymongo.errors.DuplicateKeyError: E11000 дубликат ключевой индекс ошибки: cmdDistros.locDistro. $ id dup key: {: 0}

и только один документ был вставлен в мою базу данных.

Я полностью в тупике, у каждого есть ответ, почему это может произойти?

Вам нужно понять, что в вашем списке записей есть куча ссылок на одну запись dict. Поэтому, когда PyMongo устанавливает записи [0] ['_ id'], все остальные записи получают один и тот же _id. (На самом деле PyMongo будет перебирать список, задавая каждый элемент _id каждой записи, поэтому все записи будут иметь окончательный _id в конце.) Быстрое исправление:

 entries.append(entry.copy()) 

Это всего лишь мелкая копия, но в коде, который вы поделили, я считаю, что этого достаточно, чтобы исправить вашу проблему.

Удалить ключ _id

 for i in xrange(2): doc['i'] = i if '_id' in doc: **del doc['_id']** collection.insert(doc) 

* Или создать вручную ew onea n: Задать вопрос

 from bson.objectid import ObjectId* for i in xrange(2): doc['i'] = i doc['_id'] = ObjectId() collection.insert(doc) 

Получение «err»: «Ошибка повторения ключа E11000 при вставке в монго с использованием драйвера Java