2012-07-12 60 views
1

有2個數組。同步寫入MongoDB

$director = array("name" => "James Cameron"); 
$cursor = collection("persones")->find(array("name" => "James Cameron"))->limit(1); 
if ($cursor->count(true) == 0) {collection("persones")->insert($director);} 

$actor = array("name" => "James Cameron", "name" => "Arnold Schwarzenegge"); 
$cursor = collection("persones")->find(array("name" => "James Cameron"))->limit(1); 
if ($cursor->count(true) == 0) {collection("persones")->insert($actor);} 

添加所有的董事。 檢查數據庫中是否有人,如果沒有,則添加。 由於添加了異步,導演尚未添加,並添加了演員,第二次添加。 詹姆斯卡梅隆被添加到第二次的基地。

+0

這就是你添加相同值的兩倍到同一個文件的問題?或者,您有多個進程可能同時寫入同一個集合的問題? – 2012-07-12 21:28:03

+0

據我所知,由於導演詹姆斯卡梅隆的不同步沒有時間在數據庫中進行檢查,進入演員詹姆斯卡梅隆。在進程sleep(1)之間插入? – 2012-07-13 05:49:22

回答

2

它看起來像你想要做的是插入一些文件,確保每個不同的'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 
) 
+0

感謝您花時間。 – 2012-07-18 19:52:40