PHP操作Mongodb

小编复习MongoDB,基础请参考:MongoDB-CSDN博客(主要是linux操作)

PHP操作


<?php
 /**
 * 注意 本类仅适用于PHP7.0版本以上   
 * 请注意:mongoDB 支持版本 3.2+
 * mongo具体参数参考: https://docs.mongodb.com/manual/reference/command/
 */
class MyMongodb {
    private $manager;
    private $dbname='yun';
    /**
     * 创建实例
     * @param  string $confkey
     * @return object
     */
    public function __construct($dns){
        $this->manager = new MongoDB\Driver\Manager($dns);
    }
    /**
     * 插入
     */
    public function insert($table,$data){
        $bulk = new MongoDB\Driver\BulkWrite;
        $bulk->insert($data);
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
        $res = $this->manager->executeBulkWrite($this->dbname.'.'.$table, $bulk, $writeConcern);
        return $res?true:false;
    }
    public function insert_batch($table,$data)
    {
        $bulk = new MongoDB\Driver\BulkWrite;
        foreach ($data as $val){
            $bulk->insert($val);
        }
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
        $res = $this->manager->executeBulkWrite($this->dbname.'.'.$table, $bulk, $writeConcern);
        return $res?true:false;
    }
    /**
     * 查询
     * eg:['age' => 24]]
     * eg;$options = [
     *      'projection' => ['_id' => 0], //不输出_id字段
     *      'sort' => ['leavetime'=>-1] //根据user_id字段排序 1是升序,-1是降序
     *   ];
     */
    public function select($table,$filter,$options=array()){
        !$filter && dieError('param of filter is error');
        $options['projection']=['_id' => 0];
        $query = new MongoDB\Driver\Query($filter, $options); //查询请求
        $cursor = $this->manager->executeQuery($this->dbname.'.'.$table, $query);
        $result = [];
        foreach($cursor as $doc) {
          $result[] = (array)$doc;
        }
        return $result;
    }
    /**
     * 修改
     * eg:$condition=['name' => 'JetWu5']
     * eg:$set_array= ['$set' => ['age' => 30, 'promise' => 'always smile!']]
     */
    public function update($table,$condition=array(),$set_array=array()){
        !$condition && dieError('param of condition is error');
        !$set_array && dieError('param of set_array is error');
        $bulk = new MongoDB\Driver\BulkWrite;
        $bulk->update(
          $condition,
          $set_array
        );
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
        $res = $this->manager->executeBulkWrite($this->dbname.'.'.$table, $bulk, $writeConcern);
        return $res?true:false;
    }
    /**
     * 删除
     * eg:$condition=['name' => 'JetWu5']
     * if $condition==[] then delete all table documents!
     */
    public function delete($table,$condition=[]){
        !is_array($condition) && dieError('param of condition is error');
        $bulk = new MongoDB\Driver\BulkWrite;
        $bulk->delete($condition);
        $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
        $res = $this->manager->executeBulkWrite($this->dbname.'.'.$table, $bulk, $writeConcern);
        return $res?true:false;
    }
    function exec($opts) {
        $cmd = new MongoDB\Driver\Command($opts);
        $cursor =  $this->manager->executeCommand($this->dbname, $cmd);
        $result = [];
        foreach($cursor as $doc) {
          $result[] = (array)$doc;
        }
        return $result;
    }
}

关键字


$eq:等于
$gt:大于
$gte:大于等于
$lt:小于
$lte:小于等于
$ne:不等于
$in:在指定数组中
$nin:不在指定数组中
$and:逻辑与
$or:逻辑或
$not:逻辑非
$exists:字段是否存在

//数据库链接
$mongodb = new MongoDB\Driver\Manager('mongodb://localhost:27017');
//数据写入
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'name'=>'测试数据1', 'type' => 1,'desc'=>'描述1']);
$bulk->insert(['x' => 2, 'name'=>'测试数据2', 'type' => 2,'desc'=>'描述2']);
$bulk->insert(['x' => 3, 'name'=>'测试数据3', 'type' => 1,'desc'=>'描述3']);
$bulk->insert(['x' => 4, 'name'=>'测试数据4', 'type' => 2,'desc'=>'描述4']);
$bulk->insert(['x' => 5, 'name'=>'测试数据5', 'type' => 1,'desc'=>'描述5']);
$bulk->insert(['x' => 6, 'name'=>'测试数据6', 'type' => 2,'desc'=>'描述6']);
$mongodb->executeBulkWrite('message.test', $bulk);//数据写入(写入meaasge库的test表)

