PHP7 MongoDB 使用方法
<p><span class="smtitle"><span class="smtitle">原文链接: </span></span>http://www.zhaokeli.com/article/8574.html</p><div class="smcon">
<h1>MongoDb原生操作</h1>
<h2>Mongodb连接</h2>
<p>PHP7 连接 MongoDB 语法如下:</p>
复制代码
<pre class="php hljs inited">$manager = <span class="hljs-keyword">new MongoDB\Driver\Manager(<span class="hljs-string">"mongodb://localhost:27017");</span></span></pre>
<h2>插入数据</h2>
<p>将 name 为"自学教程" 的数据插入到 test 数据库的 runoob 集合中。</p>
复制代码
<pre class="php hljs inited">$bulk = <span class="hljs-keyword">new MongoDB\Driver\BulkWrite;
$document = [<span class="hljs-string">'_id' => <span class="hljs-keyword">new MongoDB\BSON\ObjectID, <span class="hljs-string">'name' => <span class="hljs-string">'菜鸟教程'];
$_id= $bulk->insert($document);
var_dump($_id);
$manager = <span class="hljs-keyword">new MongoDB\Driver\Manager(<span class="hljs-string">"mongodb://localhost:27017");
$writeConcern = <span class="hljs-keyword">new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, <span class="hljs-number">1000);
$result = $manager->executeBulkWrite(<span class="hljs-string">'test.runoob', $bulk, $writeConcern);</span></span></span></span></span></span></span></span></span></span></pre>
<h2>读取数据</h2>
复制代码
<pre class="php hljs inited">$manager = <span class="hljs-keyword">new MongoDB\Driver\Manager(<span class="hljs-string">"mongodb://localhost:27017");
<span class="hljs-comment">// 插入数据
$bulk = <span class="hljs-keyword">new MongoDB\Driver\BulkWrite;
$bulk->insert([<span class="hljs-string">'x' => <span class="hljs-number">1, <span class="hljs-string">'name'=><span class="hljs-string">'baidu', <span class="hljs-string">'url' => <span class="hljs-string">'http://www.baidu.com']);
$bulk->insert([<span class="hljs-string">'x' => <span class="hljs-number">2, <span class="hljs-string">'name'=><span class="hljs-string">'Google', <span class="hljs-string">'url' => <span class="hljs-string">'http://www.google.com']);
$bulk->insert([<span class="hljs-string">'x' => <span class="hljs-number">3, <span class="hljs-string">'name'=><span class="hljs-string">'taobao', <span class="hljs-string">'url' => <span class="hljs-string">'http://www.taobao.com']);
$manager->executeBulkWrite(<span class="hljs-string">'test.sites', $bulk);
$filter = [<span class="hljs-string">'x' => [<span class="hljs-string">'$gt' => <span class="hljs-number">1]];
$options = [
<span class="hljs-string">'projection' => [<span class="hljs-string">'_id' => <span class="hljs-number">0],
<span class="hljs-string">'sort' => [<span class="hljs-string">'x' => <span class="hljs-number">-1],
];
<span class="hljs-comment">// 查询数据
$query = <span class="hljs-keyword">new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery(<span class="hljs-string">'test.sites', $query);
<span class="hljs-keyword">foreach ($cursor as $document) {
print_r($document);
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h2>更新数据</h2>
复制代码
<pre class="php hljs inited">$bulk = <span class="hljs-keyword">new MongoDB\Driver\BulkWrite;
$bulk->update(
[<span class="hljs-string">'x' => <span class="hljs-number">2],
[<span class="hljs-string">'$set' => [<span class="hljs-string">'name' => <span class="hljs-string">'菜鸟工具', <span class="hljs-string">'url' => <span class="hljs-string">'tool.runoob.com']],
[<span class="hljs-string">'multi' => <span class="hljs-keyword">false, <span class="hljs-string">'upsert' => <span class="hljs-keyword">false]
);
$manager = <span class="hljs-keyword">new MongoDB\Driver\Manager(<span class="hljs-string">"mongodb://localhost:27017");
$writeConcern = <span class="hljs-keyword">new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, <span class="hljs-number">1000);
$result = $manager->executeBulkWrite(<span class="hljs-string">'test.sites', $bulk, $writeConcern);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h2>删除数据</h2>
复制代码
<pre class="php hljs inited">$bulk = <span class="hljs-keyword">new MongoDB\Driver\BulkWrite;
$bulk->delete([<span class="hljs-string">'x' => <span class="hljs-number">1], [<span class="hljs-string">'limit' => <span class="hljs-number">1]); <span class="hljs-comment">// limit 为 1 时,删除第一条匹配数据
$bulk->delete([<span class="hljs-string">'x' => <span class="hljs-number">2], [<span class="hljs-string">'limit' => <span class="hljs-number">0]); <span class="hljs-comment">// limit 为 0 时,删除所有匹配数据
$manager = <span class="hljs-keyword">new MongoDB\Driver\Manager(<span class="hljs-string">"mongodb://localhost:27017");
$writeConcern = <span class="hljs-keyword">new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, <span class="hljs-number">1000);
$result = $manager->executeBulkWrite(<span class="hljs-string">'test.sites', $bulk, $writeConcern);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h1>MongoDB官方操作库</h1>
<p>看完上面的CURD操作是不是感觉有点懵逼,操作方式跟想像中的完全不一样,<img src="http://img.baidu.com/hi/tsj/t_0038.gif">可能官方也想到啦这一块,于是又封装啦一个操作库让大家使用。文档地址如下</p>
<p>https://docs.mongodb.com/php-library/current/tutorial/crud/</p>
<h2>安装</h2>
复制代码
<pre class="bash hljs inited">composer <span class="hljs-keyword">require mongodb/mongodb</span></pre>
<h2>添加数据</h2>
<h3>插入单条数据</h3>
<p>在数据库test中的users集合中插入数据,如果数据库或集合不存在则会自动创建</p>
复制代码
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne([
<span class="hljs-string">'username' => <span class="hljs-string">'admin',
<span class="hljs-string">'email' => <span class="hljs-string">'admin@example.com',
<span class="hljs-string">'name' => <span class="hljs-string">'Admin User',
]);
printf(<span class="hljs-string">"Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());</span></span></span></span></span></span></span></span></pre>
<p>输出结果</p>
<p><img title="image.png" alt="1905281559025619827923.png" data-src="https://res.zkeli.com/uploads/image/2019/05/1905281559025619827923.png"></p>
<p>数据库中数据</p>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559025567787873.png"></p>
<p>可以看出返回$oid为数据库自动分配的唯一标识,如果我们插入的时候传入id值的话,mongodb会判断这个id是否存在,如果存在就会报错,如果不存在则直接返回传入的id值</p>
复制代码
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne([<span class="hljs-string">'_id' => <span class="hljs-number">1, <span class="hljs-string">'name' => <span class="hljs-string">'Alice']);
printf(<span class="hljs-string">"Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());</span></span></span></span></span></span></pre>
<p>执行结果</p>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559025985889303.png"></p>
<h3>插入多条数据</h3>
复制代码
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$insertManyResult = $collection->insertMany([
[
<span class="hljs-string">'username' => <span class="hljs-string">'admin',
<span class="hljs-string">'email' => <span class="hljs-string">'admin@example.com',
<span class="hljs-string">'name' => <span class="hljs-string">'Admin User',
],
[
<span class="hljs-string">'username' => <span class="hljs-string">'test',
<span class="hljs-string">'email' => <span class="hljs-string">'test@example.com',
<span class="hljs-string">'name' => <span class="hljs-string">'Test User',
],]);
printf(<span class="hljs-string">"Inserted %d document(s)\n", $insertManyResult->getInsertedCount());
var_dump($insertManyResult->getInsertedIds());</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559026233129220.png"></p>
<h2>查询数据</h2>
<p>如果要使用id查询,则需要使用下面的ObjectId类来封装下传进去</p>
<h3>使用自增id查询</h3>
复制代码
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$id = <span class="hljs-keyword">new \MongoDB\BSON\ObjectId(<span class="hljs-string">'5cecd708ab4e4536fc0076e2');
$document = $collection->findOne([<span class="hljs-string">'_id' => $id]);
var_dump($document);</span></span></span></span></pre>
<h3>其它条件查询</h3>
<p>使用其它条件数据则直接传进去就可以 </p>
复制代码
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$document = $collection->findOne([<span class="hljs-string">'username' => <span class="hljs-string">'admin']);
var_dump($document);</span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559027257136568.png"></p>
<h3>使用limit,sort,skip查询</h3>
<p>默认情况下是返回所有的字段数据,也可以指定字段返回,limit是返回的行数,sort是使用name字段-1为降序,1为升序,skip为跳过前多少条数据如下</p>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
<span class="hljs-string">'username' => <span class="hljs-string">'admin',
],
[
<span class="hljs-string">'projection' => [
<span class="hljs-string">'email' => <span class="hljs-number">1,
],
<span class="hljs-string">'limit' => <span class="hljs-number">4,
<span class="hljs-string">'sort' => [<span class="hljs-string">'name' => <span class="hljs-number">-1],
<span class="hljs-string">'skip' =><span class="hljs-number">1,
]);
<span class="hljs-keyword">foreach ($cursor as $restaurant) {
var_dump($restaurant);
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h3>正则条件查询</h3>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
<span class="hljs-string">'username' => <span class="hljs-keyword">new MongoDB\BSON\Regex(<span class="hljs-string">'^ad', <span class="hljs-string">'i'),
],
[
<span class="hljs-string">'projection' => [
<span class="hljs-string">'email' => <span class="hljs-number">1,
],
<span class="hljs-string">'limit' => <span class="hljs-number">1,
<span class="hljs-string">'sort' => [<span class="hljs-string">'pop' => <span class="hljs-number">-1],
]);
<span class="hljs-keyword">foreach ($cursor as $restaurant) {
var_dump($restaurant);
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>另外一种正则式的写法</p>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
<span class="hljs-string">'username' => [<span class="hljs-string">'$regex' => <span class="hljs-string">'^ad', <span class="hljs-string">'$options' => <span class="hljs-string">'i'],
],
[
<span class="hljs-string">'projection' => [
<span class="hljs-string">'email' => <span class="hljs-number">1,
],
<span class="hljs-string">'limit' => <span class="hljs-number">1,
<span class="hljs-string">'sort' => [<span class="hljs-string">'pop' => <span class="hljs-number">-1],
]);
<span class="hljs-keyword">foreach ($cursor as $restaurant) {
var_dump($restaurant);
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h3>查询多个数据</h3>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$cursor = $collection->find([<span class="hljs-string">'username' => <span class="hljs-string">'admin']);
<span class="hljs-keyword">foreach ($cursor as $document) {
<span class="hljs-keyword">echo $document[<span class="hljs-string">'_id'], <span class="hljs-string">"\n";
}</span></span></span></span></span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559027339129636.png"></p>
<h2>更新数据</h2>
<h3>更新单条数据</h3>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
[<span class="hljs-string">'username' => <span class="hljs-string">'admin'],
[<span class="hljs-string">'$set' => [<span class="hljs-string">'name' => <span class="hljs-string">'new nickname']]
);
printf(<span class="hljs-string">"Matched %d document(s)\n", $updateResult->getMatchedCount());
printf(<span class="hljs-string">"Modified %d document(s)\n", $updateResult->getModifiedCount());</span></span></span></span></span></span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559029206114764.png"></p>
<h3>更新多条数据</h3>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$updateResult = $collection->updateMany(
[<span class="hljs-string">'username' => <span class="hljs-string">'admin'],
[<span class="hljs-string">'$set' => [<span class="hljs-string">'name' => <span class="hljs-string">'new nickname']]
);
printf(<span class="hljs-string">"Matched %d document(s)\n", $updateResult->getMatchedCount());
printf(<span class="hljs-string">"Modified %d document(s)\n", $updateResult->getModifiedCount());</span></span></span></span></span></span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559029272301679.png"></p>
<h3>替换文档</h3>
<p>替换文档其它跟更新数据类似,但是这个操作不会修改id,如下</p>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$updateResult = $collection->replaceOne(
[<span class="hljs-string">'username' => <span class="hljs-string">'admin'],
[<span class="hljs-string">'username' => <span class="hljs-string">'admin2', <span class="hljs-string">'name' => <span class="hljs-string">'new nickname']
);
printf(<span class="hljs-string">"Matched %d document(s)\n", $updateResult->getMatchedCount());
printf(<span class="hljs-string">"Modified %d document(s)\n", $updateResult->getModifiedCount());</span></span></span></span></span></span></span></span></span></pre>
<h3>Upsert操作</h3>
<p>这个名字应该是个缩写,更新或替换操作时如果有匹配的数据则直接操作,如果没有匹配的数据则插入一条新数据,意思是如果更新或替换操作的第三个参数如果传 'upsert'=>True 的话就可以开启这个功能</p>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
[<span class="hljs-string">'username' => <span class="hljs-string">'admin3'],
[<span class="hljs-string">'$set' => [<span class="hljs-string">'username' => <span class="hljs-string">'admin2', <span class="hljs-string">'name' => <span class="hljs-string">'new nickname']],
[<span class="hljs-string">'upsert' => <span class="hljs-keyword">true]
);
printf(<span class="hljs-string">"Matched %d document(s)\n", $updateResult->getMatchedCount());
printf(<span class="hljs-string">"Modified %d document(s)\n", $updateResult->getModifiedCount());
printf(<span class="hljs-string">"Upserted %d document(s)\n", $updateResult->getUpsertedCount());
$upsertedDocument = $collection->findOne([
<span class="hljs-string">'_id' => $updateResult->getUpsertedId(),
]);
var_dump($upsertedDocument);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>如果有匹配的情况下最后输出为NULl</p>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559030215132171.png"></p>
<p>没有匹配的情况下最后输出插入的数据</p>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559030085203984.png"></p>
<h2>删除数据</h2>
<p>复制代码</p>
<pre class="php hljs inited">$collection = (<span class="hljs-keyword">new MongoDB\Client)->test->users;
$deleteResult = $collection->deleteOne([<span class="hljs-string">'username' => <span class="hljs-string">'admin3']);
printf(<span class="hljs-string">"Deleted %d document(s)\n", $deleteResult->getDeletedCount());
$deleteResult = $collection->deleteMany([<span class="hljs-string">'username' => <span class="hljs-string">'admin2']);
printf(<span class="hljs-string">"Deleted %d document(s)\n", $deleteResult->getDeletedCount());</span></span></span></span></span></span></span></pre>
<p><img src="https://res.zkeli.com/uploads/image/2019/05/1905281559030350141184.png"></p>
</div><br><br>
来源:https://www.cnblogs.com/rxbook/p/11134502.html
頁:
[1]