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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
6 V% m. H  j" o5 j模式自由。" c7 N/ L2 S3 F6 @& X9 s
支持动态查询。
, _" f& L; p# n! p" a7 E支持完全索引,包含内部对象。
' m- P6 X. ]  s7 A支持查询。
8 V  ]- G: M" N; T& W, L支持复制和故障恢复。; Q5 O  a- }, p, E7 c1 {, A
使用高效的二进制数据存储,包括大型对象(如视频等)。$ \- J+ n# W5 D% y5 O* f) M" I8 c3 ?
自动处理碎片,以支持云计算层次的扩展性
; E4 Y3 k* R& Z1 f" @* D* j支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。5 D. H3 W- e' c& \8 z* z; Y
文件存储格式为BSON(一种JSON的扩展)
4 K4 e% }* n4 Z& h6 r6 }可通过网络访问

所谓“面向集合”(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) O" S& @3 J* `9 J& T
  2. /**  ~7 R# p/ I# I: E& C, |3 n, h
  3. * PHP操作mongodb数据库操作类/ Q- m+ i# r; I. N
  4. */
    4 u$ g& S6 }$ C0 v" W
  5. class Database {  K4 k* g# u! G1 V& N( `3 F4 Q
  6.   protected $database  = '';
    , e' B* F1 [. ], T, O' W/ k
  7.   protected $mo;
    . M; L" Y$ ~7 G
  8.   /**0 q7 ^1 g( O- P2 ]+ A5 K
  9.    * 构造方法, a5 j; v$ w, T+ K+ q
  10.    */
    , J" G. X" W$ Z8 J$ W. p
  11.   public function __construct() {, i& l2 l  N6 b  x$ `
  12.     $server = DBSERVER;
    & x7 L1 e, @, u+ c7 c+ C
  13.     $user = DBUSER;
    2 ^5 v1 o- k5 O; B
  14.     $password = DBPASS;' ]( n) e7 E; {/ ^% \
  15.     $port = DBPORT;3 p8 m$ A3 Z# A( l; l
  16.     $database = DBNAME;% T" O; @1 S" I7 B4 ]2 h
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
      ]* ]% ^% z5 c; q* o" m0 B
  18.     $this->database = $mongo->$database;0 g4 B/ x$ _1 `% y/ Z% h) H* o6 |
  19.   }9 g' \7 W% l8 f  s  c% H
  20.   /**
    / q- R: x& y/ i
  21.    * 数据库单例方法, L% n- \  N7 j+ ^/ L6 {
  22.    * @param $server4 D! t: d9 l9 u. A( K
  23.    * @param $user: F  Y5 ]+ V" D8 h  L- W
  24.    * @param $password+ H% {) E+ k4 }5 J% T  c
  25.    * @param $port
    - l% U# G7 @2 d$ m3 k
  26.    * @return Mongo
    + f, ^& |2 |% S
  27.    */
    & ^' B) W  u9 n
  28.   public function getInstance($server, $user, $password, $port) {9 t0 j& O7 a/ W5 J& C. W
  29.     if (isset($this->mo)) {
    3 C; F5 b/ p6 g
  30.       return $this->mo;
    & F: `9 q' X+ C: u4 x! r1 w
  31.     } else {
    8 g! j, [- g* Z" h4 e' v
  32.       if (!empty($server)) {
    % U# p0 l  W9 U
  33.         if (!empty($port)) {! I9 ]) G. \9 S/ s) P
  34.           if (!empty($user) && !empty($password)) {# {2 Q* ~) K. t- e
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");  I. E2 c% U& s4 F  Y
  36.           } else {
    & t9 N* v% N, }. r/ z8 |1 N
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");
    7 c, _; h  e* Y" \
  38.           }
    $ n6 d: j& Q# v/ l2 U" a
  39.         } else {
    ( i1 }/ t/ C, G# P
  40.           $this->mo = new Mongo("mongodb://{$server}");4 j! ^  i" G( }2 R. X' t
  41.         }
    5 t4 ?- `5 V. A$ @
  42.       } else {
    8 _0 a; F; M, ~$ @) j9 Y2 ]# V
  43.         $this->mo = new Mongo();
    + z$ V* u& T8 g3 }
  44.       }
    , F9 S" c5 p5 T( B
  45.       return $this->mo;
    . n. L$ l2 m: {( S
  46.     }8 V" I8 G; k  M, t0 F1 h& \9 T
  47.   }* i* V7 l7 M1 C2 i( l1 Y* q
  48.   /**! M1 I% {4 I/ l: _1 t
  49.    * 查询表中所有数据
    ' T8 I+ Q( i% d4 L$ _
  50.    * @param $table
    ' ?2 v' R( k5 u* t
  51.    * @param array $where
    ' R6 s0 _3 ^/ X* A0 E& l0 l
  52.    * @param array $sort
    ! R& i/ C* W4 Y, t# [, A
  53.    * @param string $limit3 `7 f" H' a) J5 e
  54.    * @param string $skip
    & @5 A) N& e1 L7 q5 ~; l
  55.    * @return array|int
    & ]& v, g# O8 s+ l6 h: n; h
  56.    */
    4 T8 l# k+ d( J% U/ D
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    , X) G% E. ]* F2 Q
  58.     if (!empty($where)) {) u6 |  c' q3 I, i0 V
  59.       $data = $this->database->$table->find($where);
    ) g* s+ N/ Z# Y" \( \1 T0 i; p3 n6 |
  60.     } else {
    # D# T; _4 P) Z% m- j) [5 y% S% ?7 Q
  61.       $data = $this->database->$table->find();
    3 W9 j8 k( p& B, r) R5 a0 V1 j* _
  62.     }- f; A( E& J, s6 `0 K0 r
  63.     if (!empty($sort)) {
    7 N9 I/ e( a* `6 G$ V, @9 c
  64.       $data = $data->sort($sort);
    " t  j1 r& G# E# M( t) _2 ?
  65.     }
    7 {* X( e; {1 r4 |+ m, W) O! J
  66.     if (!empty($limit)) {
    - F4 [& X% B7 v* X/ `
  67.       $data = $data->limit($limit);
    . J5 s4 k' a5 c% X; |
  68.     }
    4 @6 i4 r9 r3 g0 i6 R2 p
  69.     if (!empty($skip)) {
    ( x" _; _# `& s, _3 C; u3 L- U% W
  70.       $data = $data->skip($skip);" \- a0 q- q& y. Q, \$ c
  71.     }7 v' f9 w9 C: ?) S, w6 s# P5 |
  72.     $newData = array();  V% ~5 q0 C% a! T" F; w- Q) S
  73.     while ($data->hasNext()) {3 B3 W4 z+ d3 J! n5 D
  74.       $newData[] = $data->getNext();
    / @; ]$ ?8 g5 X' }' i7 K+ ^
  75.     }
    1 m, T% }: b& R& r8 Q& O* N
  76.     if (count($newData) == 0) {. I% @. M# p) g/ B
  77.       return 0;
    ; B4 ~& e$ y: g: X' n
  78.     }6 _& b9 ~6 }# G  @2 v8 b0 ]
  79.     return $newData;* E+ C. \0 l  O; N: V* A
  80.   }$ D7 y" I$ G9 s) w2 }% [' l1 |
  81.   /**
    ' d, ]  B% Q- N; g6 x1 k
  82.    * 查询指定一条数据2 V, I5 j. [' h* ?5 `
  83.    * @param $table* J8 T9 x, j% a  r
  84.    * @param array $where
    , ?% I# i, h& r+ x' ?
  85.    * @return int( j0 ~+ M: |/ @1 `8 D+ |
  86.    */9 N; q9 s' g; Z
  87.   public function getOne($table, $where = array()) {; p( H: H2 q' P5 s) f' D
  88.     if (!empty($where)) {- n* G! z1 ~- _7 M2 O' x/ t
  89.       $data = $this->database->$table->findOne($where);
    0 X2 d0 I) R2 B0 Y7 \
  90.     } else {* a  J8 Y# T' }! i2 M
  91.       $data = $this->database->$table->findOne();5 P  U! r5 w5 E( ]4 q
  92.     }
    5 f- F' O. f* X3 e
  93.     return $data;0 y. F* }: \) y; a: F3 i2 a/ H! o
  94.   }
    ' [3 W; T0 U4 Y1 Y5 ?+ y" s
  95.   /**% k4 @, ^1 z1 J
  96.    * 统计个数9 p6 O5 N  H; s" m$ T. f# u
  97.    * @param $table
    9 g: r7 `3 I2 I' Q  u/ ?+ b& b% w9 G% r
  98.    * @param array $where
    8 k( J# K* M5 T; `9 x  z5 U
  99.    * @return mixed- o8 K% ^- |2 \* m# j% n1 ]* l, l
  100.    */, E  S* z+ L- G% \" W
  101.   public function getCount($table, $where = array()) {9 W0 l) l2 U) v( |+ \1 ^0 u/ a
  102.     if (!empty($where)) {
    ' i5 x$ O& Q. H5 s# g4 T2 h
  103.       $data = $this->database->$table->find($where)->count();$ ?! `( T% }# y% @
  104.     } else {
    8 ~& O6 ?) k3 |
  105.       $data = $this->database->$table->find()->count();- {& g% Q9 y* x: h
  106.     }
    4 d" d& I: m0 B
  107.     return $data;
    ! @3 k7 t2 c$ H3 E# B5 d! W
  108.   }
    1 ]1 K2 l+ V0 i
  109.   /**
    6 ^. c) }3 n6 C! r' }" y: d0 s1 b
  110.    * 直接执行mongo命令
    5 c) X1 d3 n7 F* F! I3 C
  111.    * @param $sql
    # [% u& I, ~  r
  112.    * @return array
    8 ?. v3 t& |& r& U7 A& B/ Y
  113.    */+ e, W- q; k3 }, t
  114.   public function toExcute($sql) {) I: f5 i; w4 E  X5 Z/ Y! C3 G( [
  115.     $result = $this->database->execute($sql);
    : S: c. S+ \# z: A+ r. f( h1 r
  116.     return $result;  ?! t' a7 c9 h1 a
  117.   }3 A8 P1 c/ v7 ~! X1 ~
  118.   /**, W' K  J+ E9 [: k
  119.    * 分组统计个数# }% a& x& \3 Y. C2 [
  120.    * @param $table
    3 v/ M2 }8 _( c* ~& Q5 }) U  K
  121.    * @param $where
    4 {. T  j6 `8 `
  122.    * @param $field
    2 u4 h- Q4 [/ S: |) |4 [" h6 V
  123.    */
    7 f5 E0 Q1 o) q
  124.   public function groupCount($table, $where, $field) {! v1 [, y, D8 x8 _
  125.     $cond = array(
    7 W, o4 l) L' b0 V: \
  126.       array(; S. M( N4 z+ L4 g  o# f* D( a# o
  127.         '$match' => $where,
    " P, z) k$ B2 ^: D! O
  128.       ),
    9 u- w4 V+ Q3 ~! v! C8 I( \  q
  129.       array(
    $ ^* n  H" _# _* l% Q
  130.         '$group' => array(
    ( P) J# ]' o/ M6 c/ K( A
  131.           '_id' => '
    . r- u) U2 X1 {
  132. 3 t, z3 h2 h3 h* \4 n
  133. . $field,
    + I9 u7 \# f& G  a6 X3 C
  134.           'count' => array('$sum' => 1),
    , B8 g2 U- {+ C9 l
  135.         ),
    . _1 N' ]" r. \7 w- X( a
  136.       ),
    7 W: m: O6 Z# h% y# `6 @
  137.       array(; e5 p9 i# Z) Q( f
  138.         '$sort' => array("count" => -1),
    ) f& q" j+ S" \4 |
  139.       ),
    - S3 R# b7 ]5 W# @. ?
  140.     );$ W  {' _: _6 p+ D% f' j
  141.     $this->database->$table->aggregate($cond);
    $ L* v# s  O5 t: F* q
  142.   }7 O/ e& v0 x) {
  143.   /**
    ; u" h( N9 ?; H, Q- K4 U
  144.    * 删除数据
    . l1 L- |, m6 d  m* X  f
  145.    * @param $table
    8 e9 K: V% D5 U7 P6 i. m
  146.    * @param $where0 A  W4 ^& s0 G* s
  147.    * @return array|bool  `3 v3 w4 g, E4 D* A. x+ Z
  148.    */) ~$ ~' T& m# o" p
  149.   public function toDelete($table, $where) {
    ' Q+ B3 m$ V% S3 _7 r, @
  150.     $re = $this->database->$table->remove($where);1 u+ i1 h# g+ U) Z4 |( \
  151.     return $re;
    1 C: `$ T6 S, y$ `( S4 l
  152.   }! I) N% P* o/ a; |' }0 U0 O
  153.   /**
    * ^& _  [7 b+ L% V, X" x
  154.    * 插入数据
    + d4 J, O6 O' W1 \9 m* Y% n
  155.    * @param $table
    & C  |$ ]" {/ r3 J" `" D; |9 z* x
  156.    * @param $data6 q2 H$ ~+ T, t* u7 ]
  157.    * @return array|bool
    4 X; A$ B; A9 w# Q- {& q9 p1 C
  158.    */
    : F7 F" G+ d8 h0 h5 ~9 M" n/ `, ]
  159.   public function toInsert($table, $data) {
    2 N( r- B3 t9 F7 {- r( k; ^
  160.     $re = $this->database->$table->insert($data);
    1 \9 C6 _/ Q  h  }5 s) O6 @7 W
  161.     return $re;
    6 W- H2 i3 s9 o
  162.   }
    ( J- l+ n; x2 Y2 U) K' V7 I- ^
  163.   /**
    0 [  L) U2 o: K8 J( z, B+ G* C
  164.    * 更新数据' \5 P/ F" _% V" F. H; R5 B, i
  165.    * @param $table
    / g- o7 c/ m: M$ p! u) ^# w: m
  166.    * @param $where
    ( {( _* Y) o7 L) p( P; v. S8 @
  167.    * @param $data+ Z4 |3 u2 Z) [0 s
  168.    * @return bool
    1 x7 d9 f6 |0 j! p/ t0 q) }/ s8 w4 f
  169.    */
    # L- E% d5 `2 O# D( c
  170.   public function toUpdate($table, $where, $data) {
    ) ~! Z. }' {  S
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    . Z9 Z! K. w8 f- x+ F1 C
  172.     return $re;
    % W# D0 i; _8 k% |- h2 N7 N
  173.   }' ~: T4 g2 c0 w5 i
  174.   /**6 |+ D* Y: A5 p) ^3 C$ y
  175.    * 获取唯一数据+ `  s8 E' C0 \3 u9 y  W  w+ e
  176.    * @param $table" ]8 o3 t. B. _" |& o# N  l
  177.    * @param $key) O8 [7 q1 k! T* I
  178.    * @return array
    - Q5 r6 d' p" \* m5 w5 F- D) x
  179.    */& V0 V& R, ?' A5 I9 B* s
  180.   public function distinctData($table, $key, $query = array()) {. g) v0 i6 s' o; b' g% ?! `
  181.     if (!empty($query)) {* @2 {. s+ f, t: Y  _$ [4 d6 z
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);3 Z* C% d5 t: z
  183.     } else {% V. N2 G' w' B/ ]" g; o
  184.       $where = array('distinct' => $table, 'key' => $key);
    : i) n5 M. R" j& S
  185.     }
    $ ]( ~4 G! j. Y& J0 K
  186.     $data = $this->database->command($where);7 @+ p. e2 c0 Q: Y& K
  187.     return $data['values'];
    : r  s7 s0 x, c
  188.   }
    5 X, T7 x- R, c* G5 r3 }- {
  189. }' ]* h4 F  O. {3 m( i
  190. ?>
复制代码

- R- L$ M1 B7 ^9 ~( `' m
- i3 I& v) d2 S% Z2 T* B& U! H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:38 , Processed in 0.082444 second(s), 19 queries .

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