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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。" a- m) H8 R# U, ^$ g
模式自由。0 b, f! `: ]: P( n- f
支持动态查询。
: ^+ D  m  ~- S4 s) X: b2 J- t支持完全索引,包含内部对象。
' L6 ~: Z) J; C+ E- i1 J支持查询。
5 n4 a, D. u# Y* |7 b' u支持复制和故障恢复。1 m* U5 G$ E% {9 ^" I$ T4 I" r8 D8 F
使用高效的二进制数据存储,包括大型对象(如视频等)。
. z1 V, G8 s$ d9 D1 p  ~- N& m" O! m自动处理碎片,以支持云计算层次的扩展性8 L0 p+ t7 {2 K* o
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。" C5 s7 r  O- o6 F
文件存储格式为BSON(一种JSON的扩展)
  ~$ T' f, J% E7 K0 ?" p/ ?7 B可通过网络访问

所谓“面向集合”(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
    . e# O4 O# i: d$ I) o2 K; n
  2. /**' Y! U2 ]; B* Z' g# X% Q+ Z& a( o
  3. * PHP操作mongodb数据库操作类; g! G. X: _; w9 c; R! e
  4. */+ n# s* ^% E9 w% |/ Z. B
  5. class Database {; k4 b' B/ H* X& }  B
  6.   protected $database  = '';0 @( u4 |* f" @8 S- `
  7.   protected $mo;
    " i" I+ A; ~# d& ?, D
  8.   /**/ m; J/ y$ S/ [1 r: _" [* ?, [" e- z+ E
  9.    * 构造方法
    : Y- a% T# z  J6 |' |1 R" X
  10.    */- h5 t$ m; o/ {- ^, T  C2 @2 k
  11.   public function __construct() {
    8 J$ B: ^/ x+ S2 T; A
  12.     $server = DBSERVER;
    ; s5 D9 `8 k* ]1 @
  13.     $user = DBUSER;" O6 V$ q# z( S# l: l+ w. \6 J% X
  14.     $password = DBPASS;6 w/ x9 x% }: p! A+ Q
  15.     $port = DBPORT;9 P: E4 O/ ^2 O, n  ]5 _2 {3 K
  16.     $database = DBNAME;  y# w2 I! U6 J' I3 h
  17.     $mongo = $this->getInstance($server, $user, $password, $port);3 H& R" A, P. A% z5 n6 [9 o
  18.     $this->database = $mongo->$database;
    9 ~* M$ {  O0 i  l/ n
  19.   }
    8 E* o9 g, B2 M2 W2 U$ u. C6 S
  20.   /**1 M  d% O  j+ P, V
  21.    * 数据库单例方法& b( o  U+ w0 |0 j1 X! A0 }& o
  22.    * @param $server
    9 K. G# s6 F" l' o4 {
  23.    * @param $user9 K# b. ^+ |6 J) I5 b; O
  24.    * @param $password4 u% W0 M5 k$ i' E
  25.    * @param $port1 T( v$ h* s" C+ _- f
  26.    * @return Mongo
    ' T, h; c& Z2 _' H( p
  27.    */. Z) ?% [. [& w6 }8 H1 a
  28.   public function getInstance($server, $user, $password, $port) {
    / a" {1 v, I; U) M# Z; B6 |# j
  29.     if (isset($this->mo)) {, y& y' f% K, y2 k
  30.       return $this->mo;2 ]5 p0 _) W8 {7 s2 U" G
  31.     } else {; X6 G# L* f& ?5 \4 I0 x& P8 h, l5 s) [
  32.       if (!empty($server)) {( a! @/ z1 E  y
  33.         if (!empty($port)) {
    : W* f) j: r' t& o2 w
  34.           if (!empty($user) && !empty($password)) {
    ! u/ z! f+ W& G$ {0 M& C) u
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");+ C: N! B7 U& O8 F  \5 u' q! z( q; O" k
  36.           } else {
      |' n3 ]( f! Z+ R) J. I" k
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");1 x- i, \! B9 ]. H9 b
  38.           }8 a; B7 {$ u" e7 B( J: q5 E: m0 w4 e! J+ C
  39.         } else {
    ( ?. _, h+ H/ U) p' }3 P# G5 E
  40.           $this->mo = new Mongo("mongodb://{$server}");
    : f& }* h' b+ ?" {- Z
  41.         }
    0 F3 s: R- y9 Q
  42.       } else {
    4 l6 s! f% e+ S# g0 L
  43.         $this->mo = new Mongo();
    ! ]* P  @6 g- n! K9 P
  44.       }
    # I& a" f: R1 C) |
  45.       return $this->mo;: B( X. Z" I) K1 g
  46.     }
    $ t  X2 n* O7 z# j. d. I
  47.   }" o- q0 F' i4 F& i7 m8 R% f* w
  48.   /**0 z: z: l; \6 m/ V' T- f# m
  49.    * 查询表中所有数据
    : ~; P2 P4 r, m
  50.    * @param $table
    ; @6 Z+ C1 s6 Y- `% l
  51.    * @param array $where, m4 F, X; S' K( R0 a# i) P
  52.    * @param array $sort$ {- m8 ]+ a# W/ |- h! X( a
  53.    * @param string $limit0 s9 J) f" ]; Z- ]8 i
  54.    * @param string $skip
    6 |, k! B" I$ F& g
  55.    * @return array|int
    0 f/ l, J$ V5 E/ o" \- H
  56.    */2 w- s& p/ N) Q; e) \0 t9 l
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    % D' g1 B+ r' M  }' o  j
  58.     if (!empty($where)) {
    ; u; T. p* t- U
  59.       $data = $this->database->$table->find($where);4 M' M( L9 v* r; W: M7 u& y
  60.     } else {
      @: W% w* W0 S1 J" ?
  61.       $data = $this->database->$table->find();$ j" Y/ H  C4 P0 m
  62.     }, [% d& f' X5 S5 L; ~. w# ]
  63.     if (!empty($sort)) {) X' g# Y6 V/ i7 _: `( J2 g. d3 Q# n
  64.       $data = $data->sort($sort);
    $ M4 S' |: r& n2 f, x7 W+ `% c7 V
  65.     }* U6 W. Y- w9 @2 s/ x$ b$ P! C
  66.     if (!empty($limit)) {
    & d& Z& u! p; G0 G/ d9 {  |% F; X
  67.       $data = $data->limit($limit);5 Y& ]  A$ c# t- T2 q4 E7 R
  68.     }: O3 R) U* @  P" O& C# ^  p
  69.     if (!empty($skip)) {
    * v2 a  i' O$ q  e
  70.       $data = $data->skip($skip);9 W, i! \' R* i$ l8 h1 `4 p
  71.     }0 A" e/ l- U- Q7 s
  72.     $newData = array();
    6 k1 H0 i# P+ |. C0 g, N: o
  73.     while ($data->hasNext()) {
    + p& F; w3 _( e, P, N
  74.       $newData[] = $data->getNext();
    * d; m' f* {: }4 ?5 k' \  ]7 i
  75.     }9 N7 f* O8 L( d+ d2 n8 F8 Y
  76.     if (count($newData) == 0) {
    ) x; }9 ]3 b$ Q( Y
  77.       return 0;! i) W! t9 g0 t8 U+ z- y
  78.     }
    ) k" H  }4 {5 t- c) S  C- P% g
  79.     return $newData;' B" _  r1 O% T5 D& h+ J7 O& l
  80.   }
    ' B9 a, F! H- V. _% z* o- q
  81.   /**# N1 s: [1 e/ M/ H& [& ]# C8 X
  82.    * 查询指定一条数据
    / G$ z- _9 V1 l$ G; S
  83.    * @param $table6 Z* ?7 \9 c1 B  c) X" d
  84.    * @param array $where
    " B* |% T& g; y/ a* g# g  Z
  85.    * @return int0 Q( Z. T* M9 R; n
  86.    */
    " k) E+ @: X( U* A' t  ~2 J( G
  87.   public function getOne($table, $where = array()) {
    6 D8 d2 i+ o# ^$ A8 S* Y/ V. ]9 `( {
  88.     if (!empty($where)) {9 S; L0 p( d4 c3 K* V: S2 V: w# m
  89.       $data = $this->database->$table->findOne($where);
    * e: U4 L; @8 k; r3 ?: F2 @
  90.     } else {% [9 Z9 d0 p& Q0 N& y
  91.       $data = $this->database->$table->findOne();
    8 E+ h3 ~4 C/ w0 L6 j9 A' B3 Y4 R% V
  92.     }0 ]2 w' C) M4 t6 {5 v7 Z8 y
  93.     return $data;
    ! r" n) }9 q& Y# q4 e5 B
  94.   }$ B. Y! Z: p7 z% z4 H) K# i  Q
  95.   /**
    " }( |) u9 ?$ f$ T1 U
  96.    * 统计个数% C; M0 m% [5 o8 C
  97.    * @param $table
    7 X, E: N0 `+ y9 M1 w# r* K7 O
  98.    * @param array $where
    . U/ {' A3 h! v7 y4 y3 L
  99.    * @return mixed
    6 V) a% |+ n( Y8 }2 E; w
  100.    */
    : x/ L. \5 ]5 W
  101.   public function getCount($table, $where = array()) {
    " m8 V8 ~- }4 j6 p2 e5 w
  102.     if (!empty($where)) {0 U) z" h* I0 m
  103.       $data = $this->database->$table->find($where)->count();
    , B* _0 J. k" R, C, ?: F. H/ }' C9 o
  104.     } else {
    6 G% H+ I, u" @8 K, I
  105.       $data = $this->database->$table->find()->count();
    8 x8 @9 r' x5 d8 c
  106.     }
    ' w$ @, d8 N/ [9 ^' O6 N2 ~: v( g& M
  107.     return $data;
    3 p0 L  g& c/ j! [
  108.   }
    4 N: B4 c9 H4 a) q/ ]- w
  109.   /**
    * }( E1 C  V2 E% g4 W. d
  110.    * 直接执行mongo命令
    9 j6 \( K' j9 `$ x# a" M: A
  111.    * @param $sql
      R7 F! _$ {$ R) e- x  F
  112.    * @return array* Z8 e' v; p1 G( p5 [9 }4 @4 y
  113.    */& p1 m) S7 J3 o' N* z8 F% K
  114.   public function toExcute($sql) {! q2 G( C. B% W7 }9 k  {( K) j
  115.     $result = $this->database->execute($sql);
    ) a! a: L  t  @
  116.     return $result;
    & E6 r( N* t! F6 I8 H
  117.   }& |; H0 @" p% H; j! K2 p) I2 O, K% i
  118.   /**' }3 W& Q0 R, t; r
  119.    * 分组统计个数  U6 n5 \! M  {3 I% r
  120.    * @param $table
    5 S, z6 L4 v$ _
  121.    * @param $where
    3 u$ l* [, t4 X8 _
  122.    * @param $field# \' B7 z/ U* o( w4 J
  123.    */) {# p" ~9 ?6 i+ `, G
  124.   public function groupCount($table, $where, $field) {4 C; Y2 W# _  A# [, f7 O
  125.     $cond = array(
    & p! D# `: p2 }1 I5 \( B( c: K
  126.       array(3 g! p3 P2 u4 ]% Z
  127.         '$match' => $where,
    + U1 C  m1 h' f; k9 E) I) ~
  128.       ),' h: S1 j7 l! V0 P# C6 f( E
  129.       array(
    ' F1 Y% R4 a9 ~, u$ W
  130.         '$group' => array(
    - X( I# E8 e# K
  131.           '_id' => '  l! W; \5 [3 h4 f5 K  `

  132. 6 S' d: P1 b5 S' [
  133. . $field,) ]8 t. L6 K5 b3 R+ n) `: z7 f# f
  134.           'count' => array('$sum' => 1),
    4 k) l% t0 t( j/ B* r- p
  135.         ),, Z! ~* }3 e8 c$ N' u2 O
  136.       ),+ |! U& b0 T# o: j6 u8 z
  137.       array(
    . s* R/ p' w, f; {) ]. U, |2 i
  138.         '$sort' => array("count" => -1)," z& l+ q  ~; ^: I8 U" W, c5 i
  139.       ),! l' W8 f! \$ w& i
  140.     );1 x# [) v7 }) f7 T1 _" b
  141.     $this->database->$table->aggregate($cond);+ S7 z9 W( n4 Q- t4 p# D" ]
  142.   }* _# A7 G$ c* M
  143.   /**
    + k( I' B+ C7 Y; T* y: K
  144.    * 删除数据
    * ]9 X1 ]4 W- S( ^5 r) c% r
  145.    * @param $table
    ' K* }2 @' ^7 c! [
  146.    * @param $where  ^8 }, l0 h) s# ~- P; E
  147.    * @return array|bool  p  p; C9 D" i9 ?2 P. X
  148.    */+ M) J% {: E9 o1 [; ]2 L) T
  149.   public function toDelete($table, $where) {% C9 q* @1 \' z0 f+ W+ w) T
  150.     $re = $this->database->$table->remove($where);
    0 p* D1 U( _8 `# E8 z8 S
  151.     return $re;; V* t- Y4 {& J" t0 h
  152.   }1 s% Z; e+ @  c% t1 z
  153.   /**% H& q7 D% C4 E8 m! s9 U2 }7 W
  154.    * 插入数据
    5 C, C3 b- Y1 z
  155.    * @param $table
    ( P6 L. o; t3 A' C8 n+ e
  156.    * @param $data8 w, e4 Y7 S+ t) k
  157.    * @return array|bool
    - W8 @, |6 @7 |2 z  z+ X* @3 H
  158.    */
    5 W/ q+ ~. N$ X: s# M+ g3 z
  159.   public function toInsert($table, $data) {  u" A# q$ X9 n/ O+ |; b
  160.     $re = $this->database->$table->insert($data);
    , _+ y3 N- N( d2 B/ z4 C& }! H
  161.     return $re;
    & @9 a6 y8 U* _+ k7 Q) b  ]0 O
  162.   }
    2 Y) W# u* d* Q: X! k; P
  163.   /**: [! t3 v8 K- S4 {8 F+ `
  164.    * 更新数据, G' p% i$ T: s6 w0 r  z2 ^
  165.    * @param $table+ B8 `+ e& f2 A6 _
  166.    * @param $where, V/ @* b% f5 p; A
  167.    * @param $data
    ! w/ a! |) J% w  M: q! @8 B
  168.    * @return bool
    ) N7 G: g' a: X. u& |) Q
  169.    */
    & D  U, ^0 O' X0 K7 h5 d& V
  170.   public function toUpdate($table, $where, $data) {; [& }7 x) I: J
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    3 i) Q) U5 ~( R- b5 D
  172.     return $re;2 B$ U+ k, X' S
  173.   }2 g9 e# M* \& Z2 a$ R! P
  174.   /**% ?8 t/ H& |' t4 z: j
  175.    * 获取唯一数据
    & Z7 J5 `. e/ h$ q4 \
  176.    * @param $table
    0 G$ W) _6 i( @* H' b5 q2 u
  177.    * @param $key# X) B# E: @1 i: ^& N$ n+ j1 J
  178.    * @return array( q* o8 z( m( A+ u& t& F3 I  f/ o
  179.    */
    ! x' p- U: A) w) I$ j8 ^
  180.   public function distinctData($table, $key, $query = array()) {& S7 S; H- T2 ]. E1 y* W6 i
  181.     if (!empty($query)) {
    # H2 n$ G' ^' s) L' |1 ?$ e+ }
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
    3 P5 I' b, }: q" Q3 t0 l3 L5 t
  183.     } else {
    ' X5 ~4 h. W2 |4 o( E; G
  184.       $where = array('distinct' => $table, 'key' => $key);
    " j# v2 A0 i1 }7 z7 C) N
  185.     }
    + H; J( ?  Y. m
  186.     $data = $this->database->command($where);% b! _; K) i& v. Z2 H( s
  187.     return $data['values'];
    : X9 o7 F5 k* E3 X) A: `
  188.   }
    3 G# r' f! J' N: ^7 U& _. \
  189. }
    3 Y. f( _4 _7 K; w0 S
  190. ?>
复制代码

, \: Q+ Q  A( p1 m4 E  M. P
1 g5 s1 L/ l+ B$ {$ N. A& d/ ^* G/ t0 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:12 , Processed in 0.053831 second(s), 19 queries .

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