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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。  L/ e& Z. l# R
模式自由。
0 \% u  g6 T2 l# c5 @- j支持动态查询。2 E: L( r' t$ i' f
支持完全索引,包含内部对象。
! \+ m/ m. R4 }1 ]  R6 H& R支持查询。
6 J$ F! U' P& O) d; Q; F, B- S3 f4 p支持复制和故障恢复。: a6 x" c7 ^! X( k! x5 O# F
使用高效的二进制数据存储,包括大型对象(如视频等)。/ X) W- `8 V/ S4 l! s
自动处理碎片,以支持云计算层次的扩展性
% [, u  d* ~1 [  P# l  j4 o支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
0 P/ h+ N4 u% _5 M- w- |文件存储格式为BSON(一种JSON的扩展)
) A* a, I8 f1 _1 v可通过网络访问

所谓“面向集合”(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& G  U* t2 r/ {1 G0 e6 L
  2. /**+ ^" T+ p+ J2 H. L1 _# g+ F
  3. * PHP操作mongodb数据库操作类
    $ p0 X) ]- T# z, X. g
  4. */
      a/ x& ]/ U4 [0 u
  5. class Database {
    ; `& O1 N- u" n$ R7 a1 t0 G+ h
  6.   protected $database  = '';
    6 Y6 B5 R9 l" P; I! [. R& n
  7.   protected $mo;. u# {/ q$ o4 s
  8.   /**# E( Z2 E, S1 h% p% w
  9.    * 构造方法
    " k/ g0 H7 U  i; y9 K6 b+ @5 r* [
  10.    */
    0 U$ N( J/ r- v& q$ J
  11.   public function __construct() {
    & }: [$ D# ~) g2 t( p' z
  12.     $server = DBSERVER;/ ~- G; J1 P1 F1 _/ T2 b4 X/ ]( w
  13.     $user = DBUSER;
    3 I7 J* K2 Z* x- |
  14.     $password = DBPASS;3 O1 L5 C. Q; ^; f4 T. m
  15.     $port = DBPORT;
    8 Q; g1 A# Y9 Z; |" A
  16.     $database = DBNAME;
    - h. f1 l! J: f. @
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    8 V& K0 M5 U) u7 M3 i7 U. E
  18.     $this->database = $mongo->$database;
    ; [$ {6 V, d' f
  19.   }7 ^$ b$ F6 B) c. I, H2 K) b$ \
  20.   /*** C1 F4 V/ `' I) K0 W% j9 O
  21.    * 数据库单例方法9 H+ n/ q7 |6 J0 Y! L' G' a) H
  22.    * @param $server
    2 B( o( _8 \' d
  23.    * @param $user
    & a6 B" ?6 _3 {0 _/ r
  24.    * @param $password% `* s( i2 H; N# E
  25.    * @param $port
    * k. ^9 \) B- v# B, x5 l6 M
  26.    * @return Mongo; W$ C7 v; X: R. I- x$ @
  27.    */% f- X: \4 |2 ?& l# F) S% d0 F
  28.   public function getInstance($server, $user, $password, $port) {
    7 q1 ^  v1 r! I9 u0 J
  29.     if (isset($this->mo)) {* U9 K6 `# f& m& e8 A- `
  30.       return $this->mo;
    8 Y3 U/ ]3 f+ o) S0 x  \/ h
  31.     } else {
    ! \2 }# a4 S: d
  32.       if (!empty($server)) {8 j- @9 i: v8 a7 a' z8 f
  33.         if (!empty($port)) {
    8 B0 b( T3 l, b; Z% a6 m+ t
  34.           if (!empty($user) && !empty($password)) {# u  x1 }) B4 [8 l5 h3 J: U
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
    # b+ g1 f$ g. V  U& N2 G# x; a, M& O
  36.           } else {
    9 e' u7 H2 }0 F, c1 o+ c
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");) C: s8 @0 ?+ v- _+ m
  38.           }; [, t. `& L. {* l! {# q& X
  39.         } else {5 j) S+ s; Z, g" ?' j& Q
  40.           $this->mo = new Mongo("mongodb://{$server}");0 ]6 z% L( v8 [. ^0 p/ q) n" i
  41.         }
    : C9 s/ k7 C- [# V* C  M; ?6 ^
  42.       } else {
    3 m. Q/ i) O, B" x  V7 P
  43.         $this->mo = new Mongo();
    9 v0 W6 z& t9 g6 H: N0 r
  44.       }
    * u  V6 i4 \  k/ [5 \# Q: D
  45.       return $this->mo;
    6 n# a4 s2 \; v) a; t  k
  46.     }
    9 q( R' k* W1 k7 w. w
  47.   }
    % d( d( [8 _3 J9 S+ t  a; X* u: p6 g7 ?
  48.   /**
    % G$ ]  u3 f, p8 ^# p7 n
  49.    * 查询表中所有数据, e2 @* N* X# A$ t' e
  50.    * @param $table
    " S* v- k3 x7 h/ C3 p
  51.    * @param array $where2 R' e2 l# r6 K! c- `( U8 z" `* p2 g
  52.    * @param array $sort5 f- |, d( V- S
  53.    * @param string $limit
    1 n, ]2 y- _0 S8 Y
  54.    * @param string $skip
    * U2 G# }9 X2 ]0 K- {! t
  55.    * @return array|int4 `9 z0 _* Q4 D
  56.    */5 w" L3 b. f) p3 J+ ?" Y; b6 j
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
      v5 B% j) q: S4 R# C
  58.     if (!empty($where)) {
    . @% e1 u* i- S1 S) T+ g
  59.       $data = $this->database->$table->find($where);7 P7 e. x" j8 ?! d2 v
  60.     } else {1 \/ R1 U* E1 q/ U8 s' [
  61.       $data = $this->database->$table->find();1 `* G6 x& Y' k! _
  62.     }, H5 d' H( X5 ]
  63.     if (!empty($sort)) {* y& v" }9 c- B* u" l5 r
  64.       $data = $data->sort($sort);; ~# s3 @4 y4 c  z
  65.     }/ ?1 I' ]# g: \' E7 K
  66.     if (!empty($limit)) {# Q: F! e. o1 s+ t, D
  67.       $data = $data->limit($limit);: u$ Q" G/ N  W9 j
  68.     }4 R# X; m6 Q% f6 \2 m
  69.     if (!empty($skip)) {
    2 o. I# I' V9 _$ n/ n3 f( b% E) {
  70.       $data = $data->skip($skip);+ O" y* i: c# h# B
  71.     }3 v% g* t; [8 p) I. F7 ^
  72.     $newData = array();  R8 M& z# N! Y; c: l
  73.     while ($data->hasNext()) {
    * D7 I3 ]8 r4 s3 M; t5 v8 \, A+ x! e+ C
  74.       $newData[] = $data->getNext();0 o/ N& a3 i; T& k: G+ M8 D( t9 ^
  75.     }7 |- j8 _4 E0 H! t5 w
  76.     if (count($newData) == 0) {8 y1 F3 O! s8 j% q. ]
  77.       return 0;9 I, M- _" I6 k; r  M0 ]
  78.     }
    8 F1 n% T* e4 H5 u' G0 Z8 h
  79.     return $newData;
    6 ]. i: h% W8 m) ?/ x: @
  80.   }; s& R; ]  n: X* c' o+ p0 d
  81.   /**
    9 Y6 a+ E% C% c, o
  82.    * 查询指定一条数据2 L# W1 `# E( I3 ~3 W% s/ i' ?
  83.    * @param $table2 G# W) F1 K" r
  84.    * @param array $where
    0 U8 ^' B0 E2 Y+ O2 b" c
  85.    * @return int/ \" y; N5 F) n% |# |) O
  86.    */. ^1 u, i( H6 p6 T" C# S1 A; z7 I5 {/ P
  87.   public function getOne($table, $where = array()) {
    - X$ u$ d$ a1 ?
  88.     if (!empty($where)) {" _1 h( q: k' _& o# S
  89.       $data = $this->database->$table->findOne($where);
    ( j1 [3 B2 E" ~5 c5 q' t0 B; T3 R
  90.     } else {
    2 y! j+ C& ^) K5 V) U' T
  91.       $data = $this->database->$table->findOne();/ M. S5 |9 _7 l, ~# j- i
  92.     }' n% I, d. o8 a1 d! p0 D4 a& k# m
  93.     return $data;( ^. Z4 J5 |( g6 z* F5 f
  94.   }' u$ y/ M3 P" N/ f- ?7 @3 C: y
  95.   /**
    8 s5 s+ ~6 [4 m3 ~
  96.    * 统计个数2 P, d" H1 k) N; H
  97.    * @param $table) l3 t) m. S2 v
  98.    * @param array $where6 R7 r7 @1 ^; c' O- C9 |& s
  99.    * @return mixed
    ! b2 F) r% q; K9 s
  100.    */: u+ P6 P; T+ j! F3 n( H$ t" w' a
  101.   public function getCount($table, $where = array()) {5 J8 e5 N6 C( }& D* J) z
  102.     if (!empty($where)) {
    8 L2 h. a! M- T1 }& k
  103.       $data = $this->database->$table->find($where)->count();
    ! G7 ?7 {* F, u$ a# d9 m6 }$ A9 ~
  104.     } else {4 G! p) a" ~% p( q- L
  105.       $data = $this->database->$table->find()->count();* q0 a9 e2 M4 a  p6 M: S/ c& [
  106.     }) e* o- u) _2 U& g( o& S! O3 Y" y
  107.     return $data;
    ) L9 N5 O5 h- o# X; j" P  ^3 G: F
  108.   }, p, P7 ~3 K* M8 K: y- U" d+ y
  109.   /**/ ?) ^2 |0 t) O5 R
  110.    * 直接执行mongo命令
    9 {3 T" V; s4 W( E/ t3 @
  111.    * @param $sql% l0 a- z3 q' v( I, l9 ~5 |2 m( M
  112.    * @return array# @3 n! L1 O4 G7 j5 }6 J8 M
  113.    */6 K4 f) z, @. m5 ~2 m& U+ W  v
  114.   public function toExcute($sql) {
    9 J' t" l& X# }6 y' X. I
  115.     $result = $this->database->execute($sql);
    # f- m. Z8 O& l2 ?
  116.     return $result;
    ( u9 B6 q+ F- h) z- D% n
  117.   }
    0 u8 S" F; X0 A) ~8 V
  118.   /**
    4 V; s/ L5 G  y$ P* o- s
  119.    * 分组统计个数. {, ]  g3 _& ^8 G6 Q0 e5 C
  120.    * @param $table
    ( Y. {& k# P3 p6 w5 W  T1 {7 _
  121.    * @param $where
    % _( a' u) I( O. J& T( a2 `9 n" x, N
  122.    * @param $field
    : ?( J8 q/ i$ `( N, Y
  123.    */. p1 Q7 y% m% O2 f
  124.   public function groupCount($table, $where, $field) {
    $ ]. I/ y) ?- d
  125.     $cond = array(
    ) S$ o: `/ u7 j) ]" W
  126.       array(
    8 M! H* i' g1 D3 `8 S, \. c% d' W
  127.         '$match' => $where,% e  d& D3 V* _5 ?( O# M5 K
  128.       ),3 P* ~5 }8 D4 |& O
  129.       array(1 h8 O0 l; u+ }7 ?% A) Z  t
  130.         '$group' => array(
    ) @: ]. D% h- B$ y" N. }' r$ X* e% i
  131.           '_id' => '9 X- ^/ r/ n2 [/ Q! S: x& j  K1 ?3 t

  132. ( T# W' b6 O' h% H7 V
  133. . $field,# B  i: p  m. d$ e( M
  134.           'count' => array('$sum' => 1),* d, B; x! r4 ^6 ]
  135.         ),
    ' I, |8 t+ [+ x/ C6 }
  136.       ),9 D" M6 ]: b/ [7 U* v8 D+ o: {
  137.       array(0 W3 i, x! G- d# T+ Z8 C4 t" ~$ y& H9 s
  138.         '$sort' => array("count" => -1)," ~" m# J6 Y4 M' `1 X; {6 o
  139.       )," R0 i& H& _" h! _$ Q2 a, l
  140.     );
    % O  ?; N! q$ r
  141.     $this->database->$table->aggregate($cond);
    7 j$ R" ?7 f, k2 m: g
  142.   }
    1 N9 T% y$ [6 l4 B  L
  143.   /**5 g0 z/ m' d- V3 g2 M$ f) N; q% [
  144.    * 删除数据
    , ~4 \$ m0 f6 r1 v* u. |8 h
  145.    * @param $table! D& t! R! K8 v, R8 l2 g
  146.    * @param $where
    9 @( L9 v. O* n- ~; ^( a% ^
  147.    * @return array|bool6 K/ |( ]$ h/ K( B' J, R1 l
  148.    */1 S! t! S- X: |" c$ B$ F' p
  149.   public function toDelete($table, $where) {4 z$ ]; T7 n/ w& w& r
  150.     $re = $this->database->$table->remove($where);8 M' z. O/ P' z6 s7 X4 ]+ o
  151.     return $re;
    $ W6 w4 _# X1 A: w( ^
  152.   }
    0 {- G- Q* }. N6 O: A* W* r
  153.   /**
    : y5 k( c* `3 U5 I  ?( I$ h, n
  154.    * 插入数据% N% i  R- M0 V
  155.    * @param $table
    ' E* t) n; ]0 o$ c
  156.    * @param $data
    & D$ q! Z$ G& N# p0 @
  157.    * @return array|bool
      o& |" B$ z7 l: s
  158.    */
    9 E7 h& G% @# H% g& u
  159.   public function toInsert($table, $data) {
    7 H5 e& Z2 y+ {& u& x3 X5 G
  160.     $re = $this->database->$table->insert($data);
    0 j1 z% P; P: l: h0 B" R3 I
  161.     return $re;% k' [5 `) _9 h" w
  162.   }
      b2 b9 ^4 n- b- T
  163.   /**# O) ^1 z% ~9 y& @2 ?
  164.    * 更新数据$ C8 a3 Z4 O! y' Y1 r7 q
  165.    * @param $table
    0 ?8 H- w/ C! ~3 Z8 P- o  g
  166.    * @param $where& o% ~: z0 p( C- \% I$ m& s
  167.    * @param $data
      N7 P+ U9 b6 p; a5 I
  168.    * @return bool
    3 @8 X$ I) v% P: \. |
  169.    */% V  J: H  W. i, N! i+ X% N  f
  170.   public function toUpdate($table, $where, $data) {* O- I0 |: j) c) a% L" V% R
  171.     $re = $this->database->$table->update($where, array('$set' => $data));& W' f- b; `1 A& P! J7 ]2 w
  172.     return $re;
    % g$ R4 X! ]9 K
  173.   }
    & e! h* N2 V$ m# o
  174.   /**( ?$ n( l% A( V( q
  175.    * 获取唯一数据
    * ]4 K& b% d6 A) V
  176.    * @param $table
    $ r3 Q5 h7 s1 Q$ ~! N& y
  177.    * @param $key
    * @& P; E; k4 }, z% J
  178.    * @return array5 L* ^/ s; v# X/ a
  179.    */" @0 h5 e6 Q) V  s
  180.   public function distinctData($table, $key, $query = array()) {% Q$ C3 n/ y" c4 U: k
  181.     if (!empty($query)) {3 `! Q. ?; h& U% p$ S7 m9 u3 Z
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);$ c# |+ u" Y8 ~$ O$ }" s/ @+ x
  183.     } else {* x7 ?. H* r1 i; @6 {: t5 r" P9 I
  184.       $where = array('distinct' => $table, 'key' => $key);- M/ t  x! r3 A& ?+ E9 R
  185.     }$ E2 C) Z; R) t7 I& z
  186.     $data = $this->database->command($where);
    ; f4 t+ Q) `  X4 Q1 m7 g4 Q
  187.     return $data['values'];  j6 s$ l' G+ j
  188.   }
    * B! R5 ~  D/ }) d! ?/ m5 k
  189. }
    0 a/ u+ L4 y! E6 I! v% r( W3 Q
  190. ?>
复制代码
' O/ a; k# r( _, ^; u4 L$ s" F5 Q7 E* y

* Q# M5 ^) I- r& c8 ^4 ~: c4 }$ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 23:35 , Processed in 0.056295 second(s), 21 queries .

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