2011-11-30 66 views
3

我正在类中执行下面的语句。此代码是从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或任何其他网站上,请分享!

在此先感谢。

+0

你的索引是什么? –

+0

你有没有得到这个解决杰西? –

回答

1

由于您正在做一个upsert并在您的查询中包含_id,因此您不应该在该密钥上获取任何重复项。这让我认为你已经在lock上创建了一个唯一的索引,这对于超过2个文档不起作用,因为这个字段只有2个值。

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