在 mongo 中插入 doc 时 E11000 重复键错误收集

Posted

技术标签:

【中文标题】在 mongo 中插入 doc 时 E11000 重复键错误收集【英文标题】:E11000 duplicate key error collection when insert doc in mongo 【发布时间】:2021-06-04 12:33:42 【问题描述】:
 var doc = new BsonDocument();
  documentRepository.AddDocument(doc, "myCollection").GetAwaiter().GetResult();
  
  public async Task<string> AddDocument(BsonDocument item, string collection)
  
     await _database.GetCollection<BsonDocument>(collection).InsertOneAsync(item);
     return item["_id"].ToString(); // this is where exception happens
       

E11000 重复键错误集合:myApp.myCollection 索引: id dup key: _id: ObjectId('12381e2b09f14f0001fead43') MongoDB.Driver.MongoWriteException: 写入操作导致 错误。

E11000 duplicate key error collection: myApp.myCollection index: _id_ dup key:  _id: ObjectId('12381e2b09f14f0001fead43') 
    ---> MongoDB.Driver.MongoBulkWriteException`1[MongoDB.Bson.BsonDocument]: A bulk write operation resulted in one or more errors.
    
    E11000 duplicate key error collection: myApp.myCollection index: _id_ dup key:  _id: ObjectId('12381e2b09f14f0001fead43') 
    at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
    at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
    at MongoDB.Driver.MongoCollectionBase`1.InsertOneAsync(TDocument document, InsertOneOptions options, Func`3 bulkWriteAsync)

混乱来自异常消息说我正在尝试执行批量插入这一事实

MongoDB.Driver.MongoBulkWriteException`1[MongoDB.Bson.BsonDocument]

我是否只插入一个文档,如您所见

【问题讨论】:

这是实际的 ObjectId 吗? 是的,它是..... 【参考方案1】:

发生此异常是因为您试图在您的集合中拥有重复的 _id 值(您可以使用 mongo shell 检查这一点)。上面的代码本身并不能触发这个错误,但是如果你调用AddDocument两次或更多次就会出现这个错误。请注意,在第一次 AddDocument 调用后,item 文档将填充 _id 值,因此在下次尝试使用此对象时,驱动程序将尝试插入具有重复值的文档

【讨论】:

其实这是有道理的,但我没有看到我如何再次插入此文档。 那么,AddDocument这个方法只被调用一次? 如果是这样,您可以创建一个小型控制台应用程序并在那里检查它。我不相信有任何其他方法可以使这个错误 I'm trying to perform bulk insertion/whether I'm inserting only one doc as you can see 所有的 crud 操作都是通过内部批量完成的 我不知道所有的 crud 操作都是通过内部批量完成的。谢谢。我将尝试使用小型控制台应用程序插入示例

以上是关于在 mongo 中插入 doc 时 E11000 重复键错误收集的主要内容,如果未能解决你的问题,请参考以下文章

使用空数组添加新用户记录时出现“E11000 重复键错误收集”

临时表异常 - e11000 重复键错误

Node.js MongoError: E11000 重复键错误集合:

NodeJS/Mongo:通过各种集合循环查询

Mongoose 在使用 .save() 方法更新文档时抛出 E11000 重复键错误

使用 Promise.all 避免唯一错误 E11000