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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。
8 S0 H0 ~5 ^  _( M模式自由。- e) X, F$ g4 P% t4 S" E
支持动态查询。
2 ?; T6 ~- x1 q支持完全索引,包含内部对象。
5 M& Z: u5 ^5 n* }* F; |支持查询。
; W) f# L& k+ C+ n/ ]3 ?8 x3 G& Z支持复制和故障恢复。
. V2 W3 F1 u% b7 E: T使用高效的二进制数据存储,包括大型对象(如视频等)。
3 V5 B, D4 u* v! V9 D  y; @* J- L自动处理碎片,以支持云计算层次的扩展性
- }4 @) A  g3 }5 L' P4 k: X支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ I# p, P+ f' I- E; @文件存储格式为BSON(一种JSON的扩展)
! {6 e! b$ d+ G  Z  V3 m3 v4 X1 s9 m可通过网络访问

所谓“面向集合”(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
    4 |9 S5 g7 y. Q* }, {
  2. /**/ L5 i4 \" V* H9 a; `% P
  3. * PHP操作mongodb数据库操作类
    ; f$ p+ J) H) Z- q3 K; V
  4. */
    ; s  L; v6 _' h/ k
  5. class Database {
    " D, u) X7 ~/ M0 J* \/ a4 H3 x( `
  6.   protected $database  = '';6 x8 ~1 a  q7 Y  V1 E- l! M. _
  7.   protected $mo;
    : t+ |# o3 V* H# m6 L
  8.   /**
    ) I; J( ^4 }( q5 f% w0 x
  9.    * 构造方法
      J" m0 N( b4 [7 u" x; s* }3 z
  10.    */
    1 f, @* U  T+ @/ K; f0 J+ V
  11.   public function __construct() {
    - O2 a; y0 x8 w/ w/ M  o1 F8 x5 p( [' z
  12.     $server = DBSERVER;3 P1 j4 A7 _$ r- t, T( }# P% R, S- Y8 \
  13.     $user = DBUSER;
    $ J8 s: a3 U" n5 z' V. G0 Y$ \& K
  14.     $password = DBPASS;
    3 p2 D5 w  H+ P. h
  15.     $port = DBPORT;
    , n  F! y( h4 J0 c  Q+ K
  16.     $database = DBNAME;
    ) Q7 v6 h3 ^0 x6 U+ Q
  17.     $mongo = $this->getInstance($server, $user, $password, $port);
    : i. W# M* @9 D0 w) O
  18.     $this->database = $mongo->$database;
    8 h1 R% l8 B5 g5 Q  O
  19.   }% \; {( _- w3 z2 l0 c
  20.   /**
    6 f3 c' W+ E" j* @0 C: h( ]. Q
  21.    * 数据库单例方法- O7 j! Q6 C, C8 p. i  B" }/ f
  22.    * @param $server
    ' D; u& O: b& p) y5 h5 b
  23.    * @param $user
    6 S/ w7 A1 ]$ ^
  24.    * @param $password
    4 k' `, d2 L. w% ?2 ], m
  25.    * @param $port
    : _9 H. u6 }) ^# ?4 o
  26.    * @return Mongo! M! L4 `: q! y
  27.    */
    ' {% D* y' u6 D) z8 r' [# U
  28.   public function getInstance($server, $user, $password, $port) {9 N  f; N7 h; S2 X/ a+ j
  29.     if (isset($this->mo)) {- E0 ~. \) @) R: d8 R' L4 j# ?/ S% f0 c
  30.       return $this->mo;
    ' m( l2 |+ @8 ]1 e3 a, N1 H
  31.     } else {
    : t! y$ x+ M( B+ _0 b. J
  32.       if (!empty($server)) {" E0 ~. F0 P# {+ I" v! z/ R) B2 U
  33.         if (!empty($port)) {5 {8 q' _. _( i/ C3 Y4 [! `7 `
  34.           if (!empty($user) && !empty($password)) {
    $ P6 i% o9 ~* Y+ c+ i1 ~: h/ i" y8 j$ {
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");9 n3 k) Q( G! M* d" ~
  36.           } else {
    " z0 k" P5 Q# d5 U0 M7 D0 I+ A
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");6 D  X* F# k8 ]( v/ n, C
  38.           }+ C9 i0 `. N( v" m& F5 m
  39.         } else {
      }1 _9 y! d( O8 \- u/ M  G
  40.           $this->mo = new Mongo("mongodb://{$server}");# y' k0 E: [6 y! S, S
  41.         }) I0 z' H& A2 U2 ]- _+ {
  42.       } else {+ h5 X4 Q3 A9 u; ]5 v
  43.         $this->mo = new Mongo();. N! ~6 i' j$ m0 u& q$ c
  44.       }
    * T6 W6 W* Z4 S1 e: ^) `2 D
  45.       return $this->mo;
    % w1 v( Q4 w1 U. Q; f) n& ]' L
  46.     }, m; F7 R. J/ E0 S8 i: g/ F
  47.   }
    , F/ D7 A7 e/ A" f& v) Q" o
  48.   /**
    . c; Q4 k( Z$ p! \. W) q
  49.    * 查询表中所有数据
    / _" D: h4 {/ @8 ?1 G. n# V& N9 Q8 b- h
  50.    * @param $table
    ) [4 ^0 F$ ?! D. X! m. m  G- y5 x
  51.    * @param array $where# l- m( x4 n2 ^, M( \8 R
  52.    * @param array $sort' k, E' e1 x9 e; U5 Z' S
  53.    * @param string $limit4 l% Q2 H& p7 q8 |1 D
  54.    * @param string $skip' i* T! ~; Z! ]( X7 M
  55.    * @return array|int/ ~; ]( _) E0 C- R! _# Z, x
  56.    */; i2 p9 `2 W- f/ F: O  N) ~$ m; ?
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    * u! X' k2 X1 Z4 P1 Q
  58.     if (!empty($where)) {
    7 n: `% c2 e' C2 u' P  s
  59.       $data = $this->database->$table->find($where);# i2 @' Q9 T- p$ k( |( i& L: M
  60.     } else {
    0 z6 s) a* \2 i: N
  61.       $data = $this->database->$table->find();" K/ K, r8 G/ ?5 K
  62.     }
    7 S  y7 }8 y9 F# |, e% j9 i
  63.     if (!empty($sort)) {
    $ I/ V# u' a$ H2 W: E6 d
  64.       $data = $data->sort($sort);
    , b/ b8 ?5 P2 \; P
  65.     }
    $ W/ e) G; C6 c9 R; m3 J
  66.     if (!empty($limit)) {5 \' Y. g! g/ `" D1 P
  67.       $data = $data->limit($limit);8 z8 i  w( ]: P1 m  N( L
  68.     }
    ' M$ M6 J; n; t8 J6 F, P
  69.     if (!empty($skip)) {" L) |# C! K$ D
  70.       $data = $data->skip($skip);+ ~5 d8 [( `( b& b
  71.     }! b9 F8 f! K# U  Y
  72.     $newData = array();
    * T: Z/ \. V, N8 \* V
  73.     while ($data->hasNext()) {
    5 M3 D$ t4 f* a! D! `1 z/ W/ T4 R* j
  74.       $newData[] = $data->getNext();
    ; E+ H/ x* \& e5 W; P# D# |3 t
  75.     }. v: m: y1 a' B, y7 K/ T
  76.     if (count($newData) == 0) {
    % v* W, X/ C2 t" r' A! S. @9 e6 j
  77.       return 0;% h/ ]2 r- O/ J+ q2 h! X
  78.     }% F# g! E$ |0 C$ U
  79.     return $newData;. Q8 A3 f. M' b/ ]* y. m
  80.   }
    # b. C: z& X, Q; r( l
  81.   /**$ M( G2 ]' ?6 m
  82.    * 查询指定一条数据
    3 _! ?; l+ S- u5 n4 H2 R
  83.    * @param $table! I" F6 B2 W5 }8 z( J- `1 W+ K4 e
  84.    * @param array $where
    ; |2 h+ W. v' |
  85.    * @return int
    7 _$ C3 K5 _5 ^0 A: p, L: i
  86.    */! i' c3 Q% R, o2 z
  87.   public function getOne($table, $where = array()) {
    4 C9 z: M( {8 N3 E* J+ V
  88.     if (!empty($where)) {6 A, s4 |  ]) w4 l( X; V: ?
  89.       $data = $this->database->$table->findOne($where);3 a7 j) _# x0 f3 C
  90.     } else {
    8 Z# x: X4 w: F9 z* B
  91.       $data = $this->database->$table->findOne();/ V. O  p% F7 E) m& r, a, O$ }3 C
  92.     }
    5 M5 H9 ~/ A8 O
  93.     return $data;
    2 i& v) V& H5 O4 ]  l, b
  94.   }
    7 _( i7 D5 I$ J) G
  95.   /**: s6 i0 K: c, h1 I, q. {; |  E9 u
  96.    * 统计个数/ j+ Q4 M3 O* e6 k- |+ j
  97.    * @param $table* H5 ?8 U% g" l4 d1 @' d6 J" R
  98.    * @param array $where2 U4 A; e; H8 d' c
  99.    * @return mixed0 j* ?( R& C& o! @. b& h
  100.    */
    ' U9 o; Z2 N$ A6 i+ e
  101.   public function getCount($table, $where = array()) {6 V$ @' A1 a! P5 s
  102.     if (!empty($where)) {
    2 S# W1 f  Y7 S, C( {4 T
  103.       $data = $this->database->$table->find($where)->count();! ?3 k& H! Q2 |) P# q0 K6 Y
  104.     } else {; {  `8 ?( p8 \
  105.       $data = $this->database->$table->find()->count();; H0 u/ S5 {! w# w/ C
  106.     }
    7 n! E% |' k! x" t7 v4 u
  107.     return $data;
    4 c! c: I7 q- d) K+ `2 h3 T; r1 U4 w
  108.   }+ s8 K& A4 f. ?  ?4 G
  109.   /**
    & R& ^1 C6 p% Y6 F/ d3 d8 @& ^) h
  110.    * 直接执行mongo命令
    5 L$ U+ x1 G/ ~2 V. J, H
  111.    * @param $sql
    % t# c; E! h0 e3 a, Y# Q
  112.    * @return array% E( L; F8 t- h
  113.    */
    2 Z& T9 G3 ^9 K0 [
  114.   public function toExcute($sql) {
    : H. J) V) R2 v$ Z: n7 y. B" o
  115.     $result = $this->database->execute($sql);
    ) l& ?$ I- i# p% o8 Z! A$ x9 i
  116.     return $result;, d  `8 t) q, ?' X
  117.   }
    % z, j  q( {, ?, y1 J1 h
  118.   /**
    ( s6 y4 [3 ~# B
  119.    * 分组统计个数
    % c3 Z( {! a7 p- H5 {; C) P4 v
  120.    * @param $table- _: Y2 t; e: @5 J3 A
  121.    * @param $where
    ' I$ V- V- c. ?1 h
  122.    * @param $field
    & g/ _9 _( q5 i8 a
  123.    *// b  d. e1 L9 a
  124.   public function groupCount($table, $where, $field) {
    9 i4 U% X! P5 _6 a2 ]" r
  125.     $cond = array(0 `7 y' }# O9 c. p
  126.       array(
    * q& {0 ]5 }1 Q6 o3 V. a! ~2 Q1 n
  127.         '$match' => $where,
    # V8 F2 p5 P' a. X; {8 V
  128.       ),
    . i/ D) `8 S; ~/ z3 u0 v8 x3 _
  129.       array(# g) m; g% [. g% U+ |8 k2 a
  130.         '$group' => array(
    4 W( g7 Z. r4 A( o& X& q  G- M! a1 |1 z
  131.           '_id' => '  k+ I+ U. z1 {: I0 E0 Q

  132. ! _2 _7 w1 N4 Q7 J5 Z$ m+ N- V
  133. . $field,
    ( _7 M' r. `& h, C
  134.           'count' => array('$sum' => 1),
    2 c6 z, n9 T. J. h2 C8 x
  135.         ),
    3 A- j$ e' A5 P* t$ Q* U
  136.       ),& F& ], ~7 q) i( z* |& p8 H4 Z
  137.       array(" l3 U9 b- Y( Z2 I" r
  138.         '$sort' => array("count" => -1),) g% l0 j4 i: I# H# ~4 g8 k
  139.       ),! I6 v* x  y# j
  140.     );
    5 f  T6 d- V: r0 H  V
  141.     $this->database->$table->aggregate($cond);( Q- \3 Y4 l0 m8 d: j
  142.   }2 G' Y& P$ X; v! D/ f
  143.   /**
    . c; M0 ^: Z9 ?
  144.    * 删除数据6 O  w& g1 {; ?4 a! f: N* B
  145.    * @param $table+ j- f/ ^" T: v; {: z! e. e! e
  146.    * @param $where& ]+ i4 m' j$ e; m6 y" P4 S
  147.    * @return array|bool
    # P( r' A4 ~3 N* V, X% N! ^
  148.    */
    . }9 W$ `1 q$ c) U! J# X8 O
  149.   public function toDelete($table, $where) {
    & K' a- M$ v* f' b
  150.     $re = $this->database->$table->remove($where);
    # M  G  \0 }7 k9 x6 i) y% @& h
  151.     return $re;: q8 y3 }) c! E' ~/ _, a" d# e' k3 @' X4 R
  152.   }
    8 S  g. X9 U3 |
  153.   /**
    4 n# F" B! F" s" S* }" v  [8 b
  154.    * 插入数据; v- G& Y7 J- Y* x" `. k
  155.    * @param $table
    1 t$ D; D9 R; o* S. E
  156.    * @param $data
    3 u5 G# \' O9 A0 u$ S7 j
  157.    * @return array|bool
    $ f( m& u6 _! E' ?; i
  158.    */
    9 F7 y- E) I! N: I- r8 W. B  J: L
  159.   public function toInsert($table, $data) {7 w* O6 P: i6 ^' f
  160.     $re = $this->database->$table->insert($data);
    1 Z# f  c, T+ f# `* W
  161.     return $re;) `  K7 s2 T0 c8 J2 g5 V: `1 ]  q5 l
  162.   }
    . c# w+ H3 x( }, e: J* \0 O& C
  163.   /**
    1 n: E: o- y: i7 _2 m
  164.    * 更新数据9 I6 r/ r0 A( v) F  c! J
  165.    * @param $table; G: H( W2 B2 l! Q$ a
  166.    * @param $where
    ; D  e# {) u8 G. v5 M: q+ z9 @
  167.    * @param $data! H+ e3 I. n& Q# s, U3 y0 i
  168.    * @return bool
    # I) S9 z4 ~9 ~' q* Z5 t& W
  169.    */
    - q7 q$ \' F7 s2 q/ h+ }
  170.   public function toUpdate($table, $where, $data) {
    + n% L( h2 t0 K$ u* H6 p  w: j; e
  171.     $re = $this->database->$table->update($where, array('$set' => $data));. C3 l, y7 i" c. S( X3 C
  172.     return $re;3 [/ O& F' d" o+ [$ s+ r& ?1 Q
  173.   }
    * A3 y; [8 X" @, Q
  174.   /**6 f1 p6 N( q" ~0 |/ c! V" s
  175.    * 获取唯一数据
    6 \3 u8 P% L; j! |0 h- ^7 E/ h. o
  176.    * @param $table* g) F; l1 `2 }' j# _, d2 d8 q% d9 \
  177.    * @param $key2 L8 b7 H7 k8 q- H9 Q; ?
  178.    * @return array. e/ C) K8 \# ^
  179.    */
    % A0 u6 |! _, I7 }2 J
  180.   public function distinctData($table, $key, $query = array()) {% V* [6 c% J! t& ]. o
  181.     if (!empty($query)) {
    2 J' o% M/ N; f) y- r
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
    # {' r" K5 a! U8 d
  183.     } else {
    4 v! @+ c9 c: m
  184.       $where = array('distinct' => $table, 'key' => $key);
    4 B) Z$ x7 Y# `0 L# w& n
  185.     }* M; ]  D) W+ U
  186.     $data = $this->database->command($where);
    : Z8 P+ T2 l2 G/ _+ v7 M
  187.     return $data['values'];) s! _2 ~! u4 x$ u  j. l- G
  188.   }6 Z: u, [, R8 v2 V3 \; g
  189. }
    6 T# p, O8 s' n9 F; X
  190. ?>
复制代码

# I8 ?- ]4 e8 z, l9 Q  f: F2 T: s5 t+ `' a, i9 v, |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:14 , Processed in 0.076605 second(s), 20 queries .

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