在进行负载测试时,有时会遇到这种情况,代码如下(简化):
var person = Persons.findOne();
if(person == null){
Persons.insert(newDocument);
}
因为插入操作与现有文档冲突,所以会引发错误 - 即使我使用了findOne()进行检查。在插入操作之前暂停时,Mongo shell 显示文档。
错误信息为:
WriteConcern detected an error ''. (Response was { "ok" : 1, "code" : 11000, "err" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: MainDB.Persons.$Person UniquePersonID dup key: { : \"BOT 878611 141152\" }", "n" : NumberLong(0) }).
唯一索引是:
{ v: 1, name: "Person UniquePersonID", key: { UniquePersonID : 1 }, unique: true, ns: "MainDB.Persons", sparse: true, dropDups: true, background: true }
这似乎是一个竞态条件,并且我正在寻找正确的解决方法:
- 使用$setOnInsert
- 使用带有Upsert标志的findAndModify
- 使用Replace和Upsert的Update
(如相关,我使用官方的C#驱动程序版本1.9.2.235)
感谢您的帮助。