//数据查询
$filter = ['x' => ['$lte' => 3]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['x' => 1],
];
$query = new MongoDB\Driver\Query($filter, $options); // 查询数据(预处理语句)
$cursor = $mongodb->executeQuery('message.test', $query);//执行查询
foreach ($cursor as $document) {//数据循环输出
    print_r($document);
}

//数据修改
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['x' => 2],
    ['$set' => ['name' => '测试数据22', 'desc' => '描述22']],
    ['multi' => false, 'upsert' => false]
);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $mongodb->executeBulkWrite('message.test', $bulk, $writeConcern);
var_dump($result);

//数据删除
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['x' => 1], ['limit' => 1]);   // limit 为 1 时,删除第一条匹配数据,limit 为 0 时,删除所有匹配数据
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $mongodb->executeBulkWrite('message.test', $bulk, $writeConcern);
var_dump($result);
die;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么不建议在 Vue <style> 中使用 scoped?

前言 亲爱的小伙伴&#xff0c;你好&#xff01;我是 嘟老板。我们使用 Vue 开发页面时&#xff0c;经常需要在 <style> 标签下编写样式。不知你是否留意&#xff0c;在 <style> 标签下有一个属性经常出现 - scoped。你知道它起到什么作用吗&#xff1f;原理是怎样…

