2011-11-30 38 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時,您將會看到重複的鍵錯誤。