PHP7 MongoDB 使用方法
原文链接: http://www.zhaokeli.com/article/8574.html
MongoDb原生操作
Mongodb连接
PHP7 连接 MongoDB 语法如下:
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
插入数据
将 name 为"自学教程" 的数据插入到 test 数据库的 runoob 集合中。
$bulk = new MongoDB\Driver\BulkWrite;
$document = ['_id' => new MongoDB\BSON\ObjectID, 'name' => '菜鸟教程'];
$_id= $bulk->insert($document);
var_dump($_id);
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.runoob', $bulk, $writeConcern);
读取数据
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
// 插入数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'name'=>'baidu', 'url' => 'http://www.baidu.com']);
$bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']);
$bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']);
$manager->executeBulkWrite('test.sites', $bulk);
$filter = ['x' => ['$gt' => 1]];
$options = [
'projection' => ['_id' => 0],
'sort' => ['x' => -1],
];
// 查询数据
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('test.sites', $query);
foreach ($cursor as $document) {
print_r($document);
}
更新数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
['x' => 2],
['$set' => ['name' => '菜鸟工具', 'url' => 'tool.runoob.com']],
['multi' => false, 'upsert' => false]
);
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern);
删除数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['x' => 1], ['limit' => 1]); // limit 为 1 时,删除第一条匹配数据
$bulk->delete(['x' => 2], ['limit' => 0]); // limit 为 0 时,删除所有匹配数据
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern);
MongoDB官方操作库
看完上面的CURD操作是不是感觉有点懵逼,操作方式跟想像中的完全不一样,可能官方也想到啦这一块,于是又封装啦一个操作库让大家使用。文档地址如下
https://docs.mongodb.com/php-library/current/tutorial/crud/
安装
composer require mongodb/mongodb
添加数据
插入单条数据
在数据库test中的users集合中插入数据,如果数据库或集合不存在则会自动创建
$collection = (new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne([
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
]);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());
输出结果
数据库中数据
可以看出返回$oid为数据库自动分配的唯一标识,如果我们插入的时候传入id值的话,mongodb会判断这个id是否存在,如果存在就会报错,如果不存在则直接返回传入的id值
$collection = (new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne(['_id' => 1, 'name' => 'Alice']);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());
执行结果
插入多条数据
$collection = (new MongoDB\Client)->test->users;
$insertManyResult = $collection->insertMany([
[
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
],
[
'username' => 'test',
'email' => 'test@example.com',
'name' => 'Test User',
],]);
printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount());
var_dump($insertManyResult->getInsertedIds());
查询数据
如果要使用id查询,则需要使用下面的ObjectId类来封装下传进去
使用自增id查询
$collection = (new MongoDB\Client)->test->users;
$id = new \MongoDB\BSON\ObjectId('5cecd708ab4e4536fc0076e2');
$document = $collection->findOne(['_id' => $id]);
var_dump($document);
其它条件查询
使用其它条件数据则直接传进去就可以
$collection = (new MongoDB\Client)->test->users;
$document = $collection->findOne(['username' => 'admin']);
var_dump($document);
使用limit,sort,skip查询
默认情况下是返回所有的字段数据,也可以指定字段返回,limit是返回的行数,sort是使用name字段-1为降序,1为升序,skip为跳过前多少条数据如下
$collection = (new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
'username' => 'admin',
],
[
'projection' => [
'email' => 1,
],
'limit' => 4,
'sort' => ['name' => -1],
'skip' =>1,
]);
foreach ($cursor as $restaurant) {
var_dump($restaurant);
}
正则条件查询
$collection = (new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
'username' => new MongoDB\BSON\Regex('^ad', 'i'),
],
[
'projection' => [
'email' => 1,
],
'limit' => 1,
'sort' => ['pop' => -1],
]);
foreach ($cursor as $restaurant) {
var_dump($restaurant);
}
另外一种正则式的写法
$collection = (new MongoDB\Client)->test->users;
$cursor = $collection->find(
[
'username' => ['$regex' => '^ad', '$options' => 'i'],
],
[
'projection' => [
'email' => 1,
],
'limit' => 1,
'sort' => ['pop' => -1],
]);
foreach ($cursor as $restaurant) {
var_dump($restaurant);
}
查询多个数据
$collection = (new MongoDB\Client)->test->users;
$cursor = $collection->find(['username' => 'admin']);
foreach ($cursor as $document) {
echo $document['_id'], "\n";
}
更新数据
更新单条数据
$collection = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
['username' => 'admin'],
['$set' => ['name' => 'new nickname']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
更新多条数据
$collection = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateMany(
['username' => 'admin'],
['$set' => ['name' => 'new nickname']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
替换文档
替换文档其它跟更新数据类似,但是这个操作不会修改id,如下
$collection = (new MongoDB\Client)->test->users;
$updateResult = $collection->replaceOne(
['username' => 'admin'],
['username' => 'admin2', 'name' => 'new nickname']
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
Upsert操作
这个名字应该是个缩写,更新或替换操作时如果有匹配的数据则直接操作,如果没有匹配的数据则插入一条新数据,意思是如果更新或替换操作的第三个参数如果传 'upsert'=>True 的话就可以开启这个功能
$collection = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
['username' => 'admin3'],
['$set' => ['username' => 'admin2', 'name' => 'new nickname']],
['upsert' => true]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
printf("Upserted %d document(s)\n", $updateResult->getUpsertedCount());
$upsertedDocument = $collection->findOne([
'_id' => $updateResult->getUpsertedId(),
]);
var_dump($upsertedDocument);
如果有匹配的情况下最后输出为NULl
没有匹配的情况下最后输出插入的数据
删除数据
$collection = (new MongoDB\Client)->test->users;
$deleteResult = $collection->deleteOne(['username' => 'admin3']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
$deleteResult = $collection->deleteMany(['username' => 'admin2']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
PHP7 MongoDB 使用方法的更多相关文章
- MongoDB基本方法
一.MongoDB Limit与Skip方法 MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一 ...
- 落网数据库简单查询接口 caddy+php7+mongodb
落网数据库简单查询接口 一个简单的DEMO,使用了caddy + php7 + mongodb 数据库&接口设计 来自 https://github.com/Aedron/Luoo.spide ...
- windows2012 下面php7.2 安装mongodb4.0.4的扩展以及操作mongodb的方法
php连接mongodb驱动 的下载页面http://pecl.php.net/package/mongodb 数据插入: $manager = new MongoDB\Driver\Manager( ...
- ubuntu中搭建php7+mongodb方法
首先照着这篇文章操作 http://blog.csdn.net/Toshiya14/article/details/51417076 结果发现一直报Cannot find OpenSSL's libr ...
- 推荐一个php7+ mongodb三方类
373 次阅读 · 读完需要 8 分钟 5 由于项目需要,把项目升级到了php7.但是升级了之后发现mongo扩展不能用了.php7.0以上只支持mongodb扩展了.而mongodb扩展的驱 ...
- nodejs连接mongodb的方法
一. var express = require('express'); var mongodb = require('mongodb'); var app = express(); app.use( ...
- C# 访问MongoDB 通用方法类
using MongoDB.Driver; using System; namespace MongoDBDemo { public class MongoDb { public MongoDb(st ...
- MongoDB 备份方法
翻译自 http://docs.mongodb.org/manual/core/backups/ 有以下几种方法来备份MongoDB群集: 通过复制底层数据文件来备份 通过mongodump来备份 通 ...
- springdata整合mongodb一些方法包括or,and,regex等等《有待更新》
这几天接触mongodb以及springdata,自己英语比较戳,所以整理这些方法花的时间多了点,不过也是我第一次在外国网站整理技术 不多说,直接上代码,这里只是给出一些操作方法而已,如果有需要源码的 ...
随机推荐
- Andrew Ng机器学习 五:Regularized Linear Regression and Bias v.s. Variance
背景:实现一个线性回归模型,根据这个模型去预测一个水库的水位变化而流出的水量. 加载数据集ex5.data1后,数据集分为三部分: 1,训练集(training set)X与y: 2,交叉验证集(cr ...
- 4.1 vue-resource
全局拦截器.配置全局地址等:
- windows nginx 目录配置
http { server { listen 80; server_name www.test.com; location / { root E:/data/www; index index.html ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(2)R-CNN
Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作.作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于 ...
- 学习Spring-Data-Jpa(四)---Naming命名策略,源码跟踪
1.首先在Entity实体中,命名方式有两种: 一种是显示命名,即通过@Table的name属性指定对应的数据库表名称,@Column的name属性指定实体字段对应数据库字段的名称. 另一种是隐式命名 ...
- Acwing P283 多边形 题解
Analysis 总体来说是一个区间DP 此题首先是一个环,要你进行删边操作,剩下的在经过运算得到一个最大值 注意事项: 1.删去一条边,剩下的构成一条线,相当于求此的最大值,经典区间DP该有的样子: ...
- C# Ninject使用
Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置.简单来讲就是 为我们选择一个想要的类来处理事务. 百度百科的解释:一个快如闪电.超轻量级的基于.Net平台的依赖 ...
- C# 异常 抛异常的时候 同时抛出 传入的参数
abp的审计日志都把这些功能实现了 可以借鉴 抛异常的时候 同时抛出 传入的参数 大致这样实现,aop,方法执行先,先把参数写入到栈中,抛异常时,栈中自然就有此时的参数了. 可用于重现该异常. 获取把 ...
- PHP 鸟哥:我也曾经是“不适合”编程的人
网名:雪候鸟,大家尊称鸟哥,惠新宸 @Laruence, 是国内最有影响力的 PHP 技术专家,PHP 开发组核心成员,PECL 开发者,Zend 公司外聘顾问.他曾供职于雅虎,百度,现在新浪微博任平 ...
- LibreOJ #6191. 「美团 CodeM 复赛」配对游戏
二次联通门 : LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 /* LibreOJ #6191. 「美团 CodeM 复赛」配对游戏 概率dp */ #include <cs ...