我正在课堂上执行以下语句。此代码来自
$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或任何其他网站上,请分享!
提前致谢。
答案 0 :(得分:1)
由于您正在进行upsert并在查询中包含_id
,因此您不应该在该密钥上获得任何重复项。这使我认为您已在lock
上创建了一个唯一索引,该索引不适用于超过2个文档,因为该字段只有2个值。
如果您没有在锁上添加唯一索引,那么您必须在此处未显示的字段上具有唯一索引。这不会起作用,因为在插入时,您的upsert将仅设置_id
和lock
,具有索引的任何其他字段将作为null
插入。如果其中一个字段具有唯一索引,则该字段中只有一个文档可以包含null
。因此,当您尝试为该字段插入另一个null
时,您将收到重复的密钥错误。