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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
% \/ J& V4 N1 J( |9 |; f模式自由。
4 c1 {* n$ Q) d! H" Z支持动态查询。
; p( o1 V) ~' e+ o. q支持完全索引,包含内部对象。  _. y& L. E2 N9 C, N
支持查询。4 ~$ D+ t3 h* _6 _0 Y7 i2 R& \
支持复制和故障恢复。. d' H7 z. O1 K7 |8 g7 ?% o
使用高效的二进制数据存储,包括大型对象(如视频等)。
/ q0 W8 f! [+ c6 n( l3 O: N自动处理碎片,以支持云计算层次的扩展性
7 T" m, v6 H) T+ L" Q支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
1 }3 A: W2 h8 _0 A; m! e文件存储格式为BSON(一种JSON的扩展)
, u/ W2 V- e+ f可通过网络访问

所谓“面向集合”(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. <?php5 z% ~4 _, p' U7 J
  2. /**- {" n6 p9 n) _+ f
  3. * PHP操作mongodb数据库操作类
    ! g& \! C/ [9 Z  \% @2 T
  4. */
    4 J# s6 X7 n* z+ g& ~
  5. class Database {+ X5 Q9 V6 F4 c( d8 s7 D
  6.   protected $database  = '';/ s7 u7 }( k* h9 R& \
  7.   protected $mo;
    . R8 K' d' P1 j" N
  8.   /**! R# O& X  L6 O1 h* C
  9.    * 构造方法' h6 o4 P6 f( Y) ~4 E) R4 h. {9 Z; G
  10.    */; i4 A+ f1 r' K0 v
  11.   public function __construct() {# Z6 V$ T6 A4 |) J
  12.     $server = DBSERVER;
    : L( O9 s- h% Q8 W$ E: `- r- c' T% ^
  13.     $user = DBUSER;
    ! r/ M0 C+ d! e2 Y% ?' r
  14.     $password = DBPASS;
    9 d2 K, l, L6 C& ]; h+ _/ U
  15.     $port = DBPORT;
    6 B: H+ }7 b- B/ _" y
  16.     $database = DBNAME;! U( ^, x' D# G5 Q" B' l9 S$ d
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    , {- a6 R: \* c3 e+ w' ^1 ~6 \" _
  18.     $this->database = $mongo->$database;
    7 G/ K5 }6 S2 |4 k+ o" {' E
  19.   }+ }, `, V6 J. g; t
  20.   /**1 z; J4 W7 _7 n: ^
  21.    * 数据库单例方法
    0 F. L. o' J- w4 u- g
  22.    * @param $server/ p6 x6 P0 ^; S1 h. `$ c) m" t) g
  23.    * @param $user) i3 E( m  Z. P! e9 t6 V1 T
  24.    * @param $password
    & {+ l( u( e* C. y8 E4 S6 c* S
  25.    * @param $port& j+ c$ h& K3 |% g0 r5 O- p9 u, ]
  26.    * @return Mongo
    # j$ f: m# u/ d! i8 ~& S) S% _+ p0 w
  27.    */
    4 ^8 l( ]; D+ d& h" j0 V
  28.   public function getInstance($server, $user, $password, $port) {' P: M- \4 c% y! c, C+ F
  29.     if (isset($this->mo)) {4 p7 L9 ?) M3 h5 `5 F0 R3 `8 e
  30.       return $this->mo;
    + D% `0 V7 i; t& q: Y9 E
  31.     } else {
    # Q4 t' g- m4 j3 f- [
  32.       if (!empty($server)) {
    5 F; K2 H- y' \8 W2 }
  33.         if (!empty($port)) {
    , j% k0 v# ]: @; v- ]# V
  34.           if (!empty($user) && !empty($password)) {7 S& p/ x) |8 w$ M) b! z4 E/ V
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
    $ o/ P" A  c" o- P! K  R4 ^
  36.           } else {
    ) `& G2 T6 ?4 S! F' R( _: S
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");
      }$ b! I# Z+ U3 z/ j
  38.           }1 d' Y9 I( a9 u5 O: [
  39.         } else {4 P6 c8 H3 Q9 m6 K
  40.           $this->mo = new Mongo("mongodb://{$server}");2 w, ]0 S4 e  l' `8 i
  41.         }" G4 S$ x3 v0 m- i$ r* l: T
  42.       } else {
    2 l% ]" g. l5 M$ M$ F3 V4 _" L
  43.         $this->mo = new Mongo();, B7 ^- v: b3 y) }+ |9 Z0 I
  44.       }
    # ~! w3 F% r/ o' P! \) e; r
  45.       return $this->mo;
      Z" u$ N9 D3 Q$ r* a- u
  46.     }
    * N$ E. `; K+ u, {/ ]/ a' l0 J
  47.   }6 S6 R& ]+ P8 s/ k" ^
  48.   /**, L" f3 @' w5 Q* B
  49.    * 查询表中所有数据$ `) `. e; Y! @, j+ @2 l
  50.    * @param $table! g8 B  ~& v. I3 d: G1 X
  51.    * @param array $where
    7 _0 b% Z7 F+ ?- S
  52.    * @param array $sort
    6 w1 s# _3 B  O" A
  53.    * @param string $limit  e- @2 _1 J1 l0 l4 y! {+ X! \) F
  54.    * @param string $skip: U; T5 n" b/ q0 p$ Z+ }
  55.    * @return array|int
    3 I( U4 g* _. @
  56.    */
    * S) g7 m8 d  Z: h% P  z( u( |  g
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    / W) \2 Q! m; U' e- N
  58.     if (!empty($where)) {
    / V% T/ \0 r, m" a6 a: I/ A
  59.       $data = $this->database->$table->find($where);
    + U) N- g8 R: X2 j; m5 r
  60.     } else {
    ) N. [$ N6 ^" Y: v$ c$ X' K, `
  61.       $data = $this->database->$table->find();
    * H* L# j, s: W" j/ |% @
  62.     }
    ; ~* Z  C4 [$ f: ]! J/ I& F' p
  63.     if (!empty($sort)) {
    8 ?6 @: K* E) \* I9 j8 ?
  64.       $data = $data->sort($sort);
    % B$ U0 j7 Y! K- c* u
  65.     }+ Q$ u' m% m- ?+ ?; n8 R9 B: ^
  66.     if (!empty($limit)) {: n+ L8 N" m+ e0 Y* F& J
  67.       $data = $data->limit($limit);
    & ]' @8 C& O. m' m5 @
  68.     }4 w# `: u) {1 l
  69.     if (!empty($skip)) {
    , b. z: x5 o* i1 g" g& n
  70.       $data = $data->skip($skip);
    ! k$ F& r6 L& _8 C% T  T! o
  71.     }
    3 K4 s2 k/ ]: T( R$ ~1 V, X2 J
  72.     $newData = array();
    4 O+ Y4 Q8 F7 G' C- u
  73.     while ($data->hasNext()) {
    , x6 `1 ^! s4 d! v
  74.       $newData[] = $data->getNext();
    $ B- F- ~9 ?# q0 X. W+ ^# |
  75.     }
    2 r( m1 v9 T8 ], D* E
  76.     if (count($newData) == 0) {
    8 L- u. v0 |' ?1 [. Y
  77.       return 0;
    , b0 F4 I& p6 R  `
  78.     }
    / @. v0 J; q0 g7 x( u; r& A2 L$ l5 |
  79.     return $newData;
    " x. G! `& ?4 Y5 d
  80.   }
    ' N3 ~7 B) ^  _; r+ c6 v
  81.   /**, P& \8 x0 y' x+ H
  82.    * 查询指定一条数据6 }( f$ G' n7 c7 G& T) ~* C2 }
  83.    * @param $table, o% y% X) X0 Y' F! |
  84.    * @param array $where
    9 M7 S4 Y  A% h4 Z: o) h
  85.    * @return int9 g9 O# M8 X7 N# u+ R. F/ V# j
  86.    */
    , c  ?1 Z7 n1 K/ _7 v, S0 ]
  87.   public function getOne($table, $where = array()) {
    2 y; [; r  J9 U5 f7 [
  88.     if (!empty($where)) {8 q- Z& U% L; v7 B8 V
  89.       $data = $this->database->$table->findOne($where);+ j0 n/ T. M/ K3 }% a) }/ G3 i
  90.     } else {
    $ Q: t& h8 t/ K/ C- w$ F, m
  91.       $data = $this->database->$table->findOne();. N  T6 N' k9 z! [; r* C
  92.     }' [3 a( y+ O- s4 }$ l+ V; R5 n
  93.     return $data;+ |4 s# o- k) y% D" ]0 ~) H
  94.   }
    5 ~1 u0 o% O7 N4 P7 P0 K2 G
  95.   /**
    & E1 C7 m. ~6 g2 Q
  96.    * 统计个数
    ! M  E8 U4 T) \, d) s7 j5 ~; G
  97.    * @param $table
    ; K% ?3 Q% T- ^0 ^  z+ z
  98.    * @param array $where, K0 p' N$ t  ~% B$ P3 Y
  99.    * @return mixed# @! T1 E- F# c. K, v& J
  100.    */0 H/ M4 L2 B) w
  101.   public function getCount($table, $where = array()) {
    6 ~% }% w9 \9 V9 e
  102.     if (!empty($where)) {
    3 p+ Y& x; j$ W' d
  103.       $data = $this->database->$table->find($where)->count();6 n: z/ w7 S  |7 [
  104.     } else {2 E; [) ~; a7 R7 m) C
  105.       $data = $this->database->$table->find()->count();% E- o! b2 X* }, n/ X+ P
  106.     }9 G6 [. ^/ d. Y- _
  107.     return $data;" }9 M9 s5 B9 E/ w0 G+ }
  108.   }2 o4 y4 i; `8 Q2 k, {7 q# o
  109.   /**
    0 H5 e9 P) X4 [* s5 f  y4 h
  110.    * 直接执行mongo命令
    / A2 T2 w0 J* ?) E
  111.    * @param $sql
    - t: {, g$ j, w9 B: q3 u2 d% F
  112.    * @return array8 [) |) H. ]) a1 B! J' x8 G4 k
  113.    */3 p! e1 \8 T  O' M( ^
  114.   public function toExcute($sql) {
    * v8 T1 a  k6 T3 X2 g
  115.     $result = $this->database->execute($sql);, S7 |4 I0 H) I# ~- ~8 ?4 Y
  116.     return $result;
    : ~+ ]( a/ U7 F: u# ]  j
  117.   }
    ; f- {9 b5 U  {' N
  118.   /**' s9 N& X0 N1 q9 x, F) F$ e
  119.    * 分组统计个数5 J; o5 u) B, ~& }% i7 x0 {* \! S, L
  120.    * @param $table
    . H# x( s4 o+ C! p1 P
  121.    * @param $where3 h0 Y) Q. t: X
  122.    * @param $field
    4 v: ]! v+ A9 j# @5 ]
  123.    */
    ; `, _, D/ C* j5 [
  124.   public function groupCount($table, $where, $field) {
    # x6 E5 Q2 a5 Y2 g7 I% U- }$ x
  125.     $cond = array(8 s: B, j6 Q, Y, q* H1 f
  126.       array(. R- S  [* R% x) E0 v, M) k! W
  127.         '$match' => $where,
    - h$ v  `+ l& y' \9 b0 `
  128.       ),) V8 h' k7 f. \' G% D/ x- d9 d
  129.       array(
    ( ?) C  e) N7 v
  130.         '$group' => array(
    3 W& [8 h) G; W
  131.           '_id' => '( C6 n+ f" J) {4 K- V! W9 B3 `" e; ~

  132. 9 e, H3 ^" A# Y/ }  e+ }
  133. . $field,
    # _$ \1 A; H7 ]* n
  134.           'count' => array('$sum' => 1),
    ( n, |4 B6 H. a
  135.         ),& n4 }1 ]+ N, x; \
  136.       ),& ~3 M# L. r0 p* M, E- c) W
  137.       array(# J% p2 D" T" M7 X' g, |0 _' U
  138.         '$sort' => array("count" => -1),4 [; X$ }: F5 s" R+ j
  139.       ),
    2 o' d7 e5 C5 L* k1 ~! a# _
  140.     );
    ) t* q) b; R  k$ {- F
  141.     $this->database->$table->aggregate($cond);4 R* w3 K) ?0 |! {9 A, w8 |
  142.   }! z* }$ }/ u5 I- m. r0 b
  143.   /**
    . |6 `* Y% r$ A1 [. s
  144.    * 删除数据
      l, G' D, {; }8 l/ P4 k
  145.    * @param $table
    8 \& {) e- X& u7 A& }
  146.    * @param $where
    % L+ y1 P/ c  V7 |. m) V
  147.    * @return array|bool& Z7 f4 ?% |! w; P  v
  148.    */. f; p( ?* o- e6 k- R2 D7 t; y
  149.   public function toDelete($table, $where) {4 b0 A! a* M) \  @. J+ @
  150.     $re = $this->database->$table->remove($where);
    0 j2 N3 K4 {1 s' P, [/ k
  151.     return $re;) i, Q1 r0 l! b
  152.   }1 G5 ^) i% |. N
  153.   /**" t1 G3 p) k6 ]7 Y+ K
  154.    * 插入数据# W( L7 `. t( S0 e+ @5 Y
  155.    * @param $table
    % o  ?" g" j' _$ C- i
  156.    * @param $data
    ; X8 c* I8 t* k/ d1 W
  157.    * @return array|bool
    1 ]: {+ n! C8 j  ~
  158.    */
    2 K* X4 R: T! R% t. t2 |3 c4 l4 P
  159.   public function toInsert($table, $data) {
    * V! }9 |7 n% }- j$ i
  160.     $re = $this->database->$table->insert($data);: g7 h) a/ ^% s: e
  161.     return $re;/ ?7 T4 e# S4 l( Y' C
  162.   }
    # p! h9 u1 v; [/ A1 y
  163.   /**
    - T8 M( D4 a7 M9 `
  164.    * 更新数据
    $ S, Y. f- I2 O; N" `. u" B
  165.    * @param $table" \+ o" b! k: _4 a9 [
  166.    * @param $where
    8 w. D# Y- C: v) p4 a
  167.    * @param $data0 \# v! ~8 g8 Z' ~( b1 V3 a
  168.    * @return bool
    + n! g4 m9 ~! ~0 n' @
  169.    */6 c! P: h8 ]8 ~. W/ k
  170.   public function toUpdate($table, $where, $data) {
      H! H+ v- @: G4 k( W( ~0 K
  171.     $re = $this->database->$table->update($where, array('$set' => $data));, K% C/ q, T- Q9 p' ]- G' o4 t4 B
  172.     return $re;9 Q8 b/ |( U* g$ C* f5 @
  173.   }
    / e; Q, P3 g4 U: ?1 Q) E
  174.   /**; c) B; {, h  i) I; ]
  175.    * 获取唯一数据
    + A7 N9 |. h/ h0 e0 ^  ~
  176.    * @param $table0 I$ u& r9 V5 R. o% W& n4 a
  177.    * @param $key  G. N# |5 t1 w9 U# l+ J5 P
  178.    * @return array
    9 ^" l2 k( g" V" H" M- I" e3 r
  179.    */
    2 a; i2 Z2 S6 N8 Q* e6 e
  180.   public function distinctData($table, $key, $query = array()) {
    : ^: d8 P" I& w3 y1 [
  181.     if (!empty($query)) {
    / h% m3 Q) f6 P* U2 t
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);0 D8 i5 a( Y' M
  183.     } else {' O: ?4 u) M+ M8 r
  184.       $where = array('distinct' => $table, 'key' => $key);! J* W. i+ U3 W4 \6 m
  185.     }
    : J( y, }$ Q5 z, u7 C  N
  186.     $data = $this->database->command($where);
    6 e& j, |' _% a# e$ d
  187.     return $data['values'];4 N1 s, k0 I6 L+ e3 K
  188.   }
    # A$ B4 k. @9 W, L' D
  189. }3 v6 j8 F+ A# }/ u" [7 N
  190. ?>
复制代码

$ L+ D4 {7 z4 K) s& L: ^7 B9 G, F
/ o" k! G  q( l, T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 02:14 , Processed in 0.108865 second(s), 21 queries .

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