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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
$ Z- G7 B, _8 H& q模式自由。+ p4 L  U5 V* L/ R
支持动态查询。
4 E4 `' T( e* J4 w) w支持完全索引,包含内部对象。* }; ]) z' G* f6 k7 E3 [5 m. a9 j
支持查询。1 A3 S: @9 b' O, p! M, P
支持复制和故障恢复。: @9 x7 a% R- K3 |3 ?
使用高效的二进制数据存储,包括大型对象(如视频等)。
+ h% k0 z8 \' K自动处理碎片,以支持云计算层次的扩展性
! z) `* Z2 F/ V/ Z2 M3 ^" K支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ B) y7 F! S3 }. w% f7 |文件存储格式为BSON(一种JSON的扩展)
* A' \, m5 O* ~* x( T3 l可通过网络访问

所谓“面向集合”(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. <?php8 c: s: W: W+ n2 r
  2. /**9 O. {8 S; ]1 P: \9 k
  3. * PHP操作mongodb数据库操作类
    : u8 X' D$ t% e! t
  4. */* F( V7 ?% P- G5 h+ ^! c& Y
  5. class Database {
    4 v6 B6 z5 x5 N3 G
  6.   protected $database  = '';
    ( [* }: c% i- p  J8 y2 ~% Q
  7.   protected $mo;$ Z" j& {2 k" G# f2 j9 O
  8.   /**" c& ?- p. `8 ~! Q8 C
  9.    * 构造方法5 g/ c0 o: L) _" b9 Q0 F+ Z0 H
  10.    */' f. G- u5 H( l: ^' y
  11.   public function __construct() {8 ~4 A* m0 {7 I& Z5 E" B. E% P1 [0 R
  12.     $server = DBSERVER;7 `0 l$ |8 Y6 U# t/ \+ O; g
  13.     $user = DBUSER;
    ( B9 F7 P2 Q( S$ C* s
  14.     $password = DBPASS;
    ; C3 B, S# x% A' K1 N. F; Q% a
  15.     $port = DBPORT;
    8 l7 h7 s7 R5 r9 i# N. w: E9 u
  16.     $database = DBNAME;/ Z* A, q% D0 l, z
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    - Z4 F& `4 j% Z7 N4 X9 U( }1 {
  18.     $this->database = $mongo->$database;
    0 i$ @( B1 y- a9 t- v
  19.   }8 O* g, e4 \2 [% u" W8 P
  20.   /**
    5 @% a: h8 _3 q. L3 m3 B/ n
  21.    * 数据库单例方法, Z, d& \: x" {! ?
  22.    * @param $server
    . I; d; L; D( W% P
  23.    * @param $user
      b$ `7 A0 ]. T; k  i# O
  24.    * @param $password! p, Y0 I: v6 R# J% ~
  25.    * @param $port
    6 L& Z( m8 n  S( _: s" }
  26.    * @return Mongo7 {. e/ U, b: l  Y# |6 {# I
  27.    */
    8 m3 Q% v2 ?. }# W! t) n
  28.   public function getInstance($server, $user, $password, $port) {+ V2 P6 x6 ~! E; [
  29.     if (isset($this->mo)) {
    2 ]0 z# ~* L* O: J
  30.       return $this->mo;
    8 h" V2 ?. L; W0 m9 V" V
  31.     } else {# ]! m5 b  ?5 Y4 M
  32.       if (!empty($server)) {
    % C+ |5 ]7 L5 E* a) X0 |7 j
  33.         if (!empty($port)) {! K. @& f- a/ p: {/ L  g+ B, ~- X5 L$ {
  34.           if (!empty($user) && !empty($password)) {
    6 B0 @4 }# V3 X& X8 S
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");/ A: Q. M0 e% T& X2 ]8 r$ K: _; Q
  36.           } else {8 C8 ^! Q% K, a+ d; g' p
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");
    ! K& [, V# Q7 V: n/ o* c' G
  38.           }
    & Q. p: D, e3 p( Y" Y& f  ~2 A
  39.         } else {
    $ _6 b. [/ G0 S6 N0 k
  40.           $this->mo = new Mongo("mongodb://{$server}");
    8 G, I4 X7 Z- e  i  [/ w
  41.         }
    , x  y9 m! V) w& a
  42.       } else {
    # ^6 m* F8 q8 j/ Z! r1 m& q
  43.         $this->mo = new Mongo();
    & U# S  L: h. Z7 Z8 L! K
  44.       }
    % s  a- X5 P- v% l, R  c
  45.       return $this->mo;
    + n( J7 B) O) R4 B" b& Q. w
  46.     }
    6 M1 |8 c! r% U, a5 }1 J( T  E3 M
  47.   }
    / K% |5 j" R- U2 U0 e
  48.   /**
    ' @. G% z& s) |6 l* P0 ?
  49.    * 查询表中所有数据: j4 r* r( F, t6 S$ Q: e
  50.    * @param $table: e' a6 l' f* R, a# q
  51.    * @param array $where6 ~8 s: A2 S1 w2 r
  52.    * @param array $sort
    4 ]+ o  c3 L8 z3 E; B. {/ y' m  M
  53.    * @param string $limit, U/ J, s( Z( h7 Z
  54.    * @param string $skip) k/ |# G3 K" s/ S. B: y: i
  55.    * @return array|int
    * T# s: J3 y2 s' c' P3 W0 [) O: j+ m
  56.    */( A* I) e# \( K" m* L; ^9 |
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {5 t! n7 v5 J7 E
  58.     if (!empty($where)) {2 I( C; Y* z* l
  59.       $data = $this->database->$table->find($where);& k+ T! ^+ f$ P- J6 j
  60.     } else {
    5 p8 q' C0 l: B: N
  61.       $data = $this->database->$table->find();2 Z1 f8 L9 Q7 N! R- H3 [0 o# i9 R2 I, a
  62.     }
    - R+ H1 @  m9 Y8 y/ L) m4 G4 H
  63.     if (!empty($sort)) {
    - n1 ?9 L. ^4 h% Q5 q1 Z* T
  64.       $data = $data->sort($sort);4 h* S( c, N% c4 a7 a! v8 S
  65.     }
    # a- z( n4 b' Z  T1 [
  66.     if (!empty($limit)) {& N+ u. y3 c1 \& y. u' m5 j8 g' L
  67.       $data = $data->limit($limit);
    $ t5 R" B$ M: V; X( ]) ^3 a
  68.     }$ ]/ ?6 D  L: n4 G2 ]# L' f
  69.     if (!empty($skip)) {
    - F- S+ ?1 Q( d! f& G( O; P
  70.       $data = $data->skip($skip);* Y' X3 g! _0 v7 v: Z
  71.     }! [, d3 ]5 x8 H9 Y' c# L
  72.     $newData = array();
    ) r' n% m, |3 |) R' `3 L, X; k
  73.     while ($data->hasNext()) {
    ! x4 w! }, I8 L
  74.       $newData[] = $data->getNext();  ]2 D' w. `9 F
  75.     }' e: K; W% b1 G, L, R3 l
  76.     if (count($newData) == 0) {
    * G7 c6 v+ \. V6 o3 ]5 ~. Z+ W
  77.       return 0;  p8 {% q8 ]4 h5 |" n# _
  78.     }0 @( n& c; b3 |  d6 E! L- C# R
  79.     return $newData;2 b3 o7 G" q+ G, C) h0 H# `
  80.   }0 A5 }3 u" ~+ q3 w
  81.   /**
    0 ~2 V. w; R# h# s7 z$ _
  82.    * 查询指定一条数据
    ( \2 t4 D9 H! U. a* p
  83.    * @param $table9 o4 y% d6 k$ \1 k( s( f/ ]
  84.    * @param array $where& u. S% F" z/ S1 @/ p' U
  85.    * @return int
    " {. f( ^" h9 Y, N
  86.    */
    ( P5 h9 E& a- h
  87.   public function getOne($table, $where = array()) {
    0 h5 Q- d7 N1 G: }% o$ X
  88.     if (!empty($where)) {7 x. l% l2 z8 a/ C1 o2 a
  89.       $data = $this->database->$table->findOne($where);/ g  O3 _' L' O; \% ]8 d; X5 C
  90.     } else {
    ; I: {. U. X2 s' U- U) s8 f
  91.       $data = $this->database->$table->findOne();: @- j: T( X: T; V
  92.     }
    0 y! ~' q# X% _4 o5 U- O
  93.     return $data;
    7 H! e$ R, X7 }8 y
  94.   }
    ! @% A3 D6 P; ^5 r: Q
  95.   /**, Q6 {7 P% U" `) X/ c, }* v
  96.    * 统计个数5 }; j7 K' d; ~! H" l
  97.    * @param $table
    5 V$ {$ p3 ^3 x8 j( K
  98.    * @param array $where
    6 F  j7 ^/ f: Z- v
  99.    * @return mixed
    & _; z4 _2 @: ]' l, S' C1 f& j
  100.    */& h: p: |9 {* r( v/ U# ^( u: j7 w
  101.   public function getCount($table, $where = array()) {
    % u7 Y2 l3 c6 [+ O1 \: e: f+ Q
  102.     if (!empty($where)) {2 B8 n% H! w8 i: z
  103.       $data = $this->database->$table->find($where)->count();6 `) m( N; T/ X
  104.     } else {
    3 ?& A4 u7 q" V6 U
  105.       $data = $this->database->$table->find()->count();* D9 e8 q! m% v) ]' ?2 G9 b, c6 \2 d
  106.     }
    , }7 V6 ?! \& P2 l; I8 B" Y
  107.     return $data;3 i1 t# [) J$ P3 E( j+ o
  108.   }2 Y2 N7 m5 \2 o( T
  109.   /**+ |$ x$ S: \. F" V
  110.    * 直接执行mongo命令
    3 D5 I2 ^2 ]4 G' ^2 D! J
  111.    * @param $sql4 f0 H, y' K2 S- v
  112.    * @return array
    : e7 P9 I/ |. @2 ?* Q# c" a$ B
  113.    */
    / {6 G0 I0 k  w; k
  114.   public function toExcute($sql) {
    & a) h9 y- V3 X. }- w8 v
  115.     $result = $this->database->execute($sql);! o; ^8 I' D- ?2 v/ \
  116.     return $result;5 `: D; l& N7 ^& h4 k
  117.   }
    ; m; q8 F8 I+ Y( W, L; D  q
  118.   /**' t" e4 @3 s5 Z) ?* u8 c
  119.    * 分组统计个数- |$ D0 q! ~' w3 C4 T2 P6 L
  120.    * @param $table
    6 C2 ?! @( [/ I6 Z4 g% b+ t
  121.    * @param $where
    7 Z0 A. n2 b' Z8 v4 J
  122.    * @param $field! w. I6 o% A/ ]0 X+ x6 N! h
  123.    */$ P2 H$ A9 y: B! g3 N' W+ ~
  124.   public function groupCount($table, $where, $field) {* |8 {  \% A8 q. ]( ?1 X
  125.     $cond = array(
    + X8 m  b0 A! m1 L
  126.       array(5 ^  W# r/ R  H$ C- b7 s1 k1 [
  127.         '$match' => $where,7 i6 r0 N9 I1 d9 x0 u
  128.       ),6 r5 U* S, ?  F1 v8 j
  129.       array(* u3 q) h: r+ V3 y0 [2 U( a
  130.         '$group' => array(3 j* p9 C' `" n& |
  131.           '_id' => '
    7 b( t' T+ R$ h  l
  132. 4 }& u4 a9 O& e( Z2 N: _7 h
  133. . $field,
    * K0 F+ B% J; d1 ?
  134.           'count' => array('$sum' => 1),$ Y' V7 }4 ^( g8 ?7 f9 O9 U
  135.         ),1 Q: S: H( G3 F& S" m
  136.       ),
    ( l  _. Q& A4 V3 `9 {! [8 g# e7 \
  137.       array($ I! \! d) j8 p
  138.         '$sort' => array("count" => -1),( u2 ?8 S$ \. L
  139.       ),: `- @- |$ M. f9 ~6 ^
  140.     );, N! n2 h9 y; d
  141.     $this->database->$table->aggregate($cond);
    5 S! w+ r7 f" t  z/ |& f* ]  b$ R
  142.   }
    " q" u1 u1 e3 ]$ w
  143.   /**
    & d- B7 x5 M6 D/ `* F* ^' X
  144.    * 删除数据1 R+ L6 ]5 d' ~% @, p- o
  145.    * @param $table
    : P: u% R6 {8 U% k1 y' e: J: H
  146.    * @param $where+ T+ v9 Q- a, V' |9 p! _
  147.    * @return array|bool
    # h" I' U( J9 q/ @/ C* X0 m+ ]
  148.    */
    7 U9 Z; Q, H% f
  149.   public function toDelete($table, $where) {
    7 Z1 A' H  U5 I
  150.     $re = $this->database->$table->remove($where);
    $ N, \) H1 ?) [" D/ a' \6 u3 v
  151.     return $re;8 M$ Z* i6 {2 r- I
  152.   }9 ]: M# g( \7 d2 z; g, Q
  153.   /**3 {2 ~+ B2 B5 O, R; E0 L
  154.    * 插入数据
    . r  x9 q' ^/ a8 ~6 q2 C
  155.    * @param $table/ L: G/ E+ ~0 R% k
  156.    * @param $data+ b1 Z; h$ m% b, ?6 u, {, ^/ |
  157.    * @return array|bool
    $ B6 q5 R2 m9 `; C; I
  158.    */
    3 b+ w, s& z# @
  159.   public function toInsert($table, $data) {
    % t4 u; z' n5 w5 _, C: B1 R
  160.     $re = $this->database->$table->insert($data);
    , i4 S/ H8 O( a/ E
  161.     return $re;
    2 m- B/ X7 G+ c' R( B4 Z
  162.   }6 e* t8 w- Y1 P# G" I* D
  163.   /**9 m( h; u% |% L7 t$ _* a& e
  164.    * 更新数据
    ( H) g  r; b% ~% r1 |$ c
  165.    * @param $table, e0 F% j7 L" o# z
  166.    * @param $where! o; B8 _8 G8 D1 }- A
  167.    * @param $data
    - x, C* }8 Y- V' U8 N6 f+ s
  168.    * @return bool
    : y) n+ E$ g  P7 e1 [; ]
  169.    */' G( z$ h- d- C( \# r: y, x
  170.   public function toUpdate($table, $where, $data) {
    + A( s2 A8 I! W  ~& x1 V% c
  171.     $re = $this->database->$table->update($where, array('$set' => $data));
    / ^" c& }2 T0 D; y, }! E
  172.     return $re;/ Q6 T! j1 m; H: z
  173.   }) a* y7 p2 `+ b6 m9 F
  174.   /**& t1 p; ?0 A5 Y# m/ N
  175.    * 获取唯一数据
    " A9 U( p, H- T6 \
  176.    * @param $table
    : X8 P" K' i5 R( ~- o2 `1 i
  177.    * @param $key  b# C: t$ k4 @# z4 F' n
  178.    * @return array- H6 R. G/ r8 q
  179.    */# Y. A* Z0 m* L# m
  180.   public function distinctData($table, $key, $query = array()) {
    & r1 o0 d0 X; \
  181.     if (!empty($query)) {
    7 t! x( R: b2 M% f/ E: V+ G, z
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);& \; ~8 s+ S# H6 m  z- M' [
  183.     } else {* d$ E3 R  X1 D) z
  184.       $where = array('distinct' => $table, 'key' => $key);) ?, T, ]$ S, y1 V- r4 j
  185.     }
    , B" K- S$ c7 d. Q( C) A- N
  186.     $data = $this->database->command($where);( G6 O/ O- I. t! S' X
  187.     return $data['values'];
    ! k+ M9 @, R$ p
  188.   }
    ! ~+ V) [! L. p( ~8 b, I
  189. }+ s  ^& {/ u1 D2 Q% R4 D8 x# |) U
  190. ?>
复制代码
* i! N0 d: g& O- C7 c

6 L5 ^/ x" N- P, W. g9 `. x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:23 , Processed in 0.058378 second(s), 19 queries .

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