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

3

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

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

提前致谢。


你解决了这个问题了吗,Jesse? - Tyler Brock
1个回答

1

由于您正在执行upsert并在查询中包含_id,因此您不应该在该键上获得任何重复项。这使我认为您已经在lock上创建了唯一索引,但是对于超过2个文档,这种方法将无法工作,因为该字段仅有2个值。

如果您没有在lock上放置唯一索引,则必须在此处未显示的字段上具有唯一索引。这也行不通,因为在插入时,您的upsert将仅设置_idlock,任何其他带有索引的字段都将被插入为null。如果其中一个字段具有唯一索引,则只能有一个文档在该字段中具有null。因此,当您尝试为该字段插入另一个null时,将会收到重复键错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接