PHP实现的mongoDB数据库操作类完整实例


Posted in PHP onApril 10, 2018

本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下:

最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。

众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

面向集合存储,易存储对象类型的数据。
模式自由。
支持动态查询。
支持完全索引,包含内部对象。
支持查询。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
文件存储格式为BSON(一种JSON的扩展)
可通过网络访问

所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。

模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。

存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。

MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB

在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

小编自己封装的PHP操作MongoDB数据库的数据库操作类源码如下,仅供参考。

<?php
/**
 * PHP操作mongodb数据库操作类
 */
class Database {
  protected $database  = '';
  protected $mo;
  /**
   * 构造方法
   */
  public function __construct() {
    $server = DBSERVER;
    $user = DBUSER;
    $password = DBPASS;
    $port = DBPORT;
    $database = DBNAME;
    $mongo = $this->getInstance($server, $user, $password, $port);
    $this->database = $mongo->$database;
  }
  /**
   * 数据库单例方法
   * @param $server
   * @param $user
   * @param $password
   * @param $port
   * @return Mongo
   */
  public function getInstance($server, $user, $password, $port) {
    if (isset($this->mo)) {
      return $this->mo;
    } else {
      if (!empty($server)) {
        if (!empty($port)) {
          if (!empty($user) && !empty($password)) {
            $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
          } else {
            $this->mo = new Mongo("mongodb://{$server}:{$port}");
          }
        } else {
          $this->mo = new Mongo("mongodb://{$server}");
        }
      } else {
        $this->mo = new Mongo();
      }
      return $this->mo;
    }
  }
  /**
   * 查询表中所有数据
   * @param $table
   * @param array $where
   * @param array $sort
   * @param string $limit
   * @param string $skip
   * @return array|int
   */
  public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    if (!empty($where)) {
      $data = $this->database->$table->find($where);
    } else {
      $data = $this->database->$table->find();
    }
    if (!empty($sort)) {
      $data = $data->sort($sort);
    }
    if (!empty($limit)) {
      $data = $data->limit($limit);
    }
    if (!empty($skip)) {
      $data = $data->skip($skip);
    }
    $newData = array();
    while ($data->hasNext()) {
      $newData[] = $data->getNext();
    }
    if (count($newData) == 0) {
      return 0;
    }
    return $newData;
  }
  /**
   * 查询指定一条数据
   * @param $table
   * @param array $where
   * @return int
   */
  public function getOne($table, $where = array()) {
    if (!empty($where)) {
      $data = $this->database->$table->findOne($where);
    } else {
      $data = $this->database->$table->findOne();
    }
    return $data;
  }
  /**
   * 统计个数
   * @param $table
   * @param array $where
   * @return mixed
   */
  public function getCount($table, $where = array()) {
    if (!empty($where)) {
      $data = $this->database->$table->find($where)->count();
    } else {
      $data = $this->database->$table->find()->count();
    }
    return $data;
  }
  /**
   * 直接执行mongo命令
   * @param $sql
   * @return array
   */
  public function toExcute($sql) {
    $result = $this->database->execute($sql);
    return $result;
  }
  /**
   * 分组统计个数
   * @param $table
   * @param $where
   * @param $field
   */
  public function groupCount($table, $where, $field) {
    $cond = array(
      array(
        '$match' => $where,
      ),
      array(
        '$group' => array(
          '_id' => '$' . $field,
          'count' => array('$sum' => 1),
        ),
      ),
      array(
        '$sort' => array("count" => -1),
      ),
    );
    $this->database->$table->aggregate($cond);
  }
  /**
   * 删除数据
   * @param $table
   * @param $where
   * @return array|bool
   */
  public function toDelete($table, $where) {
    $re = $this->database->$table->remove($where);
    return $re;
  }
  /**
   * 插入数据
   * @param $table
   * @param $data
   * @return array|bool
   */
  public function toInsert($table, $data) {
    $re = $this->database->$table->insert($data);
    return $re;
  }
  /**
   * 更新数据
   * @param $table
   * @param $where
   * @param $data
   * @return bool
   */
  public function toUpdate($table, $where, $data) {
    $re = $this->database->$table->update($where, array('$set' => $data));
    return $re;
  }
  /**
   * 获取唯一数据
   * @param $table
   * @param $key
   * @return array
   */
  public function distinctData($table, $key, $query = array()) {
    if (!empty($query)) {
      $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
    } else {
      $where = array('distinct' => $table, 'key' => $key);
    }
    $data = $this->database->command($where);
    return $data['values'];
  }
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
让你同时上传 1000 个文件 (二)
Oct 09 PHP
PHP语法速查表
Dec 06 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
php 常用算法和时间复杂度
Jul 01 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
一款简单实用的php操作mysql数据库类
Dec 08 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
深入理解php printf() 输出格式化的字符串
May 23 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 PHP
PHP实现的简单组词算法示例
Apr 10 #PHP
PHP实现的大文件切割与合并功能示例
Apr 10 #PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 #PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 #PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 #PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 #PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 #PHP
You might like
浅析PHP Socket技术
2013/08/02 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
jQuery.extend 函数的详细用法
2012/06/27 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
Vue侦测相关api的实现方法
2019/05/22 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
列举Python中吸引人的一些特性
2015/04/09 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
django实现支付宝支付实例讲解
2019/10/17 Python
django的autoreload机制实现
2020/06/03 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
总结30个CSS3选择器
2017/04/13 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
指针和引用有什么区别
2013/01/13 面试题
娱乐节目策划方案
2014/06/10 职场文书
社区助残日活动总结
2014/08/29 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
大国崛起英国观后感
2015/06/02 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
Go归并排序算法的实现方法
2022/04/06 Golang