upsert期间重复键错误[说明]

时间:2011-11-30 19:56:00

标签: php mongodb key duplicates upsert

我正在课堂上执行以下语句。此代码来自

$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 个答案:

答案 0 :(得分:1)

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

如果您没有在锁上添加唯一索引,那么您必须在此处未显示的字段上具有唯一索引。这不会起作用,因为在插入时,您的upsert将仅设置_idlock,具有索引的任何其他字段将作为null插入。如果其中一个字段具有唯一索引,则该字段中只有一个文档可以包含null。因此,当您尝试为该字段插入另一个null时,您将收到重复的密钥错误。