接下来,我就按照mongo-php-library
这个官方包来给大家演示一遍基本的curd,我附带上原生的mongodb语句,以便大家理解
注明:我用的MongoDB版本为3.4.
shell
打开任意一张表就可以看到这样的界面,在红框内输入原生语句,ctrl+r
执行
首先,安装这个包composer require mongodb/mongodb
,再加上use MongoDB;
,然后就可以开始享用了.
该库的手册地址:https://docs.mongodb.com/php-library/current/tutorial/crud/
连接
//连接本地服务$client = new MongoDB\Client('mongodb://127.0.0.1:27017');//选择数据库和集合$collection = $client->selectCollection('DatebaseName', 'collectionName');//这个库同时支持mongo拓展的写法.//$collection = $client->DatebaseName->collectionName;
插入
单条插入 : insertOne
方法将单个文档插入到MongoDB中,并返回一个实例,使用getInsertedId
可以获取插入文档的id , mongodb会自动生_id
字段,为24位随机字符串,同时,用户也可以指定生成
原生语句为db.user.insertOne({'name':'dullcat'})
$user = array('name'=>'Dullcat','sex'=>'male');//执行并返回实例$result = $collection->insertOne($user);//拿到返回的_id$id= $result->getInsertedId();//返回值:5af53f89804c044a340018f2
批量插入:跟mysql的批量原理相同,组装成多维数组.和单条插入的函数相仿insertMany
,getInsertedIds
原生语句为db.user.insertMany([{'name':'猫爷'},{'name':'Dullcat'}])
$users = array(array('name'=>'猫爷','sex'=>'male'),array('name'=>'DullCat','sex'=>'male')); $result = $collection->insertMany($users); $ids_info= $result->getInsertedIds();//拿到插入的个数$count = $result->getInsertedCount();/** //返回值: array(2) { [0]=> object(MongoDB\BSON\ObjectId)#11 (1) { ["oid"]=> string(24) "5af548d3804c044a340018f8" } [1]=> object(MongoDB\BSON\ObjectId)#14 (1) { ["oid"]=> string(24) "5af548d3804c044a340018f9" } } */
需要注意的是批量返回的并不是string类型的id了,而是一个非常复杂的结构,如果我们想要以数组形式拿到他的_id,我们可以使用一下函数
foreach($ids_info as $value){ $ids [] = $value->__toString(); }/** //格式为: array(2) { [0]=> string(24) "5af54ead804c044a34001920" [1]=> string(24) "5af54ead804c044a34001921" } */
查询
单个查询:findOne
,相当于sql语句的limit 1
原生语句:db.user.findOne({"_id":ObjectId("5af5553f804c044a34001922")})
//由于储存的`_id`字段是一个BSON类型的object,所以要按_id字段来查的话,要先进行类型转换$mongo_id = new MongoDB\BSON\ObjectId('5af5553f804c044a34001922'); //查询执行$info = $collection->findOne(array('_id'=>$mongo_id)); //如果没有找到,返回值为null //返回值是一个对象,这里我们可以将他强制类型转换`$info = (array)$info` /** object(MongoDB\Model\BSONDocument)#22 (1) { ["storage":"ArrayObject":private]=> array(4) { ["_id"]=> object(MongoDB\BSON\ObjectId)#21 (1) { ["oid"]=> string(24) "5af5553f804c044a34001922" } ["name"]=> string(5) "suhua" ["age"]=> int(26) ["sex"]=> string(3) "男" } } */
多个查询:find
多个查询有两个数组参数,第一个是查询的条件,第二个是选项
$info = $collection->find(array('name'=>'DullCat'));//第一个数组的查询条件要注意下`$gt`这是查询选择器,表示大于//第二个数组的选项意义为:`skip`跳过0条数据,`limit`查询10条数据,`sort`按age字段正序排序(1为正序,-1为倒序)$info = $collection->find(array('name'=>'Dullcat',,'age'=>array('$gt'=>'1')),array('skip'=>0,'limit'=>10,'sort'=>array('age'=>1)));//这时请注意,多个查询返回的是游标(Cursor),需要的进行处理//您可以用函数转换$info_array = $info->toArray();//也可以用foreach迭代该对象foreach($info as $value){ $info_array [] = $value; }
更新
单条更新updateOne
多条更新updateMany
单个更新和多个更新的用法一模一样,但是要注意的是他的操作符和选项
//update方法有三个数组参数//第一个数组是查询条件//第二数组是更新操作符,例如下面的`array('$set'=>array('age'=>'23'))`,意义为:更改age字段为23//第三个数组是选项,可以选择各种参数,例如下面的`array('upsert'=>true)`,意义为当能查询到就进行更改,如果没有查询到就进行新增操作$result = $collection->updateOne(array('name'=>'DullCat'),array('$set'=>array('age'=>'23')),array('upsert'=>true));/** 原生语句 db.user.updateOne( { "name": "dullcat" }, {$set: { "age": "123" }}, { upsert: true } ) */
删除
单个删除deleteOne
原生语句:db.users.deleteOne( { name: "DullCat" } )
多个删除deleteMany
原生语句:db.users.deleteMany( { name: "DullCat" } )
单个删除和多个删除的用法一模一样,只是单个删除只删除查询到的第一条数据,而多个删除则删除匹配到的所有数据
//单个删除$result = $collection->deleteOne(array('name'=>'DullCat'));//多个删除$result = $collection->deleteMany(array('name'=>'DullCat'));//拿到删除数据的条数 $count = $result->getDeletedCount();
当然,还有很多功能我都没讲到,比如常用的aggregate
聚合,这些就留给大家去阅读官方文档吧
参考文档:
查询选择器:https://docs.mongodb.com/manual/reference/operator/query/
更新操作符:https://docs.mongodb.com/manual/reference/operator/update/#update-operators
Aggregation Pipeline:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/
作者:DullCat
链接:https://www.jianshu.com/p/453483db0905