在upsert[解释]过程中出现重复键错误


Duplicate key error during upsert [Explanation]

我在一个类中执行下面的语句。这段代码来自

$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或任何其他网站请分享!

由于您正在进行upsert并在查询中包含_id,因此您不应该在该键上获得任何重复。这让我认为您已经在lock上创建了一个唯一索引,该索引不适用于超过2个文档,因为该字段只有2个值。

如果你没有在锁上设置唯一索引,那么你必须在没有显示的字段上设置唯一索引。这也不起作用,因为在插入时,您的upsert将只设置_idlock,任何其他带有索引的字段将被插入为null。如果其中一个字段有唯一索引,那么只有一个文档可以在该字段中有null。因此,当您尝试为该字段插入另一个null时,您将获得重复键错误。