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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
4 n9 \8 J, _# p5 a* H* |模式自由。
. H* T% D3 g  f支持动态查询。3 u7 Z% U; `5 o: a' R! q- c9 l
支持完全索引,包含内部对象。
; o) u# j! j2 m5 x% c% q( s# @支持查询。
- T: q. k7 q1 m1 ^支持复制和故障恢复。
) y6 G* a# `4 x' V使用高效的二进制数据存储,包括大型对象(如视频等)。
2 y& d8 g1 p  F6 q7 t7 X  Y自动处理碎片,以支持云计算层次的扩展性
0 Q2 Q5 P& m* ^2 M" E支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
6 \) d9 c0 F% C  ~: E文件存储格式为BSON(一种JSON的扩展)
8 p) g( l0 N( b# g+ d4 Y0 u可通过网络访问

所谓“面向集合”(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. <?php
    2 C" X/ r: b9 P. h
  2. /**
    - z- ]: d. L$ q  A, i
  3. * PHP操作mongodb数据库操作类* j, k! x/ E6 @7 v3 b! z$ Z) l+ \
  4. */* _- C; j. @! B1 Q9 p5 `$ m
  5. class Database {, R7 P: U4 _( [" J" m3 F
  6.   protected $database  = '';7 w) Y& H' Z) z% d) a: u
  7.   protected $mo;" ^7 b# f# `1 B- u
  8.   /**8 u/ Y" Z$ M! \# {6 e" L: I
  9.    * 构造方法
    ! N' A4 z6 @9 g+ j. }; H
  10.    */
    2 G3 H6 ?# i3 j$ x
  11.   public function __construct() {
    ( m$ L; e4 O7 D2 o& \( u6 ^
  12.     $server = DBSERVER;
    , {9 n8 x$ c3 C+ e$ O; J0 U
  13.     $user = DBUSER;
    ; s% }4 G* W; ^3 X5 ]
  14.     $password = DBPASS;
    & x* E9 n2 \& N
  15.     $port = DBPORT;0 W0 j$ l7 X' e; X. |  `
  16.     $database = DBNAME;  D3 o! q+ c* E0 C6 i
  17.     $mongo = $this->getInstance($server, $user, $password, $port);1 u: \. O! r2 P( @/ \
  18.     $this->database = $mongo->$database;
    / S3 Q' v+ b& E1 b; a& C7 J; g. U
  19.   }
    4 j5 i+ y. w$ Z9 Z
  20.   /**
    9 _* n7 Z# S0 q  t
  21.    * 数据库单例方法
    : {9 G" i* b7 n; Y6 {5 D" u: G# T
  22.    * @param $server+ B9 P- Q. q- p; {, o8 J. h# ^
  23.    * @param $user
    * T: ^3 S( M# ?' v/ h
  24.    * @param $password# w) [+ e! H! w) _! d& R$ ?
  25.    * @param $port
    ( \. b# ?4 {2 `: u; Z
  26.    * @return Mongo; H; N/ |3 _' R/ a4 E! p
  27.    */
    ( {) ?9 f: e: f5 g8 q3 j3 ?
  28.   public function getInstance($server, $user, $password, $port) {# q+ p% v# ]  [& J
  29.     if (isset($this->mo)) {
    8 O( h% a9 ~* A) `: `: \6 A
  30.       return $this->mo;4 I9 k/ F( _4 @* y/ L' p
  31.     } else {) [5 ]& W0 k" s4 O9 ~, l) C2 r
  32.       if (!empty($server)) {
    / ^+ R* R' B3 c
  33.         if (!empty($port)) {0 I- L$ F4 W9 r3 N( @" t% C
  34.           if (!empty($user) && !empty($password)) {, L, J3 c0 g  o; i6 p6 ?3 S3 X; N
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");8 |7 s% U: C9 W9 {" x9 B: A
  36.           } else {+ o1 v6 m: k1 N: Z! J9 c
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");
    - u9 g$ \+ r3 K+ E: y5 l' b
  38.           }. k' I$ v% B% c& k2 i& v
  39.         } else {6 x7 B$ c5 U6 a* t, C. T
  40.           $this->mo = new Mongo("mongodb://{$server}");4 d+ P9 }, Z, T6 t# u
  41.         }: D+ `( a7 }+ G8 ^) S8 c! e
  42.       } else {
    . A# @  h2 ~! N! z* ~: N1 \
  43.         $this->mo = new Mongo();
    , t- A; C$ M! ], W' y, f7 y
  44.       }
    : ^+ W$ j1 U- }$ P2 t. T$ v
  45.       return $this->mo;
    $ U7 z6 t4 k7 ]4 n  f
  46.     }! m9 V- g, c' ^& C# l# v
  47.   }
    , Y) |* ]& v* B0 J8 V
  48.   /**' E: a; b3 c) j& p5 n) r9 X
  49.    * 查询表中所有数据
    6 U1 v+ |2 K8 w
  50.    * @param $table- y' h/ I% k& n: @
  51.    * @param array $where
    - E" b3 z/ @1 P' D! h
  52.    * @param array $sort" o8 i9 S5 S# P/ \0 r
  53.    * @param string $limit
    $ M6 u8 {  Q* y2 t. `
  54.    * @param string $skip; H5 D# d, ~: a3 F# a
  55.    * @return array|int
    $ w2 ?7 K( M9 Z& w; i
  56.    */2 l! Q/ c5 }% K
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    1 E* W3 S% \0 y/ h
  58.     if (!empty($where)) {/ W. Z% k! w8 d. B
  59.       $data = $this->database->$table->find($where);  R& I8 V$ `! L5 f+ |. S" e+ c
  60.     } else {
    8 m; H1 U0 l/ z; [
  61.       $data = $this->database->$table->find();
    4 s; U9 `) ]4 d" s" @+ G
  62.     }% t5 O8 w; N/ W, ~  n; K. {
  63.     if (!empty($sort)) {" [; r' Y) G' q7 `
  64.       $data = $data->sort($sort);2 l1 E3 U) b  g( R# v. V; S
  65.     }% `0 O, D; L' u0 r0 o
  66.     if (!empty($limit)) {
    7 [2 v+ K: b, @7 \  j( f/ R
  67.       $data = $data->limit($limit);6 A/ G# J# O5 R/ j3 t
  68.     }
    ) C7 |) r9 O. p. J6 n$ z4 s
  69.     if (!empty($skip)) {
    , s- s+ X" W) `- _: o& V) z  P
  70.       $data = $data->skip($skip);5 F! t+ r/ t. u1 b
  71.     }6 [' p2 M3 z" [- o% M0 [
  72.     $newData = array();
      L! P0 c* z$ T- Q: \6 x! ^
  73.     while ($data->hasNext()) {$ v  _' K' K* Q, A
  74.       $newData[] = $data->getNext();
    + f, \# U. }$ }& O5 P  n9 e  W
  75.     }
    ' i( V5 v0 L) f8 f' c
  76.     if (count($newData) == 0) {
    0 E: r3 y1 [' i& G1 Y( x% J
  77.       return 0;- ?! k" \0 K3 B5 y' p4 `
  78.     }
    7 x' M  P' {& T" _( ]6 Z0 \
  79.     return $newData;1 H8 [, m( ^0 I4 M. i! d6 J2 j( w
  80.   }
    4 d9 m/ A$ V! L* y4 R8 c7 M
  81.   /**
    / K6 Z  ^1 _, U5 U1 v6 x
  82.    * 查询指定一条数据
    , w5 ^- ?3 r) c5 }; D
  83.    * @param $table% ?0 V7 G9 r5 [1 ~+ j
  84.    * @param array $where% ]: _5 r, }" y3 I' {
  85.    * @return int
    % H1 Y  g$ W4 I; ?3 V, j
  86.    *// ^3 X2 y% p9 m4 w5 s* l! j; I3 S
  87.   public function getOne($table, $where = array()) {
    . Q& A7 u5 @2 {9 w# G( y5 g
  88.     if (!empty($where)) {
    . P; x) f; F9 `( O
  89.       $data = $this->database->$table->findOne($where);
    2 @! n3 Q0 V+ [  ~! _2 l- `4 Q) }
  90.     } else {! M' K. I" C( }
  91.       $data = $this->database->$table->findOne();
    ' t& K9 y, g. f. _
  92.     }2 f3 T3 h( I- D  D9 d' S% Z
  93.     return $data;3 W1 A$ J; [% r" }6 K2 A
  94.   }
    ) C/ F1 a+ r7 A7 R' K) H- X
  95.   /**
    4 i$ f+ a' s8 I. J' c
  96.    * 统计个数
    * U5 S& M& f- j! J8 @
  97.    * @param $table7 @* C# p! R! U% G9 D7 l
  98.    * @param array $where
    - O, l% z* j' B- q( `! T
  99.    * @return mixed" X0 R6 Q) q2 Z, U( F# |! ]
  100.    */) S! x4 K4 d; T1 n, E) Z
  101.   public function getCount($table, $where = array()) {' `. d$ l' V/ w/ g# c
  102.     if (!empty($where)) {
    ) V  |9 K, A, D( r0 q2 S5 ]
  103.       $data = $this->database->$table->find($where)->count();
    - @" h3 i/ L* b+ \
  104.     } else {$ U$ n' x( P# B8 G% M2 }
  105.       $data = $this->database->$table->find()->count();
    6 `4 o  @! `" p: L  P+ @
  106.     }
    & C6 S7 K- J( r% f" v+ M1 e
  107.     return $data;5 u; A. k8 y8 k, |
  108.   }; ^5 e6 I1 F9 y. h% u) I; @
  109.   /**- s( L7 g9 g6 w5 q* d( V+ O% z( \
  110.    * 直接执行mongo命令9 \% m5 Q+ T2 G
  111.    * @param $sql3 }& k, n  n! b3 |0 ~
  112.    * @return array; Y2 R# _& X7 @4 E- ^& z  o
  113.    */
    2 u, ^1 l9 C5 m/ W4 X! g# V
  114.   public function toExcute($sql) {! @4 c" m" N  Z$ C4 _* z9 D9 h
  115.     $result = $this->database->execute($sql);
    ! o5 o1 v/ y- j$ x# W0 @
  116.     return $result;
    7 Q6 s' Z3 ~2 d4 S6 x) K& e
  117.   }
    1 w; \# d& B* B, ~
  118.   /**
    6 M* B0 C1 x' b  g7 R0 R: t+ x! C! R+ r4 b
  119.    * 分组统计个数
    6 P! l; b6 `2 E3 m4 Y
  120.    * @param $table
    + r  T1 K5 k  X  @8 d- a8 ?# F  N: S
  121.    * @param $where4 {/ {& U& I% n
  122.    * @param $field% b7 U# n( w3 ~1 Y
  123.    */! O5 ~* n: V4 U0 X8 h+ Z( s( X3 e
  124.   public function groupCount($table, $where, $field) {1 q, B5 N$ l  S* x% {  b/ T
  125.     $cond = array(
    : b) ?$ a/ p3 D+ ^- Q
  126.       array(# z8 F9 E! j3 C/ K: D. G9 `4 P
  127.         '$match' => $where,
    1 w8 r% w* F& \; u
  128.       ),
    $ W9 r$ L! X$ h8 f
  129.       array(
    ! z. t1 g1 N- U7 D  K, X' g  o
  130.         '$group' => array(
    0 |& r* G  i8 P. W& X
  131.           '_id' => '% q2 D6 b$ H# g- M# S% {
  132. 1 M9 P+ `: M+ c
  133. . $field,# I+ }$ r; i9 ]
  134.           'count' => array('$sum' => 1),
    1 [# B( F4 ?4 X5 T- w+ x
  135.         ),
    ' E3 G) Z0 Q# u' T* H
  136.       ),
    $ E* }; M% `3 y: p# q2 o7 R0 I7 ~9 a
  137.       array(/ @) q$ E  ~7 Y0 W) W- O
  138.         '$sort' => array("count" => -1),
    $ F8 M6 P  ?3 _7 {6 {' w) S4 l
  139.       ),
    ; U. ^; e+ F& A1 z
  140.     );# h# e7 K( S8 N5 O
  141.     $this->database->$table->aggregate($cond);
    / F( t4 }7 p% C8 |
  142.   }3 O' }8 @- M7 E) c
  143.   /**" \. R; u0 @, h2 g. d4 Z! l4 `
  144.    * 删除数据
      I3 `5 r; y$ j' d2 G5 T
  145.    * @param $table
    + C. ~5 C" _- p* r
  146.    * @param $where
    9 I/ _, Y# u' L, P+ G
  147.    * @return array|bool
    4 P! ?. ?3 P. N& _# @6 w- l, f# K! M- C
  148.    */) C3 Y/ m5 m+ M. I" {, F
  149.   public function toDelete($table, $where) {# ~0 |# ^' H2 w
  150.     $re = $this->database->$table->remove($where);1 u: X0 @2 p5 O- s4 |. F) A
  151.     return $re;
    ' X+ g2 y# ^2 s) K" J1 M
  152.   }
    5 W1 h1 w/ B! D: o# @9 z
  153.   /**4 a9 L# ]4 b) {0 ?
  154.    * 插入数据
    7 z7 I0 h8 A+ p0 G' z: z0 A8 N
  155.    * @param $table. A6 K$ s: |5 u" k# N% K$ A
  156.    * @param $data6 M% U% d7 O) a- {, b  I
  157.    * @return array|bool
      W0 b" n& c/ M' P
  158.    */
    . s. J* F5 O# j6 [+ [
  159.   public function toInsert($table, $data) {, V' J5 G  {$ J. m( i
  160.     $re = $this->database->$table->insert($data);. V" h- T: d" ^: Y+ K; I: w8 e
  161.     return $re;
    5 h$ n3 c& _! h( r
  162.   }
    ; Y# P$ v7 U+ [8 a6 n* `  n# ?
  163.   /**
    ( v  ?6 \0 C/ e. T8 |! J4 J) s
  164.    * 更新数据
    % v! s2 u, ^9 a
  165.    * @param $table: D' m  v, w" k& x8 j
  166.    * @param $where
    + d; y4 B7 F# S0 ?
  167.    * @param $data! H( l9 o6 X6 k) {4 F
  168.    * @return bool
    # p9 S8 E9 u% ]1 P. d# ~, G
  169.    */$ c% n7 A! }+ @: X$ w
  170.   public function toUpdate($table, $where, $data) {
    9 D1 Q) y6 R9 m6 _/ P% z7 R2 Y$ l) \
  171.     $re = $this->database->$table->update($where, array('$set' => $data));1 B- e* i8 q0 T0 U, s. b: I
  172.     return $re;( U; c! K% }) S) L7 E0 ]
  173.   }
    # T' |, T/ h9 j* x
  174.   /**
    5 p7 Q- b7 G% \2 D5 u% s! I
  175.    * 获取唯一数据
    6 q; Q, H0 q, r1 C
  176.    * @param $table
    6 O. [5 s- A0 _% q; ~) F' F
  177.    * @param $key
    8 C5 a2 a9 Z4 A) M6 l( N0 |
  178.    * @return array( p& h! R, v8 j8 y
  179.    */
    $ Z1 Z1 s- j2 c6 l, g
  180.   public function distinctData($table, $key, $query = array()) {% O( N1 f1 v9 E' h6 k: b& h- A* M
  181.     if (!empty($query)) {" F/ Q. q" w1 f0 E+ c
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);6 x2 B. i9 m, a! c2 \, d! p
  183.     } else {! v/ {4 c* a- M7 d9 v. u
  184.       $where = array('distinct' => $table, 'key' => $key);' N# c7 r# M+ G- F* V. d) a
  185.     }$ H, q5 o) S& {3 o$ \
  186.     $data = $this->database->command($where);
    / L0 M! B6 Y  @7 }7 ?4 [
  187.     return $data['values'];
    / z  m) h0 ]5 B- N% z& |
  188.   }
    / w2 I- r0 `" h; r4 b+ ]4 F- C
  189. }7 X; k4 @' H% S  C3 N0 F
  190. ?>
复制代码
  K/ k& v  @8 R
1 L* b" _. C0 m4 S1 a) ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 15:59 , Processed in 0.150291 second(s), 19 queries .

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