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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
1 t! \7 d7 U( Z9 R6 P8 G9 j模式自由。" p1 w# E0 C- ?6 l+ l( Q4 y
支持动态查询。6 o- z% J, d7 ^$ T$ W5 T' a
支持完全索引,包含内部对象。5 z4 s' K5 @5 K) u5 S* r
支持查询。, H$ P( o! @2 R5 H6 n% `
支持复制和故障恢复。
0 ]% x  N0 F5 ~4 U! d" x使用高效的二进制数据存储,包括大型对象(如视频等)。/ D. ?  S/ O5 D6 o3 y5 k
自动处理碎片,以支持云计算层次的扩展性  L& X! ^' I  K* {: V) B& K
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
; b% r' l" S, Q) e! F7 D1 w- J文件存储格式为BSON(一种JSON的扩展)
$ K- ?; \+ C7 ?9 N! W1 @' K可通过网络访问

所谓“面向集合”(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
    * z" R  ?6 U$ e/ S) f  r
  2. /**
    % C1 s" Z+ f* L' u" h9 `1 i) j
  3. * PHP操作mongodb数据库操作类
    5 O4 r( `: ~6 V+ M* ]4 H  ]# E7 R
  4. */
    3 ~0 u+ d" Y" i1 R+ `8 r
  5. class Database {
    4 Z9 ?% ^& C& q6 F/ i& p
  6.   protected $database  = '';
    - F1 @/ O5 J( I) D8 j6 u' s
  7.   protected $mo;
    ; R6 R/ N/ X1 K6 A" u, q- A
  8.   /**
    1 [5 k; ^, a- @: d3 G* `% U8 F
  9.    * 构造方法8 s* O( j7 b0 O8 U/ }- ~$ ]5 \) M
  10.    */5 l. a; \- e& [+ N! ?- V/ s4 P
  11.   public function __construct() {
    % x5 E- p9 U. ]; F
  12.     $server = DBSERVER;
    " u6 Y' }- V6 t1 {- z0 x! @0 e: Q
  13.     $user = DBUSER;5 Z7 ]8 q$ Z% h/ p; L- E: W
  14.     $password = DBPASS;: B: V4 T! V/ o& e( I- m9 P7 {
  15.     $port = DBPORT;' q- [+ d8 F# o: w) t, P7 k
  16.     $database = DBNAME;, m4 P% z/ W6 g2 h! Y  m. D" U
  17.     $mongo = $this->getInstance($server, $user, $password, $port);0 K1 {1 V, J1 Q
  18.     $this->database = $mongo->$database;
    1 J9 q$ I3 I* D( B( P6 B# r
  19.   }
    9 v. {& t/ ?$ c0 k2 i( m
  20.   /**# ^( m. C* I7 v( n" {% q
  21.    * 数据库单例方法' I+ ?. a3 Z1 r3 d, w$ a, B
  22.    * @param $server
    * M  n* m6 T, o- m- Z; S
  23.    * @param $user$ d8 L. b! `* ^6 j5 d
  24.    * @param $password/ i7 N2 ?; y' J0 K) U, u; b
  25.    * @param $port5 n! S- x& U# N. A3 P
  26.    * @return Mongo
    4 y4 o& ^- `$ m8 r6 @
  27.    */
    5 R# ]/ D5 k( S  D7 [. C- j' ]$ ?
  28.   public function getInstance($server, $user, $password, $port) {
    / g/ `: @1 j6 ]/ Z& a( W* L
  29.     if (isset($this->mo)) {5 P+ q/ _% \. O) y6 H5 W* N# }
  30.       return $this->mo;
    & H9 f: u% Y  t- D# K& d
  31.     } else {. }# z! Z7 g5 ]% @5 B8 b7 x
  32.       if (!empty($server)) {
    : r, R; }! O$ ~) n" y9 o; U8 t, Z
  33.         if (!empty($port)) {0 D+ [' s; R) n" F
  34.           if (!empty($user) && !empty($password)) {
    5 b+ o& a* e0 ^! l! @
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
    4 c  S& K' P# e) q+ U+ }' `' ^
  36.           } else {
    ) w( w$ f# V, z. C+ _5 O( K
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");) f9 M6 x& O# z. z8 |$ W* w  P
  38.           }+ D/ e  x7 C4 d, P2 C- R$ V# V
  39.         } else {& q3 b: P& r: r2 W3 R& _( \
  40.           $this->mo = new Mongo("mongodb://{$server}");1 n) O! p! a3 y% c$ e( i: \; O: J$ g9 p
  41.         }
    0 Q2 I! C/ `+ u3 S1 c( R: i
  42.       } else {
    1 F9 H- e4 c9 r5 L# c1 u  }
  43.         $this->mo = new Mongo();2 ]/ K# c7 E: t, \
  44.       }
    $ u% i- H6 T1 _2 z
  45.       return $this->mo;
      Z1 M- x$ f; J2 w0 M4 B
  46.     }
    " W: Z9 G9 Q4 _( ?, N/ U! C; N
  47.   }: i/ ^2 I' _& g" x: U5 D
  48.   /**
    1 S5 M' g1 B- r+ S/ ?9 r# a, _
  49.    * 查询表中所有数据
    ) P. B. A: J) Q5 ^0 V, w
  50.    * @param $table* [$ [& B& S) Y4 o' m3 w# `' ?# s
  51.    * @param array $where* J* Y) f' l, s# a3 {) ^
  52.    * @param array $sort; F" B1 b7 T$ X8 h/ d9 ?
  53.    * @param string $limit
    8 B: o' [* u7 Q; j3 [7 \
  54.    * @param string $skip
    0 H4 {$ l) H& A
  55.    * @return array|int* P* O) j* a) v8 c6 R/ y" @. X+ [
  56.    */
    3 O+ t% ?, [8 B6 h/ n% e1 ?
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    5 U8 ^( h: O4 H& l8 J' K' W
  58.     if (!empty($where)) {
    4 t: w+ l) f; Q2 j2 K; ^# L
  59.       $data = $this->database->$table->find($where);% D6 g# N1 s  [5 j; _. e7 t5 \
  60.     } else {
    0 z$ v5 g& r2 B$ Q4 M1 B1 p2 y
  61.       $data = $this->database->$table->find();% z" Y+ F; P: {, j! Q  p) d
  62.     }: a# H7 p9 v+ ^$ }; @% H3 F
  63.     if (!empty($sort)) {
    9 E' B+ }2 M; D/ l  s' B
  64.       $data = $data->sort($sort);% |! @8 @4 k1 A
  65.     }  ~+ {* [. e+ m. A$ m
  66.     if (!empty($limit)) {
    ! o; B2 `! f8 H/ h
  67.       $data = $data->limit($limit);
    1 i8 Q! |3 ^6 F* v9 V
  68.     }1 y: v$ ~9 l. Q  ^' t0 u# g
  69.     if (!empty($skip)) {
    0 X( R' K3 R: t8 w5 T6 J
  70.       $data = $data->skip($skip);
    % H9 ~6 e' `# B8 i- w
  71.     }
    6 a: L+ V! Q) E) C& r9 e; P
  72.     $newData = array();
    - k2 Y) Z+ N4 l) `2 X
  73.     while ($data->hasNext()) {
    . S/ Z7 T  j6 l6 j* o, b; H
  74.       $newData[] = $data->getNext();6 @3 I# X5 ?3 t0 n% o( S
  75.     }6 Z; I0 c# U: ~) q9 a3 e# H
  76.     if (count($newData) == 0) {
    + }; ]8 y/ F/ U% f% l# m6 v6 a' c, Z
  77.       return 0;  E. w' G1 g: e0 {$ T
  78.     }
    # r0 ]0 ^0 X/ O* B" d4 T2 u
  79.     return $newData;$ {/ W6 n: i7 ~* S; W6 f
  80.   }* c+ d# w  Y" n9 \
  81.   /**
    4 U" {2 z- |0 n6 _  [
  82.    * 查询指定一条数据
    - r. {7 y7 D) e* t4 K4 p
  83.    * @param $table, m& G8 w; b. ^9 O; T6 H/ y, }
  84.    * @param array $where; `, I" g& r& B+ T% ?& X- E8 x2 r
  85.    * @return int
    8 d* Y$ W: W7 R- r& l  }
  86.    */
    + T) h; o2 z1 ?  e5 B2 c! F
  87.   public function getOne($table, $where = array()) {, D, E, ]8 y6 {6 S$ ~% C6 E4 k
  88.     if (!empty($where)) {
    . X: a$ ]! j4 U
  89.       $data = $this->database->$table->findOne($where);6 t- v9 w5 E/ j: N* {- V4 ^# P! R& b
  90.     } else {8 Q+ A. G" ^3 {& J, [& B3 O6 k
  91.       $data = $this->database->$table->findOne();
    $ Y) L0 T- b5 W
  92.     }' m# T4 w3 _2 I4 {2 }( N) B
  93.     return $data;8 b6 S. r; t/ c/ `8 v! f/ P, H' i
  94.   }3 d0 l; m' |4 p
  95.   /**; `: h  m0 F" p9 F1 m' l
  96.    * 统计个数6 R2 e- p0 W6 @+ t. C
  97.    * @param $table: d* P& k, e. m# B
  98.    * @param array $where
    4 A- k3 X1 s5 i+ l* `- |
  99.    * @return mixed! {7 p- V8 g4 p
  100.    */! H' C( v$ z+ J" m2 N% B9 ]$ n
  101.   public function getCount($table, $where = array()) {4 a, ^0 c$ H4 w; @7 P( o1 V2 L& C
  102.     if (!empty($where)) {
    4 }8 T0 k( M* d6 Y
  103.       $data = $this->database->$table->find($where)->count();5 a0 F# D5 I8 k1 x6 r
  104.     } else {) X( c( M7 V/ m5 O1 t8 k
  105.       $data = $this->database->$table->find()->count();9 Q- z0 C( T6 R. M% `
  106.     }0 k) K% e& c/ |. U5 T5 ?* x0 S, [! a
  107.     return $data;/ h: W/ N' |0 L  l: u  ~
  108.   }6 z0 |% l# q9 a( M0 X
  109.   /**
    , b% T0 [5 I6 X. z5 {1 I3 M
  110.    * 直接执行mongo命令" ]! a9 k9 p1 n& _5 T! D. ~7 ]
  111.    * @param $sql: p$ f$ r. o1 h6 A# J/ d
  112.    * @return array9 j+ b7 Y" m3 ~1 z4 D" `
  113.    */" H" U2 c; C5 Y7 _; R$ b
  114.   public function toExcute($sql) {8 N, R" f  u! S8 X( [
  115.     $result = $this->database->execute($sql);
    3 M7 r8 u2 W: k( l& @, E+ S
  116.     return $result;
    ' t) I; z# o% e* W0 f/ V
  117.   }5 Z. u3 K* x* ?6 N" D6 E( m) c
  118.   /**. U; N: S- B. B7 S
  119.    * 分组统计个数
    # z6 N( E* L# e! {0 v& o: @2 a
  120.    * @param $table
    4 O2 ~1 A. o! z% k4 g/ }. ~! u
  121.    * @param $where
    - }" p7 ^4 S( h2 V& X+ e% Q
  122.    * @param $field! w8 [6 X( _9 }: P/ ?$ |$ S) i
  123.    */! Q2 i  ^0 Y+ J; p
  124.   public function groupCount($table, $where, $field) {2 z; h. N* k  J7 o# |
  125.     $cond = array(
    " n8 P& q3 g' B& a
  126.       array(/ v, T8 }3 E. H8 ~6 m0 v$ `" U/ V
  127.         '$match' => $where,
    ! [2 N* {7 v! f: [' g
  128.       ),
    ) D. s2 F* e# x- ~
  129.       array(
    % x0 M; C7 \( y5 [
  130.         '$group' => array(7 ^" N. p5 e9 g$ i8 ?
  131.           '_id' => '
    + }/ P* |' }# s, ]* f7 i

  132. ( i2 h& y& B- R- y/ A+ p
  133. . $field,
    6 f7 o5 a: `3 D5 h, ]
  134.           'count' => array('$sum' => 1),/ b" P8 A0 v1 Y; D# z! L
  135.         ),
    9 m9 a. e+ S0 r, R9 D( w
  136.       )," ~6 z# C9 ?" A( J& v1 {0 }6 C
  137.       array(6 r1 v3 O: j! `
  138.         '$sort' => array("count" => -1),
    ' b+ e% f6 q& |. V# O
  139.       ),  b( \- a4 x$ h6 L# q
  140.     );2 |/ }$ }, k# j; e2 n" ^; M  b
  141.     $this->database->$table->aggregate($cond);3 X% `# Y$ ~' @) U
  142.   }: d; Q( Z9 S  I* H! Y
  143.   /**
    , o, H" @! c8 W4 v
  144.    * 删除数据" y% m6 k+ E( V4 i# S; s
  145.    * @param $table
    . r3 z+ s; L% q9 n1 o1 T1 T
  146.    * @param $where) ~2 w1 _3 @# q, Y) e  ~" C% u
  147.    * @return array|bool% |$ \; l$ P: N' L
  148.    *// z$ ]/ V+ T4 V6 z
  149.   public function toDelete($table, $where) {8 |. k% Q- L8 ]
  150.     $re = $this->database->$table->remove($where);& d) M, ]2 X  _- ]5 r) V# F3 _
  151.     return $re;
    ! t4 {* b3 z! q# o
  152.   }3 F7 \" j- r0 U; t
  153.   /**: _* y8 t5 G1 U: v2 N, P
  154.    * 插入数据( Z8 A6 U: m( {7 W
  155.    * @param $table
    % O0 e0 |' C4 D( A
  156.    * @param $data+ J( P$ A: L" Y3 R' {
  157.    * @return array|bool* \) G$ y- _; v* D3 R
  158.    */
    # g- o7 k. [1 K7 i- _' q
  159.   public function toInsert($table, $data) {/ m# @% D+ K, t% s% M3 O
  160.     $re = $this->database->$table->insert($data);
    # L! w1 i6 L' d6 w9 ~/ d" _
  161.     return $re;
    ' x# d7 f, a/ H# ^
  162.   }! B$ Z; a( d/ O' L$ G/ C
  163.   /**
    # T0 K, ?: Y! b, ^! I1 m
  164.    * 更新数据
    ( R9 ^* s' u9 I7 g2 H
  165.    * @param $table6 H- O' Z3 A6 }& ~% s  v
  166.    * @param $where
    , o  ^7 q3 E8 z
  167.    * @param $data6 a% P$ f6 ^( d2 m
  168.    * @return bool
    ) r+ J, `( c, K
  169.    */( m, B; ~$ O2 o7 i4 ?4 B" g+ \
  170.   public function toUpdate($table, $where, $data) {; `7 _# N" K6 j0 u  }' q* e
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    4 m6 v+ S( Y: ^, x' {. M& x& n4 v  O
  172.     return $re;* E4 n, ?/ Z1 A" v: k
  173.   }+ ?) c* x# @  f- Y3 l
  174.   /**
    ( ]/ l& M8 y8 j8 l, O. l
  175.    * 获取唯一数据
    % Z' ?9 p. ^8 }! c6 j9 p4 ?
  176.    * @param $table/ `! |1 u; X/ v6 B8 y
  177.    * @param $key
    7 g6 b8 W! T2 j& g% V
  178.    * @return array
    0 Z* [/ P% t7 k# [% I. N0 _
  179.    */
    $ ^/ y/ w( f/ ~/ D1 D
  180.   public function distinctData($table, $key, $query = array()) {
    ) K  u5 O+ i6 K7 ?8 g& `
  181.     if (!empty($query)) {3 u" e0 m0 O/ c$ S
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
    * ?, D7 S6 ~4 `# i. M+ O% P
  183.     } else {2 X3 u. [, G2 b% G0 g
  184.       $where = array('distinct' => $table, 'key' => $key);. m, J% ]  G  S. y4 [8 F
  185.     }5 k$ ~9 T+ w% Q  W. B4 P
  186.     $data = $this->database->command($where);
    7 a$ x0 ?& i% u+ r. @* J/ d
  187.     return $data['values'];2 ^' L) [" W0 B- ]& m% @, g
  188.   }- E7 p5 V! H" B
  189. }% a% _: P' p2 a. z
  190. ?>
复制代码

+ O9 @4 g* |  ~0 }" Z
4 i! [: S. e  T7 u* ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-2 00:47 , Processed in 0.134015 second(s), 19 queries .

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