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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
/ j8 R8 U7 K$ K' i( F/ b9 A模式自由。! }$ y; {* ?( B8 k- b
支持动态查询。
' F, n! t* |, S$ O1 ^! `5 t+ a支持完全索引,包含内部对象。
, h6 w% h, f2 F; t; U9 Q支持查询。* f3 L7 ]( L5 j: B) a
支持复制和故障恢复。
5 J1 P8 H4 H8 W9 P使用高效的二进制数据存储,包括大型对象(如视频等)。
0 H+ j1 P; s2 U自动处理碎片,以支持云计算层次的扩展性! j! O. |( f  v- D* P' T
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。. F8 m2 L# c$ v$ \9 l% v
文件存储格式为BSON(一种JSON的扩展)+ S) x! _- }- x6 S3 }& t
可通过网络访问

所谓“面向集合”(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
    ) ?; X6 l- Z4 v$ F- s5 c: o' f
  2. /**
    " q) _6 f9 v  K! P- `9 O
  3. * PHP操作mongodb数据库操作类. y. j7 w: e/ a8 N8 z
  4. */5 q) E2 ]' p9 f4 b8 |* _
  5. class Database {
    4 J# Y& `* D  a% ]0 n3 i
  6.   protected $database  = '';
    * G- N) i+ [1 D6 ]. j
  7.   protected $mo;
    " A5 P7 [; ^' o
  8.   /**
    : L* d( O" ^( X: i7 y, U
  9.    * 构造方法
    ! s- U) K, d# j) d7 I! ~& O# T- ~9 D7 I
  10.    */9 N1 p+ B" x7 W/ v. c  V
  11.   public function __construct() {; H4 Q7 N" P1 r$ @9 e
  12.     $server = DBSERVER;, T! w- f3 p% B3 [( j
  13.     $user = DBUSER;# _3 B, N3 H7 [& b& Q( O
  14.     $password = DBPASS;
    , x' }& j5 L4 s& i0 ]( C
  15.     $port = DBPORT;
    ; c+ ?3 y/ W9 g$ |" P2 D
  16.     $database = DBNAME;
    ! i1 z* d7 e' F! C" k4 k7 M# b
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    " I3 D, ~1 N  x: }* \% u/ ~
  18.     $this->database = $mongo->$database;
    ) \1 \9 G+ n' I
  19.   }
    ( C8 j# D, z/ B- i* O
  20.   /**4 o7 d5 ?% @: n/ k) |
  21.    * 数据库单例方法4 N$ T5 b  Y& N" e: U
  22.    * @param $server
    ! U8 W4 Y5 N7 I/ t6 H+ w" ]
  23.    * @param $user
    9 J5 ~7 u  b, |
  24.    * @param $password) M0 _" U$ i2 U# Q/ M& O! b4 t6 I9 Z
  25.    * @param $port
    . a+ e# y0 u. B  \
  26.    * @return Mongo
    & ]: S: `" e8 B0 u) `0 F) P" {1 c
  27.    */
    & s+ x9 Y" r7 N3 x& S
  28.   public function getInstance($server, $user, $password, $port) {
    , U  ?% j* }0 _6 a# T+ r
  29.     if (isset($this->mo)) {$ s+ C1 j, S# n' u- m( r( ~: n1 _" a) j5 ~
  30.       return $this->mo;
    / T, ~; s  X$ E& p' }: K
  31.     } else {
    ! ^2 [1 b& ~# h/ B
  32.       if (!empty($server)) {3 H, q( r' s4 v! R
  33.         if (!empty($port)) {6 B# m* y5 k; C5 g
  34.           if (!empty($user) && !empty($password)) {
    & o6 Q, l8 [( a2 ~
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
    & o2 U2 @/ X6 p  f% l' \
  36.           } else {
    6 ?, H" ~  g# u, N0 [8 ]
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");
    + q5 M2 l# W9 v6 W
  38.           }
    ' h8 p: V' l* Q2 T7 P. x9 R" V" s+ N
  39.         } else {
    2 k* g# ]0 V: A! O/ K" r" `
  40.           $this->mo = new Mongo("mongodb://{$server}");0 Q+ {; t. {( H8 i! y6 ^
  41.         }" [* _, v; n) ]9 e' Z% W- V
  42.       } else {7 C- u6 a7 w6 w2 I0 M% r0 n
  43.         $this->mo = new Mongo();
    ) q. J- V8 o, g( V, o1 w% @1 W
  44.       }
    " G- N& Q0 e! S& ~
  45.       return $this->mo;+ W/ W2 d" [* D' o6 {; R/ d
  46.     }0 \0 G+ ^/ H; D9 ]  L7 |6 p
  47.   }' P  W! k* d# B3 ~: i
  48.   /**
    1 R  y* T1 [+ p+ n# ?5 B
  49.    * 查询表中所有数据
    ) U/ Z; r* k. q, E! u
  50.    * @param $table
      g% R" S9 [6 T; p
  51.    * @param array $where' a" b& [! R( K* [9 V; q& g0 n
  52.    * @param array $sort( y* c0 [% ]7 ]" q, T) Y6 w- K7 p
  53.    * @param string $limit, q3 P8 l1 Q, j$ }- P/ Q! M
  54.    * @param string $skip2 u5 Z& A' V" e- x' g" ]/ N2 ^  \
  55.    * @return array|int
    : Z- g/ w2 y" F7 c
  56.    */. }$ Y% T8 i' n0 P: B: i3 y9 v: W
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {* U3 z9 {! q( ]; D: g' \. n, ?5 Q9 B
  58.     if (!empty($where)) {
    ; T6 n0 Q7 E  \* F3 i3 b/ d
  59.       $data = $this->database->$table->find($where);9 i3 W$ U! z+ X2 b; [, V
  60.     } else {
    ; F0 T3 F  A& j! N* A
  61.       $data = $this->database->$table->find();8 q3 L1 [0 |& u
  62.     }
    + I9 F. A5 T" r8 z8 ~) X  D
  63.     if (!empty($sort)) {) K9 p$ E0 B& P; f
  64.       $data = $data->sort($sort);
    0 d2 i, U/ x5 S9 A
  65.     }
    : v0 g7 A) J8 a  b3 Q! o
  66.     if (!empty($limit)) {0 o  P) l' D, q. t9 j- J* F6 K, i
  67.       $data = $data->limit($limit);7 G5 N! q: k( D6 J9 F- I$ N
  68.     }
    / p2 [! g2 b8 Y: s" t
  69.     if (!empty($skip)) {; ~* P! u- ^* T+ Q" j( f
  70.       $data = $data->skip($skip);
    ) L3 s, t" e. {, t
  71.     }: ?7 p0 X( R. d9 D7 \- r: y
  72.     $newData = array();% J6 Q0 G5 G( L  D
  73.     while ($data->hasNext()) {
    ! O, ?' J( C+ c& n7 \& P
  74.       $newData[] = $data->getNext();
    7 q. p+ {, \2 D4 S
  75.     }
    5 O8 a5 o( j' Q- V5 o  m8 H6 c
  76.     if (count($newData) == 0) {
    ! D, U2 P: J& u# H7 e# q  K- I) [
  77.       return 0;  J$ o8 F0 q# J, j
  78.     }5 }- p6 ~1 r1 I0 [
  79.     return $newData;
    ) C$ ~  H6 Z4 J! X2 O+ h
  80.   }3 I7 A8 Y+ ^* R" u7 m9 o  i
  81.   /**
    5 m0 g" M  ^- y$ x7 N
  82.    * 查询指定一条数据
    + C2 f- D6 F' {0 k5 }& B2 f0 ?
  83.    * @param $table" t1 F4 l" q0 x3 i; V, @* F0 ~
  84.    * @param array $where% z6 n! h; y0 N  v8 V
  85.    * @return int
    / N% T- t( ~, R& f( t! F4 a5 G
  86.    */& q- M) \7 _' o  [0 b! Z
  87.   public function getOne($table, $where = array()) {: c! G0 i% L  O' ?, C% B
  88.     if (!empty($where)) {
    9 y% T+ T, L3 V( u7 h
  89.       $data = $this->database->$table->findOne($where);
    ! I/ J* u9 _+ P: {" n! _5 F
  90.     } else {1 K; o" P5 }; C
  91.       $data = $this->database->$table->findOne();; H! i% H8 w6 g0 k' K: C% r# i% _
  92.     }, P+ C! R& K" I: K: r3 [
  93.     return $data;0 j% j9 C7 s: F" c
  94.   }
    ! @3 P8 [9 ]* B* n
  95.   /**
    / u; g2 b% [5 \0 u
  96.    * 统计个数3 J" y& y- Q8 y: Z4 G2 P6 W  ^
  97.    * @param $table
    & T& V% m$ a0 I3 {7 A/ u: g
  98.    * @param array $where) B9 [, Y0 Y! B; y  X; @& Z/ A5 X3 K7 n
  99.    * @return mixed
    6 v: C5 L/ B' O
  100.    */6 c( [& N! b2 f& ~6 I# t$ ^
  101.   public function getCount($table, $where = array()) {% p, A4 z) V# S, _
  102.     if (!empty($where)) {) W5 u" Y! g( R, A0 x5 B
  103.       $data = $this->database->$table->find($where)->count();0 c  V% C1 X& L) X( \
  104.     } else {
    , T4 m. L" x% x3 L- b" ~. G) q  w8 I0 @
  105.       $data = $this->database->$table->find()->count();
    : T8 g: Y# U' _' M: R! o
  106.     }
    . o- G( V+ W% v
  107.     return $data;
    + K/ T, [( b; ^$ m1 j& `
  108.   }7 \# ]! \: M1 q% [- N
  109.   /**
    + @, |# j, g9 N  }! M/ L& [( K: P
  110.    * 直接执行mongo命令
    1 x" e* L, m7 d/ N' T# u( f) v
  111.    * @param $sql
    : u! a1 `( `7 R
  112.    * @return array: d+ y8 W1 U& |9 D* i
  113.    */
    " ~+ b5 I( x! Y. d/ i
  114.   public function toExcute($sql) {8 ^* f3 T) ?7 F  [
  115.     $result = $this->database->execute($sql);
    4 V# i. [1 C2 O6 H5 t+ x
  116.     return $result;
    . ]  [7 V" \! }8 J' t
  117.   }
    ; J$ S* O' j* E# y
  118.   /**1 C; y, p* _+ l$ U
  119.    * 分组统计个数4 W/ K2 Z, C2 y2 t& c, `
  120.    * @param $table% ]! v; v: Q: E" \
  121.    * @param $where1 {; T  V( V: Z- E. ?1 `- I
  122.    * @param $field9 k, W! i+ q3 r/ f
  123.    */4 Z, {$ l- r+ r  I9 u% ?7 [
  124.   public function groupCount($table, $where, $field) {
    % m+ y* v* P- V4 H! o. p9 H, I
  125.     $cond = array(5 T0 A/ `( Y3 T' z
  126.       array(( E5 q) U! a- p$ R6 U
  127.         '$match' => $where,- |3 J0 M6 ~7 {9 X+ c! }, s
  128.       ),
    . g( h/ b  ^5 Z1 |  I
  129.       array(
    . `0 i, }5 W5 A
  130.         '$group' => array(
    4 k: N+ x+ d  k) P
  131.           '_id' => '! G! V$ |  C7 {
  132. 7 K- Y+ g3 d- A5 D0 J
  133. . $field,
    / u$ k# o, P0 \+ X
  134.           'count' => array('$sum' => 1),( u+ a: n& g7 x) q- u: j7 c, r6 ]
  135.         ),  W! n1 O/ ]# X" b) o, p' p
  136.       ),0 Q/ t  d3 j5 y# X* ?9 t2 i) U
  137.       array(3 c5 Z3 I# H# v- f/ A! S, R6 p
  138.         '$sort' => array("count" => -1),+ ], \8 c' }  f) n2 O1 p, N; p& k
  139.       ),6 R  J7 M7 u" E3 K+ X, f2 D+ A
  140.     );
    # K  B! v2 \; M3 |. G. }& N
  141.     $this->database->$table->aggregate($cond);: Y5 i* s. ?) s  r+ g
  142.   }# W" o3 F7 H6 N7 |) R
  143.   /**! V' p. r2 N% x. W! N$ q- q
  144.    * 删除数据
    5 O/ \3 M0 k, x2 O$ Y1 s
  145.    * @param $table. ?) p( l& G% r9 u, p* u
  146.    * @param $where2 N6 i' f5 W- t7 ]: E6 ^# Q
  147.    * @return array|bool
    ; u, c% ~% g: k+ X
  148.    */
    $ ]9 I7 A9 F' ?
  149.   public function toDelete($table, $where) {
    ; A7 S6 O% D& U8 x! a9 q
  150.     $re = $this->database->$table->remove($where);# I. z( J) `# o! Z- V" `! i2 q
  151.     return $re;2 i  V: Q5 p3 Y6 Z% I& r7 v
  152.   }4 B, |) X" z0 X$ c' j
  153.   /**! I( c. y6 g- |' w! X% r- X
  154.    * 插入数据
    8 i/ G  x3 ^. F
  155.    * @param $table
    # h9 X9 n' V5 h( q
  156.    * @param $data
    3 E# H# g2 m! p* ^: z
  157.    * @return array|bool+ ?( Z' Y5 j$ Z6 B$ z: V/ Z5 V
  158.    */3 P% o. r9 N' o" b1 u
  159.   public function toInsert($table, $data) {
    6 p9 G. P# V5 x: N
  160.     $re = $this->database->$table->insert($data);9 \$ g* ]  q4 O3 H. J9 c" I8 [5 C+ t
  161.     return $re;9 q& Y* l4 u3 n/ N8 _+ |# e  ^* n) P1 A
  162.   }* T. I% b* ]$ X" r  O6 j
  163.   /**3 L3 T3 z! `, c$ E
  164.    * 更新数据
    ! \. j% e* A" ]3 U' F7 r& E& O
  165.    * @param $table
    5 {6 T% r! H7 q4 U- k: Z
  166.    * @param $where
    / t$ \" r5 f5 Y) N/ t
  167.    * @param $data+ N6 Q5 V3 @+ Q
  168.    * @return bool
    ' Y& C" Z5 ?, F. c2 _' [& Q9 p4 ^3 Y
  169.    */# ]6 e% Y8 s9 |+ H2 M. w5 {0 Q
  170.   public function toUpdate($table, $where, $data) {
    " c$ B) O% z4 i5 t2 _8 x
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    3 _$ }7 R. Q) k
  172.     return $re;4 n8 i' ?" ~2 j/ H
  173.   }. ^, t7 w, m4 z2 ~. f0 g& S
  174.   /**
    $ z) l1 r4 o. Q" R( l% m
  175.    * 获取唯一数据
    . j: c; Q0 S$ G! s* u" c: h" a) {) @
  176.    * @param $table! [* s& D3 K% x2 B( L6 X
  177.    * @param $key
    , E- R5 V) i0 h# G6 z1 }
  178.    * @return array
    7 u- P' ?2 x& N7 F; Y
  179.    */8 a1 b* i8 U7 A( G0 q, u$ |
  180.   public function distinctData($table, $key, $query = array()) {
    % b  i2 P* @1 V: l3 y  m
  181.     if (!empty($query)) {
    0 Y# H/ x4 \, d( \2 @
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
    " d$ A  ]7 z. L' l; u+ U
  183.     } else {
    - U# W6 e1 Q5 `  B
  184.       $where = array('distinct' => $table, 'key' => $key);' q7 R% \- F2 T/ B5 r/ w4 P. n+ z
  185.     }
    , K8 E, {1 X6 B- F: h4 W0 v
  186.     $data = $this->database->command($where);
    7 C6 S" B) q. n
  187.     return $data['values'];
    - ~9 A5 N3 M0 Z# n
  188.   }
    # l) X" r- U: t, R8 {
  189. }
    # `  f% S' n* N
  190. ?>
复制代码
6 l  q+ ^7 `4 X. ~
7 {0 X) I: k# _+ Q! A! C) @1 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-28 22:48 , Processed in 0.123010 second(s), 21 queries .

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