Ошибка повторяющегося ключа во время upsert [Объяснение] - PullRequest
3 голосов
/ 30 ноября 2011

Я выполняю приведенную ниже инструкцию в классе.Этот код взят из

$query  = array('_id' => $id, 'lock' => 0);
$update = array('$set' => array('lock' => 1));
$options = array('safe' => true, 'upsert' => true);
$result = $this->_mongo->update($query, $update, $options);

if ($result['ok'] == 1) {
    return true; 
}

Однако я не понимаю, как получить ошибку дублированного ключа.Может кто-нибудь объяснить возможные сценарии и вероятность того, что я получу эту ошибку?

Я тщательно изучал эту проблему, нигде не могу найти свой ответ.Так что, если это на SO или любом другом сайте, пожалуйста, поделитесь!

Заранее спасибо.

1 Ответ

1 голос
/ 01 декабря 2011

Поскольку вы выполняете upsert и включаете _id в свой запрос, вы не должны получать никаких дубликатов для этого ключа.Это заставляет меня думать, что вы создали уникальный индекс для lock, который не будет работать для более чем 2 документов, потому что у вас есть только 2 значения для этого поля.

Если вы этого не сделалипоместите уникальный индекс на блокировку, тогда у вас должен быть уникальный индекс для поля, которое вы здесь не показываете.Это тоже не сработает, потому что при вставке ваш upsert будет устанавливать только _id и lock, любое другое поле с индексом будет вставлено как null.Если одно из этих полей имеет уникальный индекс, то только один документ может иметь null в этом поле.Поэтому, когда вы попытаетесь вставить еще одно null для этого поля, вы получите ошибку дублированного ключа.

...