[Java EE] 多线程(九):ReentrantLock,Semaphore,CountDownLatch与线程安全的集合类(多线程完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

PE文件(四)FileBuffer-ImageBuffer作业

C语言实现如下功能 2.编写一个函数&#xff0c;将RVA的值转换成FOA 将文件加载到内存时&#xff0c;已知一个数据在内存中的地址&#xff0c;将此地址转化成文件在硬盘上时的相对于文件起始地址的文件偏移地址。即将虚拟内存偏移地址转换成文件偏移地址。 说明&#xff1a;这里…

ssm+vue的数据学院教务管理系统。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的数据学院教务管理系统。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spr…

20个入门级Python项目

很多刚刚入门python的同学除了书上、老师讲解的1、2个demo示例之外&#xff0c;基本上很难找到适合练手的入门级Python项目。 作者不辞辛苦&#xff0c;花了很长时间整理了20个适合练手的实例项目 下面这20个练手项目全部去是免费的&#xff0c;大家可以任意下载&#xff0c;…

记一次DNS故障导致用户无法充值的问题(上)

背景&#xff1a; 刚刚过去了五一劳动节&#xff0c;回来后一上班接到客服运营团队反馈的节日期间的问题&#xff0c;反馈有部分用户无法充值。拿到的反馈资料有&#xff1a; 无法充值操作视频、问题时间、手机机型、手机网络情况。 1、从视频中看到用户点击支付后没有任何反…

ANSYS许可分析工具

在工程设计与仿真领域&#xff0c;ANSYS软件作为行业领导者&#xff0c;为企业提供了强大的支持。然而&#xff0c;随着业务的发展和软件版本的升级&#xff0c;如何有效地分析和管理ANSYS许可证&#xff0c;确保资源的合理配置和高效利用&#xff0c;成为企业面临的重要问题。…

大数据高级阶段面试题(实时2)

14.Flink状态管理内部原理是什么? 状态后端&#xff1a; Flink支持多种状态后端&#xff0c;包括内存&#xff0c;文件系统和分布式存储系统&#xff0c;状态后端负责将数据保存到相应的存储系统中&#xff0c;RocksDB是Flink默认的状态后端&#xff0c;它提供了高性能的本…

Linux系统使用Docker安装青龙面板并实现远程访问管理面板

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 青龙…

聊聊 ASP.NET Core 中间件(三):如何创建自己的中间件?

前言 本质上&#xff0c;中间件类也是一个普通的 .NET 类&#xff0c;它不需要继承任何父类或者实现任何接口。 但是有几个约定&#xff1a; 需要有一个构造方法构造方法至少要有一个 RequestDelegate 类型的参数&#xff0c;用来指向下一个中间件。需要定义一个名字为 Invo…

嵌入式linux学习第一天

参考正点原子Linux开发文档。记录下知识点。 Shell 基本操作 前面我们说 Shell 就是“敲命令”&#xff0c;那么既然是命令&#xff0c;那肯定是有格式的&#xff0c;Shell 命令的格式 如下&#xff1a; command -options [argument] command: Shell 命令名称。 options&…

雷军-2022.8小米创业思考-6-互联网七字诀之专注:有所为,有所不为;克制贪婪,少就是多;一次解决一个最迫切的需求

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 专注 从商业角度看&#xff0c;专注就是要“把鸡蛋尽量放在一个篮子里”。这听起来似乎有些不合理&#xff0c;大家的第一反应可能是“风险会不会…

JUC-synchronized练习-交替打印ABC

今天来练习一下synchronized 简单来利用synchronized实现一个字符串的交替打印 主要的实现设置一个全局的变量state&#xff0c;线程执行通过不断累加state&#xff0c;根据state对三取余的结果来判断该线程是否继续执行还是进入等待。并通过synchronized锁住一个共享变量loc…

线程池会遇到的刁钻问题(下)

文章目录 如何处理线程池中的异常&#xff1f;在并发编程中&#xff0c;线程池和锁有什么关系&#xff1f;如何实现一个可以动态调整大小的线程池&#xff1f;方法一&#xff1a;扩展 ThreadPoolExecutor方法二&#xff1a;使用 ScheduledExecutorService 如何确保线程池中的任…

Fastapi中怎么一次性运行多个Scrapy爬虫

运行Scrapy爬虫很简单&#xff0c;直接"Scrapy crawl 爬虫名称"即可。但是我们如果想在Fastapi中通过接口的方式一次性运行多个爬虫。那该怎么实现&#xff1f; 假如在scrapy下面的spiders里面写了许多爬虫文件&#xff0c;你可以在spiders的__init__.py文件中&…

js 图片渐变

1. 点击图片&#xff0c;使其渐变为另一张图片 通过定义keyframes来创建一个淡入淡出的动画效果。当图片被点击时&#xff0c;先添加淡出动画使图片透明度从0渐变到1&#xff0c;然后在1秒后切换图片源并添加淡入动画使新图片透明度从0渐变到1&#xff0c;实现图片渐变效果。 …

电路板第一次调试注意事项

电路板第一次调试注意事项 调板经验其他人的经验一、上电前检查1、目测检查2、电源短路检查3、连线检查4、元器件安装检查 二、通电后检测1、通电观察2、静态调试3、动态调试 调板经验 1.打开原理图 PCB&#xff0c;熟悉一遍。 2.拿到板&#xff0c;找到输入正负极&#xff0…

VUE的回调函数,使用this变量undefined,怎么办

由于预订的抓拍方案无法令人满意&#xff0c;于是又回到了直接在WEB抓拍的方案。这个我信心满满&#xff0c;因为之前的代码已经验证过了。 验证是通过的&#xff0c;想法是简单的&#xff0c;现实是不通的。我一点抓拍按钮&#xff0c;没反应啊。这是怎么回事呢&#xff1f;于…

自动化机器学习——贝叶斯优化

自动化机器学习——贝叶斯优化 贝叶斯优化是一种通过贝叶斯公式推断出目标函数的后验概率分布&#xff0c;从而在优化过程中不断地利用已有信息来寻找最优解的方法。在贝叶斯优化中&#xff0c;有两个关键步骤&#xff1a;统一建模和获得函数的优化。 1. 统一建模 在贝叶斯优…

.双链表.

题目&#xff1a; 实现一个双链表&#xff0c;双链表初始为空&#xff0c;支持 55 种操作&#xff1a; 在最左侧插入一个数&#xff1b;在最右侧插入一个数&#xff1b;将第 k&#x1d458; 个插入的数删除&#xff1b;在第 k&#x1d458; 个插入的数左侧插入一个数&#xf…