1

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

添加所有董事。检查数据库中是否有人,如果没有,然后添加。既然加了一个异步,那么导演还没有加,又加了一个演员,又加了2次。詹姆斯卡梅隆第二次被添加到基地。

4

1 回答 1

2

看起来您想要做的是插入许多文档,确保“名称”字段的每个不同值只有一个条目。

在 MongoDB 中有两种常见的方法可以做到这一点。

第一个是在“名称”键上创建唯一索引并使用“安全”模式进行插入。如果您以这种方式进行插入,当您尝试插入重复值时,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-16T18:37:44.527 回答