web-dev-qa-db-ja.com

「err」の取得:「Javaドライバーを使用してmongoに挿入すると、E11000重複キーエラーが発生します

スレッド "main"の例外com.mongodb.MongoException $ DuplicateKey:{"serverUsed": "localhost/127.0.0.1:27017"、 "err": "E11000重複キーエラーインデックス:twitterdb03.LevelAFollowers。$ id dup key:{:ObjectId( '52d5636de408652b4853a8fe')} "、" code ":11000、" n ":0、" connectionId ":12、" ok ":1.0}

私はmongo2.11.1を使用しています

Javaでの単純な書き込み操作で問題が発生したことはありません

myMap.put(inid, followersList);
myObj.putAll(myMap);
myIdMapCollection.insert(myObj);
11
Nautilus_o

私は答えを見つけました このページで 。あなたのコードは次のようになっていると思います(非常に単純化されています)?:

doc = {} 
for i in xrange(2): 
    doc['i'] = i 
    collection.insert(doc) 

問題は、PyMongoがドキュメントに_idフィールドを挿入することです_idフィールドが存在しない場合、挿入する前に(_idは常にクライアント側で生成されます) 10genドライバー)。これは、ループを最初に通過するときに_idがinsertメソッドによって追加されることを意味します。 docはループの外側で定義されているため、ループを通過する後続の各パスは、_idsame値を使用します。

解決:

  1. キー_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)
23
Florian

myIdMapCollection.save(myObj);の代わりにmyIdMapCollection.insert(myObj);を呼び出してみてください

saveメソッドは、insertとは異なり、アップサートを実行します。つまり、ドキュメントに_idが含まれている場合、そのドキュメントが置き換えられます。

私の推測では、カーソルを使用してDBObjectをフェッチしたと思います|クエリを実行し、それを操作していて、変更を永続化する必要があります。その場合、saveが正しい方法です。

したがって、insertを呼び出すとDBObjectはすでに_idに関連付けられているため、insertを呼び出すと失敗します。これは、その_idを含むドキュメントがすでにあるためです。コレクション内で、一意である必要があります(重複インデックスエラー)。

7
Ori Dar