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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
/ I! ~8 @- a) J/ D$ u4 s9 X  [3 T模式自由。) m! i; i6 y7 M9 h* V8 O- Z
支持动态查询。2 g% m* |* F8 `; Y: G" U" J, D
支持完全索引,包含内部对象。1 j, O* S6 J1 K8 x2 O/ w5 v! b0 I/ l
支持查询。& r- x4 I1 D+ N) m' }2 l
支持复制和故障恢复。
& z( o7 b- m1 C1 j; W使用高效的二进制数据存储,包括大型对象(如视频等)。
2 ?1 @0 y+ S8 p0 N+ B* g自动处理碎片,以支持云计算层次的扩展性# q6 d( ?+ n6 ~# M
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
, E0 V. T# l4 G3 i2 V文件存储格式为BSON(一种JSON的扩展)
  K/ t, J9 j0 F) f( C9 N" n可通过网络访问

所谓“面向集合”(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& K" S, y$ `) u' k4 d7 O
  2. /**
    7 o' j$ E) Q& V7 A1 P& `5 x! V
  3. * PHP操作mongodb数据库操作类
    . e9 K% c/ d; B& D( R
  4. */
    - J7 d# c) \* j& r+ V
  5. class Database {" R! u. j" Z) T( V7 O' }# k
  6.   protected $database  = '';
    8 s2 O* G8 h: ?) x6 M
  7.   protected $mo;
    2 z. b! B! Z# F% Z
  8.   /**
    $ R' }3 O. |! k6 ^- Z$ e7 v
  9.    * 构造方法: r* T- g5 o8 m: y7 c6 {! [2 ~( {
  10.    */
    9 x4 I& z( M+ q) E0 B* f
  11.   public function __construct() {( b4 A! C2 D" b4 V  f0 W3 R' b& Q
  12.     $server = DBSERVER;
    9 _( j9 b" g4 ^* ^
  13.     $user = DBUSER;( a7 G, E/ Z/ w5 B8 E) i
  14.     $password = DBPASS;0 G! T4 y, m. c, d7 e/ f
  15.     $port = DBPORT;, y7 h( ]% m! p, v
  16.     $database = DBNAME;8 j9 Z* Z* J5 G$ U
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    % I9 i9 f/ W% s; s0 m
  18.     $this->database = $mongo->$database;  I. M  h6 J: m" Q
  19.   }
    7 _) I7 C9 \# ]5 q2 J$ e
  20.   /**
    . j& F9 H( X5 d  I8 J3 v
  21.    * 数据库单例方法
    : L7 X. y. m: V/ K
  22.    * @param $server/ p" t8 s) W4 F! N% c1 O, I
  23.    * @param $user5 F1 Q) z& [& f. V& _" ^% \$ ]
  24.    * @param $password( u6 [9 P0 v+ W) H# ?1 n* C) h
  25.    * @param $port
    2 S7 Y8 K1 {0 e# q5 b( T
  26.    * @return Mongo0 l  q5 N. f; s% z8 t
  27.    */: _4 X* m$ u+ y/ ?* m; D
  28.   public function getInstance($server, $user, $password, $port) {9 a9 w/ h  q. q0 p$ b
  29.     if (isset($this->mo)) {
    ; [! m* f) c0 s0 m" E5 B
  30.       return $this->mo;: H" \- ]2 w7 S9 c3 O
  31.     } else {
    % o# R- }& s3 l9 r
  32.       if (!empty($server)) {* n5 `) c+ U+ E& V: {$ I& a' B2 m
  33.         if (!empty($port)) {6 G9 G9 P- }+ b+ ?. A" C7 J
  34.           if (!empty($user) && !empty($password)) {
    # }5 ~! L+ O/ W: P! [
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
    - o% q# g1 v$ \  G* i* z
  36.           } else {/ M( v+ V- b7 W
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");: {& [- U- V" |( p
  38.           }1 e5 f3 P  R+ X3 V" Z3 j+ ]
  39.         } else {  O% C0 J8 s/ U/ m; Z5 j2 j$ K
  40.           $this->mo = new Mongo("mongodb://{$server}");
    1 ]. d( G2 x8 V1 K. P* H
  41.         }
    1 B- R" G( R, M8 o. V0 Z6 C3 [$ P
  42.       } else {
    ( ^. q- O! C0 ^  o
  43.         $this->mo = new Mongo();" J+ j: c* S# c; u
  44.       }! q1 E: h0 V4 {7 c; \0 b
  45.       return $this->mo;& e, ?$ N& u: z7 J, Z
  46.     }
    ( b& U1 }" M3 R, Q7 K8 X3 {
  47.   }! x! m( ^, c3 J0 s+ }$ ^3 \' i* M
  48.   /**
    $ p6 y1 Z; _6 [# o. R
  49.    * 查询表中所有数据
    & U  L3 H8 K  g6 ~) h( D& j% r
  50.    * @param $table4 q) H3 U: C% d, Y: X: q
  51.    * @param array $where
    - E# P6 J0 h: i% o! A- _
  52.    * @param array $sort; i" i  X6 r( `) n5 `
  53.    * @param string $limit2 F8 o1 i5 o1 [' D9 k! X
  54.    * @param string $skip0 f/ }$ N3 v% V+ |
  55.    * @return array|int9 X: {' `9 l1 h' t6 n* M. v! n4 }, S
  56.    */
    + A7 |6 o& t' V0 ^+ d+ M3 i
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {- E- n1 O6 V( j# D, u$ a1 m
  58.     if (!empty($where)) {
    ' i( u) t5 W/ q: D
  59.       $data = $this->database->$table->find($where);
    0 M& z! {' e6 l9 k& F4 \. z7 v
  60.     } else {2 G8 s* b' e& Y0 K/ K
  61.       $data = $this->database->$table->find();
    & V' T8 Y- T3 G
  62.     }
    " K8 Q. n4 d2 \# K( b0 v
  63.     if (!empty($sort)) {4 m( _) c7 R7 }
  64.       $data = $data->sort($sort);
    * U0 |& `, S8 `
  65.     }
      q( q$ k, V- V% o$ g3 X8 v
  66.     if (!empty($limit)) {
    * w" }& _1 q. Y) |0 K8 }
  67.       $data = $data->limit($limit);  s& N; _* _8 `; z4 l- j6 B
  68.     }
    5 Y+ E. Z/ t& S6 e/ P
  69.     if (!empty($skip)) {$ e1 l9 e1 ^/ v- D5 H
  70.       $data = $data->skip($skip);- C, f5 ^6 |6 P9 N7 t' N: g
  71.     }
      x+ E7 {1 _% L& E3 _# _/ p
  72.     $newData = array();* O/ ^' X+ {1 i( r& l
  73.     while ($data->hasNext()) {, D) M' e4 a7 T  v
  74.       $newData[] = $data->getNext();
    * d( H+ v! W; t) {1 M4 ?1 V; `( S
  75.     }
    $ C4 ?- j  |1 i8 e
  76.     if (count($newData) == 0) {
    3 _9 v; Q3 w7 H, |2 Q
  77.       return 0;+ Y: b" M, k5 {7 t
  78.     }" G1 z: N# c7 X2 K$ F3 |% \5 M
  79.     return $newData;
    / f9 `- I$ G7 f
  80.   }
    $ g% I. h" F# c! D( S) M1 \; |" w/ p
  81.   /**
    1 H( e" _- U4 B. V2 @, i1 h4 X
  82.    * 查询指定一条数据
    ! Z3 ~+ ^& `, o0 H
  83.    * @param $table
    , C+ U# z7 x, W6 @2 a8 ]/ @
  84.    * @param array $where1 _3 c8 Y- i0 M0 O' P& \
  85.    * @return int  B8 R# ~% ~+ I* r' z
  86.    */7 p/ W0 L; c: g
  87.   public function getOne($table, $where = array()) {3 X5 ?+ j7 m1 d9 v/ W# I
  88.     if (!empty($where)) {
    % `6 i3 M1 s9 M" q7 G% y
  89.       $data = $this->database->$table->findOne($where);9 W) f# G, D! v1 c+ b/ w
  90.     } else {
    # ^4 O8 k( z, F1 Z+ A5 M
  91.       $data = $this->database->$table->findOne();" g( B3 t$ k1 P/ [
  92.     }2 Y. ?5 b3 Z+ o  w+ v; j
  93.     return $data;5 W3 \6 T9 U1 c+ \3 r7 C
  94.   }
    % z0 m* q$ y$ f4 E+ }2 p- `# f
  95.   /**( K; L5 j" Q+ c/ v3 |4 V4 w
  96.    * 统计个数1 N& ], @& ~6 m2 \, `, y; Z
  97.    * @param $table- m$ _; W7 }! L' }6 M
  98.    * @param array $where4 u2 o! N  q& ~% ~5 L8 L6 h
  99.    * @return mixed
    ; j) X3 V5 V2 \# K
  100.    */% g* S; N( u9 L: o% x
  101.   public function getCount($table, $where = array()) {
    8 B9 g! n8 g4 M4 l% @4 O0 u6 I
  102.     if (!empty($where)) {+ S! K' a+ j: J
  103.       $data = $this->database->$table->find($where)->count();
    / F8 _$ S- h% V, u9 G
  104.     } else {
    1 G* f0 |( z) l
  105.       $data = $this->database->$table->find()->count();& a6 a/ I# R3 z0 X) Q
  106.     }( ]  a% n# U) ^% e  R' X3 b
  107.     return $data;
      c% ~( k6 f+ j8 [( g
  108.   }
    + E8 C* s7 w1 j$ y# O
  109.   /**
    ; R2 p& h+ @, k( P7 x, u
  110.    * 直接执行mongo命令
    1 Z# @. R  ~- y% I  O+ t3 \
  111.    * @param $sql
    5 X& P. T# w; F; [) S
  112.    * @return array
    # n0 o9 e- V, c" ]% D: ]. \
  113.    */
    . R5 ?5 d& C1 C- ?) O& Y5 g
  114.   public function toExcute($sql) {$ P6 y( d- A( G' c1 T9 V
  115.     $result = $this->database->execute($sql);8 z# n8 E$ i* K$ j4 K0 Y
  116.     return $result;$ `- i6 R5 Z4 M. F* Z# C( @
  117.   }" u; q/ X- ]; r" I5 m! n3 T
  118.   /**  C" e! N3 ]0 M" {5 ~/ e! ?9 C" t
  119.    * 分组统计个数; `9 |0 c4 m( g* i7 K
  120.    * @param $table2 Z& ]0 l3 J- i2 A; [" H( N0 }
  121.    * @param $where4 r. R- B, }& E) p3 L) E
  122.    * @param $field# X  |9 P" N' B" k, P- w, d
  123.    */% E9 V: h1 `+ E* @
  124.   public function groupCount($table, $where, $field) {0 q) R! V( w& l' M. s+ ^/ [
  125.     $cond = array(
    ; M- V0 M3 c4 ^- k8 H2 A7 q3 Q
  126.       array(
    , r4 s# k" o# \( O8 ~! b- [7 E
  127.         '$match' => $where,
    $ n, D: B% r6 P' N* ?. V' b
  128.       ),
    / A. |& j5 O/ n) ^
  129.       array(
    & E  C, e2 Q- x
  130.         '$group' => array(8 M/ H3 Y) [2 Q; \$ h. I, h3 E
  131.           '_id' => '0 b) @3 s9 _$ P" k4 q& Z

  132. % i" T- [5 U* k, \
  133. . $field,
    1 Z" Y4 h; w2 y
  134.           'count' => array('$sum' => 1),% z2 g- X# `, W1 L2 x
  135.         ),
    3 g7 a5 `& ?, ]- S
  136.       ),
    - X  U" n7 r2 J  @! X! [8 \
  137.       array(6 w- e7 k6 F9 _" P2 O4 l0 q0 q. p
  138.         '$sort' => array("count" => -1),
    ' k; H9 R" V9 Z1 j5 ]: g5 R
  139.       ),+ ]1 G/ F/ H6 f. j- L5 V7 d" k
  140.     );. I2 ^; i8 z) u' |
  141.     $this->database->$table->aggregate($cond);
    ' X4 s; j# ~1 I: b; r( C" D
  142.   }
    0 `$ q  V4 X& T* y
  143.   /**
    7 X! j8 w; g! `1 g% l. O
  144.    * 删除数据0 z4 [% \  g- S- d$ g
  145.    * @param $table$ i4 x# o0 k, \5 t( w; Y
  146.    * @param $where
    ( t4 N6 W7 b" v0 g
  147.    * @return array|bool
    & u; q* |* Y5 D' V
  148.    */
    * _# C4 S5 n; s! ^& N, ~! `3 u
  149.   public function toDelete($table, $where) {  Z0 ]6 V* I" O
  150.     $re = $this->database->$table->remove($where);
    3 T$ N5 U! b; q8 B5 n5 j
  151.     return $re;; b$ Z) T# q+ j8 p3 c
  152.   }
    7 T( R" k0 F  I* V" {' p
  153.   /**
    5 Q- f/ |1 o6 ?' C
  154.    * 插入数据/ m* ]* i7 r. {4 n3 V; Z$ s
  155.    * @param $table' w; o- e7 H2 b. f
  156.    * @param $data
    3 d' [+ l& T# c4 ^4 ]
  157.    * @return array|bool
    ! R: ]/ }9 f% S* z$ ~
  158.    */1 d+ v  q+ ]0 i, b* M& i
  159.   public function toInsert($table, $data) {: p9 [7 ]+ {) G( W- F
  160.     $re = $this->database->$table->insert($data);
    & C1 o$ S1 X3 c) E1 y/ A" E
  161.     return $re;
    ; }& X4 T" @, m$ j$ l
  162.   }
    ) ?9 S% c: ^5 T6 f" g) S; c
  163.   /**
    * c- D1 k8 ?" r: N. D2 L. B
  164.    * 更新数据9 b2 Y7 [  V& o- O
  165.    * @param $table9 [% M# B! k. e; b
  166.    * @param $where4 y, ?, J: w" s  I
  167.    * @param $data4 }6 o& N3 w8 {) d  @
  168.    * @return bool5 H; a5 j! R% m6 ?1 h# F+ `
  169.    */
    + b9 S" d9 m# \  ?- |5 o
  170.   public function toUpdate($table, $where, $data) {+ m' d  h" T. ?; v' v
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    $ m; l4 \3 P% ^  R0 K' S4 O& f
  172.     return $re;
      N9 p- K' a- E1 P3 P! a
  173.   }0 ^6 \" x7 z, Y! l# E: q
  174.   /**/ U+ E1 _1 J; W) a- C$ d/ a6 j
  175.    * 获取唯一数据
    $ J, \; ?+ L% B% h1 n# A# j8 e
  176.    * @param $table
    ) [* R# W9 U# N" O/ @6 F( A
  177.    * @param $key
    0 u  v7 c8 E( l) a- H
  178.    * @return array
    + b' W+ j, |$ s( s$ R. _) ~
  179.    */
    $ p& U( ^& F+ M) `1 r% V. H
  180.   public function distinctData($table, $key, $query = array()) {
    - p% C  ]8 n' R9 F/ f5 v: P
  181.     if (!empty($query)) {: V+ M0 ?6 v; j# b8 w1 s
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);8 l4 R7 R6 U) j' V7 a% c6 S3 C5 i
  183.     } else {
    0 i' _& u2 H0 z: O7 h4 M
  184.       $where = array('distinct' => $table, 'key' => $key);
    , M' H8 U3 F( d+ T5 Y7 o
  185.     }
    + `2 I. Q4 l! m* Z- L8 y
  186.     $data = $this->database->command($where);; Y( t' |+ D% G
  187.     return $data['values'];0 t  N: `9 x/ U' o
  188.   }# c% H+ U! e6 L% @8 x3 L  x
  189. }
    . M; j0 L# U8 L" o6 t6 B9 ^
  190. ?>
复制代码

, P* u9 y9 `* t- z; ?: ]6 |9 Q
1 s0 R; e7 i) ^" L! L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 18:01 , Processed in 0.124370 second(s), 19 queries .

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