有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);}
添加所有导演。 检查数据库中是否有人,如果没有,则添加。 由于增加了一个异步,那么导演还没有被添加,并且添加了一个演员,第二次添加了。 詹姆斯卡梅隆第二次加入基地。
答案 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
)