您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10942|回复: 0
打印 上一主题 下一主题

[php学习资料] PHP实现的mongoDB数据库操作类完整实例

[复制链接]
跳转到指定楼层
楼主
发表于 2019-3-9 02:49:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

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

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

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

面向集合存储,易存储对象类型的数据。% {5 d1 `* f$ y! e8 B! L  x
模式自由。- d8 p% i) o1 K) V2 U
支持动态查询。/ G( [5 A0 ?4 F
支持完全索引,包含内部对象。! p: }" X5 w8 L' D6 Q0 L9 A
支持查询。0 y7 e$ u* R* ]% L8 u/ s
支持复制和故障恢复。6 A8 k! y6 r5 O( }6 H1 R
使用高效的二进制数据存储,包括大型对象(如视频等)。' Z6 X- s7 H9 j7 Z
自动处理碎片,以支持云计算层次的扩展性
% ^0 z5 o1 ~  d7 C# q. k5 N) m支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ j$ F- e% o$ L( V7 Q/ V文件存储格式为BSON(一种JSON的扩展)1 t; q7 H  g( n* v: d6 D: q
可通过网络访问

所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。

  1. <?php8 }" D6 R, G% U4 C' i
  2. /**
    + M0 W) h1 v! Z. K$ x6 H
  3. * PHP操作mongodb数据库操作类
    ' D  t' n7 I: C# V
  4. */
    ! L8 z: l  X. Z3 \& L1 H6 ^  c5 a
  5. class Database {
    + w+ ?! h3 G9 D1 `% |" k! {
  6.   protected $database  = '';6 L" K  G/ f$ ^2 p4 {
  7.   protected $mo;2 w% O! s. W" U, G. J( B' C
  8.   /**( j9 u4 n; M0 B
  9.    * 构造方法% N& ~( A0 ~' P. s) a
  10.    */
    / p( O# d5 Z8 `( a, W8 S
  11.   public function __construct() {
    " b$ ^5 V- @$ `  @2 o% R, N2 ?
  12.     $server = DBSERVER;
    9 x, D* P' O8 s7 D; i' c
  13.     $user = DBUSER;3 y3 O2 S5 ?. J5 c; Q- ~- B
  14.     $password = DBPASS;
    ! K' i+ n! Z* B  i5 }/ o5 `
  15.     $port = DBPORT;% u9 F/ }& U9 r7 i0 H9 G
  16.     $database = DBNAME;: V/ i9 X& ?: S1 j8 q% y9 Q
  17.     $mongo = $this->getInstance($server, $user, $password, $port);2 H. r. Z- m' ]! E( X- ?  v* `
  18.     $this->database = $mongo->$database;
    : ^. v9 b2 ~' `) g# r9 f
  19.   }" N+ u+ d/ s  }" j  f( L
  20.   /**
    5 z( o# I, ~% x* E; u
  21.    * 数据库单例方法
    7 N0 a# e. H5 d6 r% X2 n
  22.    * @param $server
    . j: N9 f/ n. h+ a$ g- R
  23.    * @param $user) b7 L7 A9 w. I5 |/ A
  24.    * @param $password
    6 K& V+ `. G) a8 Q
  25.    * @param $port
    ! h3 s! b5 I6 L8 R2 o
  26.    * @return Mongo4 j. ~1 m7 o- |) l; J
  27.    */; Z- B6 h/ [! {' ~& s6 y
  28.   public function getInstance($server, $user, $password, $port) {8 N, h! Z7 D9 L) ?
  29.     if (isset($this->mo)) {
    / z9 E8 A4 ^. k" p4 ~' t
  30.       return $this->mo;
    ) T: a* m3 S$ D% x2 o- w
  31.     } else {
      m% G2 H; Q1 \5 d; H; _7 N: v
  32.       if (!empty($server)) {2 f' k- B- t: g
  33.         if (!empty($port)) {
    + Q% q3 Y: c  w
  34.           if (!empty($user) && !empty($password)) {
    ! E' @5 ^: U* v9 v4 V
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");; H& G) s( F6 p; T  y3 d
  36.           } else {
    + f9 f( q' W' X9 [9 Z# B
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");# x6 A: p& @- i$ F: A; M: P
  38.           }
    2 i0 [" E0 S( l: l  m
  39.         } else {
    6 w; O- M# S  ^! g' a+ [5 y2 J
  40.           $this->mo = new Mongo("mongodb://{$server}");$ p/ e8 k5 {) G( ]8 b2 d
  41.         }' x. k0 [+ W) E4 |: c6 k$ X( O
  42.       } else {1 T+ R. C2 g7 H8 d0 v# S* s1 w: F
  43.         $this->mo = new Mongo();: ~' M$ g- j4 ~) d6 W
  44.       }
    9 F/ L0 V0 Z( X0 ]. b% b% I& Y
  45.       return $this->mo;
    , i5 r% a) w- K. A- m
  46.     }: r  C" d; m# ^- M5 }
  47.   }
    " t* V5 I0 G* l: |1 A
  48.   /**4 j% U- Z% V& Q% w4 s9 a, l* d; k' `
  49.    * 查询表中所有数据; U' v( L- W' y9 A6 N  b3 B4 }
  50.    * @param $table( x, F' }- L. ?' Q0 r) T
  51.    * @param array $where/ n  Z) i: \- \9 m
  52.    * @param array $sort
    " w8 ]2 ^4 a5 a" F; I) S! {; c
  53.    * @param string $limit+ p8 j* E8 C; k# C; Z2 }5 \1 e
  54.    * @param string $skip* P8 U) L; \0 C  H  L) f3 a& _  A
  55.    * @return array|int: Q: M* ^3 c2 _( I! b5 b& s% v
  56.    */
    3 n/ _1 S: ?4 F% }+ R6 s! }* H( Q
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {. m7 ?& P2 L. B8 j( {# i( O
  58.     if (!empty($where)) {# Z* g9 X$ t4 U
  59.       $data = $this->database->$table->find($where);
    . e- g0 Y8 W9 W* h9 ?' N' y
  60.     } else {' \/ A( a: V# E. _2 w4 r
  61.       $data = $this->database->$table->find();" B- ^# u  r- f$ W, K
  62.     }
    ( K1 f7 V2 n0 g9 _: D9 t' W9 g% I. C) D
  63.     if (!empty($sort)) {
    3 \1 m4 I  O0 Z4 z* e9 f
  64.       $data = $data->sort($sort);, Z# e' ~0 t! u0 n  B4 r
  65.     }
    7 Q; Y( B: S2 D, }0 C! x: _
  66.     if (!empty($limit)) {
    ; C. B; S2 f4 e/ u* P9 U
  67.       $data = $data->limit($limit);
    5 C; `, T3 Y, z( V1 D2 R: W' d
  68.     }9 A+ y% |8 o2 p. r$ P
  69.     if (!empty($skip)) {& ~& l! }) ^0 a7 [# `
  70.       $data = $data->skip($skip);
    * M- z+ A# H$ p' z. b8 X3 a' P" ]
  71.     }4 {( Y4 W$ s, ?. P: e/ r" x& p9 V5 `
  72.     $newData = array();* I" w( M3 t+ x5 N7 z0 X1 A
  73.     while ($data->hasNext()) {
      a: B2 C4 r( O3 v
  74.       $newData[] = $data->getNext();
    5 Z& S. p5 |* G+ f/ j
  75.     }8 ]$ C0 ?, V2 k6 R' B7 m) |4 {, u
  76.     if (count($newData) == 0) {1 D( h2 ~) T1 z' [
  77.       return 0;* B) ^5 r! g' {4 ]' @
  78.     }
    ) L5 p2 Z( G# O3 h% ^) U: b
  79.     return $newData;
    0 B8 Z' ^0 g- ?* w6 P; C
  80.   }* M% j4 E& L/ a  r4 ]* T
  81.   /**
    3 p4 X2 `; w+ u2 u+ i% i/ ~
  82.    * 查询指定一条数据
    + f# [* ^) b% ?4 P
  83.    * @param $table. N, E! R% n- v  w6 c% N
  84.    * @param array $where
    ; G6 @# J" x, Q% e/ `/ m
  85.    * @return int$ H6 [. U' u4 O7 m& Y8 b
  86.    */- c2 B! x3 A- d
  87.   public function getOne($table, $where = array()) {
    0 }8 x7 J. V% R5 ]5 F4 R
  88.     if (!empty($where)) {: H  [# S3 f# i9 V
  89.       $data = $this->database->$table->findOne($where);
    5 ]. H; u3 k5 `% Q! q
  90.     } else {
    % ]! c1 R! s- j" u
  91.       $data = $this->database->$table->findOne();
    % H& W) P! i  f# r! ~  m9 m
  92.     }
    + O2 }* Q8 {$ I) V5 c# ^4 F2 y
  93.     return $data;
    - c- Q( v, F2 w( f/ S, a8 y0 z/ M
  94.   }+ c$ ]3 H- j- ]
  95.   /**, [9 v& f# Z. f  v/ p( F
  96.    * 统计个数
    1 h- E+ i6 F+ l, k0 W, @6 Q
  97.    * @param $table
    7 `1 G( B/ }; T3 \
  98.    * @param array $where
    , m, Z. C9 \  Y  |; w
  99.    * @return mixed
    # m0 Y5 o) {+ q* A9 e
  100.    */; [$ {' T5 P$ Y# ^% v) q
  101.   public function getCount($table, $where = array()) {5 l/ n5 S. a& t9 M
  102.     if (!empty($where)) {" f% s9 s3 Q; S
  103.       $data = $this->database->$table->find($where)->count();
    $ A2 I  R0 b% r; {5 U& |" Z
  104.     } else {' \6 l) k$ s+ M3 S0 \
  105.       $data = $this->database->$table->find()->count();  @0 O% C9 C3 Y+ a
  106.     }1 t  n, P& J$ Q# P
  107.     return $data;8 A3 y  D" t9 [
  108.   }# g- S8 P3 {0 O$ m4 \: Y
  109.   /**
    + m/ }/ U0 B9 M: o) q3 a# L
  110.    * 直接执行mongo命令1 U2 j- x. X- e( @$ E3 O
  111.    * @param $sql
    9 U. m+ ~# \! F, }
  112.    * @return array& v6 z$ b! z" L7 E$ x, L( c6 y
  113.    */
    9 a/ c1 y- g8 k* i) ^# `
  114.   public function toExcute($sql) {
    ; ?2 ?. a0 @: v+ s
  115.     $result = $this->database->execute($sql);
      q8 z+ F7 W1 p
  116.     return $result;  ?1 ]  w. V8 L0 r, ?4 S2 g) A+ ?
  117.   }
    ' g% V6 ?1 n2 E) x2 l
  118.   /**
    5 h$ k! l' g- d, t; Y
  119.    * 分组统计个数0 z9 V  |& m4 E, a( L/ N" Z  F3 N
  120.    * @param $table
    - q/ J5 ~+ j" d  }. z& s6 M6 n8 X
  121.    * @param $where" X7 |3 e6 ]- _2 d6 J# g7 f* D9 G, Y9 T
  122.    * @param $field  _% v. O, b7 o" U+ X9 @9 ~
  123.    */
    9 v3 r" D+ a- G$ q* y+ v- Y" Z
  124.   public function groupCount($table, $where, $field) {
    9 U  h4 y. |. z: F3 k' A6 w( l  D
  125.     $cond = array(4 T! i; u4 J' p2 X
  126.       array(
    1 A. e* x& L% h6 g$ V  m
  127.         '$match' => $where,0 U, |5 Q0 Z7 ]* ?# c. M
  128.       ),
    : E/ U' B& Q' j4 Q& O5 m1 b7 d' {
  129.       array(
    $ u: j/ G0 Y3 x# K
  130.         '$group' => array(
    1 ?9 W% J: g# c- F: b
  131.           '_id' => '- P/ V5 Q# }  O; A% R- `
  132. 7 o$ S7 D# f: |; b& w
  133. . $field,4 ^, m) P3 b5 j) q6 L( Q
  134.           'count' => array('$sum' => 1),6 [! j; R! k, x  {4 O2 @
  135.         ),
    2 }( r9 ]( [7 f, M6 V: Z0 z. Z0 y& `
  136.       ),
    8 g' @/ L1 S1 y' r. P' h
  137.       array(8 c) Y; E- a6 _+ a9 T
  138.         '$sort' => array("count" => -1),
    9 v. s" D' ^6 S6 J
  139.       ),
    5 T& D4 Y9 M) p/ d$ O7 p
  140.     );
    ' _0 K+ ~  x6 s  ]
  141.     $this->database->$table->aggregate($cond);% `) a  h+ D, _
  142.   }
    # `1 b* @2 ]  l& K- d  b
  143.   /**- _& }9 B! n( t( o, v% @
  144.    * 删除数据0 w& x) I$ s& ^+ t2 [. L5 L% w
  145.    * @param $table8 _' }; V1 T" s1 L7 G0 O( e7 e
  146.    * @param $where. P5 c; z" j  Y% ?2 `: h# K
  147.    * @return array|bool
    + L4 d9 Z, T1 m- s0 }" W
  148.    */9 v7 J$ R- Q2 u& y6 a, o3 j3 I
  149.   public function toDelete($table, $where) {+ a$ `+ b9 v- d1 m* D! e
  150.     $re = $this->database->$table->remove($where);
    , @1 I* X7 y5 s% _8 J
  151.     return $re;- A# o3 a% V: m0 d
  152.   }
    / w* Q5 A0 @' X2 o1 _2 U
  153.   /**2 E" P3 N3 `2 J8 E
  154.    * 插入数据
    - y5 N& Y5 V8 A8 t7 t+ l1 I, F& O
  155.    * @param $table- E+ @( ]! j$ ~4 ]4 O/ ?
  156.    * @param $data
    ; j" ^9 z. K+ \2 ?2 d$ j, A1 C
  157.    * @return array|bool8 N9 F& q% `- A# ]- o  h# n
  158.    */
    0 B# ?" x7 o; |" R1 Q5 `' g* f' v" P4 s
  159.   public function toInsert($table, $data) {
    - ?3 h, {+ ^! t1 |$ T7 E' A  o
  160.     $re = $this->database->$table->insert($data);
    9 o" t# E8 ^2 r0 K' W, r  c
  161.     return $re;
    7 [! l  V$ \+ k9 y/ |
  162.   }! _" Q& n2 j9 W# N
  163.   /**
    2 p: B  K! s+ v
  164.    * 更新数据
    : R- z: T# `- X$ \1 y" b2 E
  165.    * @param $table8 J0 I; K, }1 i( W; Z8 y  y# q
  166.    * @param $where
    6 u1 E  x$ o7 E# Z0 T  |: |* e0 A7 D
  167.    * @param $data
    % A9 [+ v- A4 ?/ Z' x  _" k
  168.    * @return bool5 v4 T% F. Y1 m- l
  169.    */
    . I7 j* y" Y# Q% u0 m: c$ ^
  170.   public function toUpdate($table, $where, $data) {
    ! B# `8 c, D2 q! ?
  171.     $re = $this->database->$table->update($where, array('$set' => $data));2 `" z5 s+ k& Y. {8 [' T* n
  172.     return $re;
    1 a9 G) a9 j1 \% N- T- I* j
  173.   }
    0 S0 b+ _7 y; u- U5 W* r
  174.   /**
    % q" z: ?. N' z7 N
  175.    * 获取唯一数据6 n, s, T" Z0 q
  176.    * @param $table
    # o0 r  H& ~# D$ y; ^& M# ]# a7 V& F
  177.    * @param $key' m. `" S9 N  {' o
  178.    * @return array
    1 K7 s* q- U1 u0 U6 F0 E
  179.    */
    ' v4 t& A: d/ c
  180.   public function distinctData($table, $key, $query = array()) {
    # Z7 w5 t  A/ U8 K
  181.     if (!empty($query)) {9 E' z# s% b. b" W
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);$ f/ \' t2 e* q
  183.     } else {4 l- N8 ?3 m# ?$ P
  184.       $where = array('distinct' => $table, 'key' => $key);
    & W5 I+ X" P, S- y
  185.     }
    ! K$ p& c' V. Z
  186.     $data = $this->database->command($where);; Z6 G+ x! ?! j7 D8 D( ~$ T
  187.     return $data['values'];& \! {& O  S9 p  f8 E! d7 E, I2 h: ?
  188.   }
    0 `! ?) z/ L  {7 W
  189. }
    ; O! u% D- f8 r2 R3 e2 W* o& C7 }
  190. ?>
复制代码
+ G1 I  n+ }2 p
: Y0 m% W- W8 U' R6 \, H5 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 09:19 , Processed in 0.135333 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!