看起来您想要做的是插入许多文档,确保“名称”字段的每个不同值只有一个条目。
在 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
)