前言
PHP要使用mongoDB的话,需要安装相应的驱动。
操作
1.连接数据库
$m = new MongoClient(); //默认主机和端口为:mongodb://localhost:27017
2.选择数据库
$db = $m->test; //连接到test数据库
//3.创建集合
$dbCol = $db->createCollection("hello"); //创建一个名为hello的集合
针对集合的操作
//4.插入文档
/**
* insert($a, array $options = array())
* @param1 $data array|object 要插入的数据.注意两点:1 如果插入的是对象,则需注意不能有private和protected属性, 2如果需插入的数据中没有手动指明 _id ,则会自动调用new MongoId()生成一个_id属性
* @param2 $options array 选项参数:常用参数如下:
* w : WriteConcerns.当成功写入时,MongoDB所提供的保证.默认值为1.写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
* j : boolean,默认为false.如果为true则会阻塞操作知道将日志同步到磁盘(如果为真,则暗示一个确认插入,并将重置W设置为0。)
* fsync : boolean,默认为false,若为true,如果启用了日志记录,工作方式与j完全一样,如果没有启用日志记录,则mongo在确认数据插入成功之前将会强制把数据写入数据,(如果为真,则暗示一个确认插入,并将重置W设置为0。)
* socketTimeoutMS(别名为timeout,别名已弃用) : integer, 默认值是MongoCursor::$timeout的结果(30000毫秒),如果服务器在超时周期内没有响应则抛出MongoCursorTimeoutException异常,将无法确定服务器是否实际处理了写入。如果设置为-1,则一直阻塞知道有返回结果
* wTimeoutMS(别名为wtimeout,别名已弃用) : integer,此选项指定时间限制(默认10000毫秒),(当w>1生效),如果服务器在超时周期内没有响应则抛出MongoCursorException异常,设置为0则一直阻塞知道有返回结果
* @return array|boolean,当w设置为>=1的数时,返回包含插入状态的数组,,否则返回true,返回参数如下:
* ok : 成功返回1(此参数可以判断插入是否成功)
* err : 错误信息,如果此字段为非空,则在先前操作中发生错误
* code : 错误码
* errmsg : 当ok为0时的错误信息
* n : 如果最后一个操作是更新、更新插入或删除,则将返回受影响文档的数量。对于插入操作,此值始终为0。
*/
$data = array(
'name' => 'zhangsan',
'age' => 28,
'mobile' => '18888888888',
'sex' => 'male',
'ext' => array(
'city' => '上海市',
'country' => '中国'
)
);
$result = $dbCol -> insert($data); //如果第二个参数加上array('w'=>0),则返回true
var_dump($result); //array(4) { ["n"]=> int(0) ["ok"]=> float(1) ["err"]=> NULL ["errmsg"]=> NULL } //返回值中'ok'=1即表示成功
//插入对象数据
class data{
public $_id = 3;
public $name = 'wangwu';
public $age = 17;
public $mobile = '13000000000'; //属性不能是private|protected,否则报错
}
$data1 = new data();
$result = $dbCol -> insert($data,);
5.findOne查询单个文档
/**
* @param1 array 所有条件,如 array('ext.city'=>'shanghai')。默认返回第一个文档
* @param2 array 指定返回字段,如 array('name'=>true, 'age'=>true); _id字段总是会返回,除非显示加上'_id'=>false.默认是返回所有字段
*/
$record = $dbCol -> findOne();
var_dump($record);
6.find查询整个文档
/**
* @param1 array 所有条件,如 array('ext.city'=>'shanghai')。默认返回第一个文档(对多维数组的操作使用.字符)
* @param2 array 指定返回字段,如 array('name'=>true, 'age'=>true); _id字段总是会返回,除非显示加上'_id'=>false.默认是返回所有字段
* @return MongoDB\Driver\Cursor
* 可以对结果集合进行连贯操作
* sort(array $fields)//对结果集排序,1升序 -1降序
* skip(int $num) //可以对结果集忽略前几个文档
* limit(int $num) //只返回前n个匹配的文档(可以与skip结合实现分类)
* count() //返回结果集的数量,可以用来判断find查询结果是否为空
*/
$records = $dbCol -> find()->sort(array('age'=>1))->skip(1)->limit(10);
if($records->count() > 0){
foreach ($records as $record) {
var_dump($record);
}
}
常用的条件操作符:
/**
* 常用的条件操作符:
* $lt(<) $lte(<=) $eq(=) $gt(>) $gte(>=) $ne(<>) 用于整数字段查询
* $in: 匹配多个值中任意一个
* $all : 匹配所有值(用于数组字段查询)
* $or : 或查询
* $slice 获取数组字段中指定数目的元素,位于find()函数第二个参数中
* $exists:根据某个字段是否有设置值进行查询
* new MongoRegex(正则表达式) 正则表达式查询
*/
//使用
$record = $dbCol -> findOne(array('age'=>array('$gt'=>30)));
$records = $dbCol -> find(['ext.city' => ['$in' =>['shanghai','beijing']]]);//查询在上海或北京的文档
$records = $dbCol -> find(['$or' => [['name' => 'zhangsan'], ['name' => 'lisi']]]); //查询名字叫张三或者叫李四的
$records = $dbCol -> find(['mobile' => ['$exists' => false]]);//查找mobile字段未设置值的文档
$records = $dbCol -> find(['name' => new MongoRegex('/^Zhang/i')]);//查找name字段以zhang开头的文档,忽略大小写差异
$records = $dbCol->find(['name' => 'zhangsan'],['hobby' => ['$slice' => 2]]);//只返回叫张三的人的前两个爱好
$records = $dbCol->find(['name' => 'zhangsan'],['hobby' => ['$slice' => -2]]);//只返回叫张三的人的后两个爱好
$records = $dbCol->find(['name' => 'zhangsan'],['hobby' => ['$slice' => [0,2]]]);//只返回叫张三的人的第一个和第三个爱好
$records = $dbCol->find(['hobby' => ['$all' => ['swimming','basketball']]]);//查找爱好都喜欢游戏和打篮球的文档
7.update更新文档
/**
* update(array $criteria , array $newobj, array $options = array())
* @param $criteria array 更新条件
* @param $newobj array 用于更新匹配文档的对象(可包含更新运算符),若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
* @param $options array 选项数组,目前可用的选项包括:
* "upsert" 如果没有匹配$criteria条件的文档数据,则将插入新文档
* "multiple" boolean,默认为false,仅更新匹配查询结果的第一条,如果设置为true则匹配到条件的数据都会被更新
* "fsync" boolean 默认为false, 若设置为true,强制插入在返回成功之前同步到磁盘。
* "j" boolean 默认为false, 设置为true时,强制写入操作阻止,直到它与磁盘上的日志同步。(此选项如果日志记录被禁用,MangGDB 2.6 +将引发错误,写入将失败;旧的服务器版本将简单地忽略该选项。)
* "socketTimeoutMS" (别名为timeout,别名已弃用) : integer, 默认值是MongoCursor::$timeout的结果(30000毫秒),如果服务器在超时周期内没有响应则抛出MongoCursorTimeoutException异常,将无法确定服务器是否实际处理了写入。如果设置为-1,则一直阻塞知道有返回结果
* "w" WriteConcerns.当成功写入时,MongoDB所提供的保证.默认值为1.写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
* "wTimeoutMS" (别名为wtimeout,别名已弃用) : integer,此选项指定时间限制(默认10000毫秒),(当w>1生效),如果服务器在超时周期内没有响应则抛出MongoCursorException异常,设置为0则一直阻塞知道有返回结果
*/
/**
* 常用的更新运算符:
* $inc:增加特定键的值,若字段不存在则新建字段并赋值
* $set:重置特定键的值,若字段不存在则新建字段并赋值
* $unset:删除字段
* $rename:重命名字段,若字段不存在则不进行任何操作
* $setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的值
* $push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, 可以和$each一起使用添加多个值
* $pushAll:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
* $addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中),可以和$each一起使用添加多个值
* $pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
* $pull:删除数组中所有指定值
* $pullAll:删除数组中多个元素的所有值
*/
//使用
$res = $dbCol -> update(['name' => 'zhangsan1'], ['$inc'=>['age' => 1]], ['upsert' => true]); //zhangsan1不存在,upsert为true时会增加一条name=zhangsan1,age=1的文档
$res = $dbCol -> update(['name' => 'zhangsan2'], ['username' => 'zhangsan2'], ['upsert' => true]); //zhangsan2不存在,upsert为true时,第二个参数没有使用修改操作符,则将第二个参数的数据作为文档新增
$res = $dbCol -> update(['name' => 'zhangsan'], ['$inc'=>['age' => 1]]); //将符合条件的第一个叫张三的年龄增加1
$res = $dbCol -> update(['name' => 'zhangsan'], ['$inc'=>['age' => 1]], ['multiple' => true]); //将符合条件的所有叫张三的年龄增加1
$res = $dbCol -> update(['name' => 'lisi'], ['$set'=>['sex' => 'male']], ['multiple' => true]); //将符合条件的所有叫李四的性别改为male
$res = $dbCol -> update(['name' => 'lisi'], ['$rename'=>['sex' => 'xingbie']], ['multiple' => true]); //将符合条件的所有叫李四的sex字段名改为xingbie
$res = $dbCol -> update(['name' => 'lisi'], ['$unset'=>['xingbie' => true]]); //将符合条件的第一个叫李四的xingbie字段删除
$res = $dbCol -> update(['name' => 'wangwu'], ['$push'=>['hobby' => 'swimming']]); //将符合条件的第一个叫wangwu的爱好数组中添加swimming
$res = $dbCol -> update(['name' => 'wangwu'], ['$pushAll'=>['hobby' => ['reading','running']]]); //将符合条件的第一个叫wangwu的爱好数组中添加reading,running
$res = $dbCol -> update(['name' => 'wangwu'], ['$push'=>['hobby' => ['$each' => ['eating', 'sleeping']]]]); //添加eating,sleeping,通过$each达到$pushAll的效果
$res = $dbCol -> update(['name' => 'wangwu2'], ['$setOnInsert'=>['hobby' => ['eating', 'sleeping']]], ['upsert' => true]); //当wangwu2不存在时,添加hobby字段,并设置值
$res = $dbCol -> update(['name' => 'wangwu'], ['$addToSet'=>['hobby' => 'playing']]); //像hobby字段中添加playing,与$push类似,但$addToSet只有当数据中不存在的值才会添加,不会重复添加
$res = $dbCol -> update(['name' => 'wangwu'], ['$addToSet'=>['hobby' => ['$each' => ['crying','sleeping']]]]); //结合$each使用, sleeping存在,故只添加了crying
$res = $dbCol -> update(['name' => 'wangwu'], ['$pop'=>['hobby' => -1]]); //从hobby数组中删除第一个元素
$res = $dbCol -> update(['name' => 'wangwu'], ['$pop'=>['hobby' => 1]]); //从hobby数组中删除最后一个元素
$res = $dbCol -> update(['name' => 'wangwu'], ['$pull'=>['hobby' => 'eating']]); //从hobby数组中删除所有的eating
$res = $dbCol -> update(['name' => 'wangwu'], ['$pullAll'=>['hobby' => ['eating','sleeping']]]); //从hobby数组中删除所有的eating
8.save保存文档
/**
* save($a, array $options = array()
* @param $a array|object 要保存的数据,如果用的是 Object,它不能有 protected 或 private 的属性。通过_id字段判断是新增(_id不存在)还是更新(_id已存在)
* @param $options array 选项数组:
* "fsync" 同上
* "j" 同上
* "socketTimeoutMS" 同上
* "w" 同上
* "wTimeoutMS" 同上
* @return boolean|array 如果设置了 w,返回包含此次保存状态的一个 array。 否则,返回一个 boolean,表示数组是否为空(空数组不会被插入)。(但本人操作,却发现空数组也会插入,并且总会返回true)
*/
$data = array(
'name' => 'xiaohong',
'age' => 19,
'hobby' => [],
'mobile' => '',
'sex' => 'female',
'ext' => array(
'city' => 'lanzhou',
'country' => 'china'
)
);
$data2 = array();
$res = $dbCol -> save($data2, array('w' => 0));//新增一条数据,如果添加了_id字段,并且_id在集合中已存在,则更新
var_dump($res);
9.remove从集合中删除记录
/**
* remove(array $criteria = array(), array $options = array())
* @param $criteria array 删除条件, 当该参数为空时,删除整个集合的数据
* @param $options array 选项参数:
* "w" 同上
* "justOne" boolean 默认false 若为true,最多只删除一个匹配的记录
* "fsync" 同上
* "j" 同上
* "wTimeoutMS" 同上
* "w" 同上
* "socketTimeoutMS" 同上
* @return array|true 如果设置了 "w" 选项(w>0),将会返回包含删除状态的 array。 否则返回 TRUE。
*/
$result = $dbCol -> remove(); //删除该集合全部文档,操作比较危险,慎用
$result = $dbCol -> remove(['name' => 'xiaohong'], ['justOne' => true]); //删除叫小红的第一条文档
10.batchInsert批量插入文档
/**
* batchInsert(array $a, array $options = array())
* @param $a array 要插入的数据,是一个包含数组或者对象的数组(多维),如果数组元素是对象,则不能有private或protected属性
* @param $options array 选项参数
* "continueOnError" boolean 默认false 若为true,遇到错误时,不会停止数据继续插入
* "fsync" 同上
* "j" 同上
* "w" 同上
* "wTimeoutMS" 同上
* "socketTimeoutMS" 同上
* @return array|bool 如果W参数被设置为确认写入,则返回具有插入状态(“OK”)的关联数组和可能发生的任何错误(“Err”)。否则,如果成功插入批处理插入,则返回true,否则为false。
*/
$result = $dbCol->drop();
var_dump($result);exit;
$data = array();
for($i=0; $i < 5; $i++){
$data[$i] = [
'username' => 'user'.$i, '_id' => $i
];
}
$result = $dbCol -> batchInsert($data,['continueOnError' => true]);
echo '<pre>';
print_r($result);
11.删除集合
/**
* drop()
* @return array 其中'ok'=>1代表成功
*/
$dbCol -> drop();
12.返回集合中的文档数量
/**
* count([ array $query = array() [, int $limit = 0 [, int $skip = 0 ]]] )
* @param $query array|object 查询条件,默认为空
* @param $limit int 指定返回数量的上限
* @param $skip int 指定在开始统计前,需要跳过的结果数目
* @return int 返回查询匹配到的文档数目
*/
$result = $dbCol->count();//返回集合中所有数据
$result = $dbCol->count(['name'=>'xiaohong'], 5, 3);
var_dump($result);exit;
13.其他操作
//getName(void) 获取集合名称
echo $dbCol ->getName(); //获取集合名称
针对数据库的操作
删除数据库
/**
* drop()
* @return array 其中'ok'=>1代表成功
*/
$m = new MongoClient();
$db = $m -> user;
$result = $db ->drop();
网友评论