同步写MongoDB

时间:2012-07-12 21:06:01

标签: php mongodb insert

有2个数组。

$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);}

添加所有导演。 检查数据库中是否有人,如果没有,则添加。 由于增加了一个异步,那么导演还没有被添加,并且添加了一个演员,第二次添加了。 詹姆斯卡梅隆第二次加入基地。

1 个答案:

答案 0 :(得分: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
)