美文网首页程序员
php对mongo的简单操作

php对mongo的简单操作

作者: 愤怒的码农啊 | 来源:发表于2018-06-25 17:02 被阅读0次

    前言

    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();
    

    相关文章

      网友评论

        本文标题:php对mongo的简单操作

        本文链接:https://www.haomeiwen.com/subject/kwokyftx.html