2013-07-08 5 views
4

Je reçois l'erreur suivante lorsque j'essaie de faire un encart en vrac dans un vide mongodb collection.L'insertion MongoDB soulève une erreur de clé en double

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: cmdDistros.locDistro.$id dup key: { : ObjectId('51dac9d0c74cd81acd85c0fd') }

Je ne suis pas un _id quand on spécifie que je crée l'un des documents, donc mongodb devrait créer l'index unique correct? Voici le code je:

#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) 

Prendre le sort des mains de MongoDB, j'ai essayé de créer mon propre index à l'aide:

#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) 

La déclaration d'impression a montré chaque IDNUM que les documents ont été créés, et ils étaient tous uniques et incrémentés comme prévu. Cependant sur l'insertion, j'ai reçu l'erreur:

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: cmdDistros.locDistro.$id dup key: { : 0 }

et un seul document a été inséré dans ma base de données.

Je suis complètement perplexe, quelqu'un a une réponse à la question de savoir pourquoi cela pourrait se produire?

+0

Je ne sais pas ce qui est arrivé, mais le problème a en quelque sorte réussi pour se réparer ... J'ai juste couru le code encore et encore et cela a fonctionné ... bizarre .. si quelqu'un a une explication, je voudrais toujours savoir juste au cas où cela se reproduise ... et en passant, les entrées La ligne .append est une faute de frappe, la position réelle est alignée avec la pour ci-dessus. – RoboCop87

+0

Y a-t-il d'autres index définis dans la collection? – WiredPrairie

+0

Aucun. Juste _id. Je voudrais utiliser ensure_index pour créer un index sur x y et heading, mais ils ne sont pas uniques donc je ne suis pas sûr que cela fonctionne. Indépendamment, seul _id est indexé à ce stade. – RoboCop87

Répondre

10

Vous devez comprendre que votre liste d'entrées a un tas de références à un entrée dict. Ainsi, lorsque PyMongo définit les entrées [0] ['_ id'], toutes les autres entrées reçoivent le même _id. (En fait, PyMongo itérera la liste définissant la _id de chaque entrée, de sorte que toutes les entrées aura la finale _id à la fin.) Une solution rapide serait:

entries.append(entry.copy()) 

Ceci est simplement une copie superficielle , mais dans le code que vous avez partagé, je crois que c'est suffisant pour résoudre votre problème.

+0

Désolé, je n'ai jamais accepté ça! – RoboCop87

+1

l'entrée est en cours de création sur chaque boucle, comment peuvent-ils pointer sur le même objet? Je pense que ce n'est pas la bonne réponse –

Questions connexes