它看起來像你想要做的是插入一些文件,確保每個不同的'name'字段值只有一個條目。
在MongoDB中有兩種常見的方法可以做到這一點。
首先是在'name'鍵上創建一個唯一索引,並使用'safe'模式進行插入操作。如果以這種方式執行插入操作,則當您嘗試插入重複值時,PHP將引發異常。
// In the mongo shell:
db.test.ensureIndex({name: 1}, {unique:true});
// In PHP:
$data = array('name' => 'Art Pip');
$options = array('safe' => true);
try {
$collection->insert($data, $options);
} catch (Exception $e) {
echo "Insert failed\n";
echo "Error message: ".$e->getMessage()."\n";
echo "Error code: ".$e->getCode()."\n";
}
參考:http://www.php.net/manual/en/mongocollection.insert.php
請注意,如果你在「名稱」查詢,你會想反正有它的指數表現的原因。使其成爲唯一索引基本上不會增加此過程的開銷。
第二種方法是做一個「upsert」。這是一個更新命令,它說:「如果它存在,則更新此文檔,如果它不存在,則創建它」。如果你這樣做插入,你也不會得到任何重複。
// In PHP
$data = array('name' => 'James Cameron');
$criteria = array('name' => 'James Cameron');
$options = array('upsert' => true, 'safe' => true);
try {
$collection->update($criteria, $data, $options);
} catch (Exception $e) {
echo "Insert failed\n";
echo "Error message: ".$e->getMessage()."\n";
echo "Error code: ".$e->getCode()."\n";
}
參考:http://www.php.net/manual/en/mongocollection.update.php
順便說一句 - 沒有什麼阻止你使用都技術。您可以使用'upsert'來獲得速度,並將其作爲額外的檢查。
作爲最後一點,您使用的代碼不會做我認爲您認爲的代碼。
如果您運行下面的代碼:
$actor = array("name" => "James Cameron", "name" => "Arnold Schwarzenegger");
print_r($actor);
你會看到下面的輸出:
Array
(
[name] => Arnold Schwarzenegger
)
這就是你添加相同值的兩倍到同一個文件的問題?或者,您有多個進程可能同時寫入同一個集合的問題? – 2012-07-12 21:28:03
據我所知,由於導演詹姆斯卡梅隆的不同步沒有時間在數據庫中進行檢查,進入演員詹姆斯卡梅隆。在進程sleep(1)之間插入? – 2012-07-13 05:49:22