スレッド "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);
私は答えを見つけました このページで 。あなたのコードは次のようになっていると思います(非常に単純化されています)?:
doc = {}
for i in xrange(2):
doc['i'] = i
collection.insert(doc)
問題は、PyMongoがドキュメントに_idフィールドを挿入することです_id
フィールドが存在しない場合、挿入する前に(_id
は常にクライアント側で生成されます) 10genドライバー)。これは、ループを最初に通過するときに_id
がinsertメソッドによって追加されることを意味します。 doc
はループの外側で定義されているため、ループを通過する後続の各パスは、_id
にsame値を使用します。
解決:
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)
myIdMapCollection.save(myObj);
の代わりにmyIdMapCollection.insert(myObj);
を呼び出してみてください
save
メソッドは、insert
とは異なり、アップサートを実行します。つまり、ドキュメントに_id
が含まれている場合、そのドキュメントが置き換えられます。
私の推測では、カーソルを使用してDBObject
をフェッチしたと思います|クエリを実行し、それを操作していて、変更を永続化する必要があります。その場合、save
が正しい方法です。
したがって、insert
を呼び出すとDBObject
はすでに_id
に関連付けられているため、insert
を呼び出すと失敗します。これは、その_id
を含むドキュメントがすでにあるためです。コレクション内で、一意である必要があります(重複インデックスエラー)。