При выполнении нагрузочных тестов я иногда сталкиваюсь с ситуацией, когда этот код (упрощенный):
var person = Persons.findOne();
if(person == null){
Persons.insert(newDocument);
}
выдает ошибку, потому что операция вставки конфликтует с существующим документом - хотя я только что проверил, что с помощью findOne(). Оболочка Mongo показывает документ при приостановке перед вставкой().
Ошибка:
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 }
Это пахнет условием гонки, и я пытаюсь найти правильный способ решить это:
Проблема с этими методами заключается в том, что 1 + 2 заменяет только некоторые поля, и я хочу заменить весь документ, а метод 3 заменяет весь документ, но _id конфликтует.
(Если применимо, я использую официальный драйвер С# версии 1.9.2.235)
Ценю вашу помощь.
Хорошо, если я правильно понимаю, вы хотите сделать следующее:
Ваш код попадает в двойную ключевую ошибку по той причине, по которой вы думаете, что она делает - другой поток вставляет тот же UniquePersonId между findOne
и insert
. Это хорошо - ошибка просто сообщает код, что какой-то другой процесс уже проделал свою работу. Уникальная ошибка нарушения индекса не является ошибкой в плохом смысле, что что-то не работает правильно. Это просто означает, что ваша операция недействительна из-за уникального ограничения, которое вы наложили. Я думаю (не зная больше о контексте этого), что вы можете запустить вставку и просто проглатывать уникальную ошибку индекса, если она встречается.