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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

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

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

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

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

面向集合存储,易存储对象类型的数据。- }) ~7 H7 B+ \: l% z
模式自由。
. X  \7 t- O4 n8 ^+ p) k支持动态查询。$ n8 m6 [. p) c! p. f
支持完全索引,包含内部对象。
4 g( T9 F( p/ x8 |* a9 W支持查询。
, s0 J& a3 N7 ?  e& i7 J: Y支持复制和故障恢复。
4 r8 L* X, V$ A使用高效的二进制数据存储,包括大型对象(如视频等)。. {& w" d9 P1 S3 Z3 y5 \
自动处理碎片,以支持云计算层次的扩展性9 f1 Y8 F, n, f: Y
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ u& D4 I0 L- J  Z1 ~文件存储格式为BSON(一种JSON的扩展)
3 V+ b+ B' T7 l$ x可通过网络访问

所谓“面向集合”(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, m& |3 c, v5 Y* c
  2. /**
    * O2 z9 F  D3 @% G1 T) B% [
  3. * PHP操作mongodb数据库操作类
    7 x( q& `- u$ P; n: k6 ]+ l
  4. */
    6 X8 R. o+ B* I0 l9 [
  5. class Database {
    ) |2 a' i& K# x. L
  6.   protected $database  = '';0 k' ]9 ?7 T" o2 ^) s+ J& o
  7.   protected $mo;
    - |3 R% Q. p5 J6 u  x
  8.   /**
    1 |2 P( x  U# z3 x0 c
  9.    * 构造方法
    , G9 T; o% a/ c& e7 B4 a0 Q4 [
  10.    */$ ~" b. M: I+ j: b. Y
  11.   public function __construct() {7 c" T+ S2 E8 V5 W: @
  12.     $server = DBSERVER;
    , Z* k9 Z) w( ?, l$ j$ h6 `
  13.     $user = DBUSER;. c' r3 Y- {" `8 E: F. c1 i. Y) A
  14.     $password = DBPASS;: _: h% O$ X' z8 x/ K/ B
  15.     $port = DBPORT;. |/ t. L) O1 {
  16.     $database = DBNAME;9 `4 ?$ K8 P3 a1 J% L/ |9 M4 t! S
  17.     $mongo = $this->getInstance($server, $user, $password, $port);! r0 B, F& W7 x$ H9 m5 I
  18.     $this->database = $mongo->$database;
    % h7 l/ |, @) f; ]) F; o' P1 r* F
  19.   }& ~: r& |' u. _+ B0 f
  20.   /**3 p- g; l: F* V5 h/ S0 t
  21.    * 数据库单例方法
    * a" G/ @' x5 B+ Z7 X3 y0 U4 H
  22.    * @param $server! V9 N; r6 z5 }7 p" G5 o* T9 Q" P3 _
  23.    * @param $user
    : F8 s; ~0 D+ c1 _4 {6 J
  24.    * @param $password1 l0 v/ k/ }' m( W, c; d% I2 D7 e
  25.    * @param $port4 F% T+ H. e5 o4 c- i8 W
  26.    * @return Mongo+ u6 G5 Z/ F0 u% T6 N
  27.    */
    % O+ E  Z) {8 o5 }+ X
  28.   public function getInstance($server, $user, $password, $port) {! X. |7 Z1 F- b+ T
  29.     if (isset($this->mo)) {
    1 F3 L4 N4 S; q3 s1 t% f0 Z
  30.       return $this->mo;
    , F1 B2 x( X3 o" U! P5 m7 `
  31.     } else {
    / N6 k- e, s$ p; J! @) s
  32.       if (!empty($server)) {7 f$ b& o/ N- Q% U
  33.         if (!empty($port)) {
    & `, i+ x% k' O) m% R/ {9 [3 i# N
  34.           if (!empty($user) && !empty($password)) {- X6 g/ V8 b5 k( k8 j
  35.             $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
      F- t# g7 h. B& f4 P
  36.           } else {
    + v4 [3 n. H3 q5 _- |3 d/ T
  37.             $this->mo = new Mongo("mongodb://{$server}:{$port}");7 b, U# q* b* W% x( h0 D3 `& M' y' `
  38.           }
    2 e0 A' P+ e. y) g( n; I6 I
  39.         } else {: D3 ~5 e0 ]" W) n
  40.           $this->mo = new Mongo("mongodb://{$server}");
    0 A2 C, Z$ m8 f' ?/ ~
  41.         }
    5 ^6 J) B" Q6 O
  42.       } else {
    6 q# r' g0 w6 b" t: K- N' v! B
  43.         $this->mo = new Mongo();2 {+ ?) g0 [) x$ t& O8 y
  44.       }
    ) k0 N7 e/ d2 S4 t' Z; ^" ~6 t
  45.       return $this->mo;
    # w- \4 j0 H+ O  o# Y0 H( H
  46.     }
    8 @6 V8 v/ Q+ T0 ~9 V5 P
  47.   }
    & v2 B! E  X5 r6 y8 d- x7 \
  48.   /**
    5 w1 x" t; q1 M# e" l$ c& W
  49.    * 查询表中所有数据6 M" N+ w0 i4 I) ]- r, i  Q
  50.    * @param $table
    ; q" k( d0 e$ A
  51.    * @param array $where
    , j+ s  N8 r, V+ q
  52.    * @param array $sort
    + ?0 i# j  h# U' O4 m4 R
  53.    * @param string $limit: K4 u; \- Z. q$ {0 U
  54.    * @param string $skip. p6 V9 a$ \- [; h  r( M. ~
  55.    * @return array|int
    6 E- t) h8 d5 Z' Z% v( u
  56.    */" {- o* g" C* h" X, B5 c/ n8 c3 U1 z
  57.   public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
    6 T/ T! Q- W# x, x7 r4 U$ o
  58.     if (!empty($where)) {
    3 _) Z  k& P* G7 A/ t0 b
  59.       $data = $this->database->$table->find($where);
    ( K: w' A5 @$ E: _, V
  60.     } else {& n% [" K% X5 f& R2 j# n) ?" C
  61.       $data = $this->database->$table->find();4 I# ?, {% H5 a  H2 j, H/ L9 b
  62.     }
    . f7 L$ e. S# X. h/ u
  63.     if (!empty($sort)) {1 ^; n9 i( O; r  A$ c; x7 P
  64.       $data = $data->sort($sort);. A' w! o: `% e: T6 o' `
  65.     }
    ) W/ `6 L# a# Z/ Q$ m
  66.     if (!empty($limit)) {
    ( q+ `0 {' e' N* e
  67.       $data = $data->limit($limit);$ R+ c" M9 m3 l  B! {" j, V
  68.     }
    + g* p# T/ J5 r/ [  c! @0 |$ @
  69.     if (!empty($skip)) {
    % f) J$ u. c. n) G# z
  70.       $data = $data->skip($skip);
    . h# y, A  @+ |. B
  71.     }. K8 `: M2 D& O" E; N/ C1 Q5 K) ^1 G, F1 N
  72.     $newData = array();6 H* V8 Q* D& x
  73.     while ($data->hasNext()) {
    - L1 |7 h7 ]" \$ [% |
  74.       $newData[] = $data->getNext();
    3 D- I  U$ s2 p8 m- K6 t
  75.     }' P. A! s, i; W2 W/ q& x; t
  76.     if (count($newData) == 0) {
    6 b9 ^3 H% Y- E5 c
  77.       return 0;
    * c/ T: n- u8 S0 S. V
  78.     }: K/ C! W2 K$ w, L5 M- U) G
  79.     return $newData;8 k, Q- V' H3 H2 q1 _& V
  80.   }1 Y; G* Z: x( u) W5 B. U( [5 n
  81.   /**; S2 F; @. N+ L; O; Y$ S
  82.    * 查询指定一条数据
    + x6 i7 J3 K3 L7 {$ n- g
  83.    * @param $table
    3 r, S6 e; }+ H, c8 j7 B- [
  84.    * @param array $where
    9 S3 T; _; ?9 t
  85.    * @return int! b  z4 O+ @* G
  86.    */
    ; ?* _% U" F6 t2 z8 `7 P5 `
  87.   public function getOne($table, $where = array()) {
    3 Y% }4 O: ~5 ]3 J% W1 s0 K3 R) _
  88.     if (!empty($where)) {
    / B7 C" W% }; J2 d6 B. b6 ]
  89.       $data = $this->database->$table->findOne($where);* _' S( m8 ?; k5 V! o! m, T1 i
  90.     } else {1 R! ~; R, y7 [# n/ s
  91.       $data = $this->database->$table->findOne();' F1 l; V; I% g# c% V4 N) O
  92.     }+ [1 o& e7 j2 R6 }9 H% k
  93.     return $data;+ Y. v  ?$ E) a" Z$ K; E
  94.   }) o% M5 ?6 b6 \7 X" x# n- p6 J
  95.   /**# P3 ^0 r- h: P5 w
  96.    * 统计个数- e. y% f6 R% z
  97.    * @param $table( X+ w' ^) r1 C3 C* o
  98.    * @param array $where& E# o! D0 R7 l! e0 ~) y
  99.    * @return mixed+ s+ d6 e# ^+ V, ~9 u
  100.    */
    6 k# l; X5 v" E" w
  101.   public function getCount($table, $where = array()) {
    ! O& Y4 @7 b% M3 N+ k
  102.     if (!empty($where)) {( `- p5 ~0 M0 P5 F& `; ]- [
  103.       $data = $this->database->$table->find($where)->count();& u0 n- V$ b* c0 R' `
  104.     } else {7 T& m5 u6 |) `! T) J2 U
  105.       $data = $this->database->$table->find()->count();
    ; R/ a' [1 s& k6 e/ S
  106.     }! \' ]/ a( C% v9 m# `' v
  107.     return $data;
    9 `7 f0 f- K! R* U
  108.   }
    " U" ~) ]8 {  b9 i! r
  109.   /**' x$ ]# m1 m* D8 P( [$ K7 @
  110.    * 直接执行mongo命令( P' w3 u, q6 {% s( v
  111.    * @param $sql
    ) C. z5 N3 R+ M3 i
  112.    * @return array- m- L7 c- z# Y" }: M/ j& l
  113.    */
    6 j" W* Y: M' o2 ^7 M
  114.   public function toExcute($sql) {
    ; g% w2 D$ g6 N9 Y
  115.     $result = $this->database->execute($sql);
    . t! A5 u! |0 i
  116.     return $result;
    % C) l5 d" ~+ D8 ~! v0 i7 P
  117.   }
    : O4 {+ [( H+ ]8 `0 h% z
  118.   /**& [0 z9 G: t; W
  119.    * 分组统计个数
    + U" i" V5 C% `/ @* `) P
  120.    * @param $table: Q- e1 n% P: o4 M6 q
  121.    * @param $where
    , w) i' ?9 k4 t7 d, l4 G3 X
  122.    * @param $field& d% J% ?4 n' l: T5 R8 [
  123.    *// X: A0 c# a6 _2 E$ H
  124.   public function groupCount($table, $where, $field) {
    ' l, n9 T% R) [3 \
  125.     $cond = array(. x! ?3 q% V2 h4 A: V
  126.       array(- {! k. c% A4 t- ]% p
  127.         '$match' => $where,; {$ d  ^  b/ k  g& A: A7 K$ b
  128.       ),
    : L8 o, a2 {8 ^0 J
  129.       array(
    , b; h) R: @2 {
  130.         '$group' => array(( o0 X& X7 F* q# L
  131.           '_id' => '4 S$ s: M% ?) {' ^! C
  132. * H: B) H% N6 b0 ?7 F, O
  133. . $field,( R+ j) b5 ]  O+ B# P2 l; Y
  134.           'count' => array('$sum' => 1),
    ) G0 M! V! `: A( y4 t1 J
  135.         ),
    . e% V& W; V+ d
  136.       ),& W2 F" M5 ]6 E7 J
  137.       array(- y2 Y5 `/ _% l, H$ ?
  138.         '$sort' => array("count" => -1),2 C1 ~7 s* Q7 V  s) \( M2 r: I
  139.       ),
    ! J- @* S. F8 t# S  y- l
  140.     );
    : d9 ]$ w7 {1 n2 v- F7 l, G
  141.     $this->database->$table->aggregate($cond);
    3 j* R/ h+ A9 _) B2 e- W
  142.   }
    $ z# [  B$ D* H- j1 g# K; V
  143.   /**3 c' X, ^/ @# L! S, |% U$ o
  144.    * 删除数据( }" G9 e. n0 G7 k/ i/ z! T# p
  145.    * @param $table" Z2 @) @: f3 E) z2 z/ v: D4 `' e% i
  146.    * @param $where
    8 o$ I1 K  Q7 d" B
  147.    * @return array|bool0 ]3 \/ N! ?, f) g% d
  148.    */
    1 v8 H* ^5 U& f& b
  149.   public function toDelete($table, $where) {% L4 |$ T7 O4 \& j
  150.     $re = $this->database->$table->remove($where);
    $ _) Q% ~! |2 K( j' n5 k$ A! K# }
  151.     return $re;
    # {, |+ t/ d, v2 Q8 E; |
  152.   }
    0 Z9 h0 p/ R1 B' ?' Y, P* F5 s
  153.   /**
    + d7 w% b. t  M1 w. {# j
  154.    * 插入数据8 Z! s5 U, S# A
  155.    * @param $table
    0 h; q5 B0 S1 n. m
  156.    * @param $data8 t3 I4 O; @7 \2 ~- d( a) g* v6 L* A, s
  157.    * @return array|bool
    ' W7 d! O+ c5 G9 F  N
  158.    */
    9 z1 f; Y% _$ R: o7 g. R$ D6 Q
  159.   public function toInsert($table, $data) {$ a$ V9 x$ z+ f5 a0 G' K
  160.     $re = $this->database->$table->insert($data);
    . h/ L/ h" f, W( P% V) m4 F$ X
  161.     return $re;2 Q+ u9 h7 y$ G) ^
  162.   }, v8 k, V. X, K5 W+ v0 o
  163.   /**3 l) ]/ @( Y1 J: T
  164.    * 更新数据9 n0 P8 {+ Y0 _  l5 z, [
  165.    * @param $table! j' N% c0 @  f3 L
  166.    * @param $where
    / O4 `) b( X0 K3 @+ _9 y1 \
  167.    * @param $data
    ' p( v: N4 n0 D- o- @6 O
  168.    * @return bool
    - ?' T) d; q9 j! p) p
  169.    */! X8 V& F7 z7 w! I/ F
  170.   public function toUpdate($table, $where, $data) {
    , t, I. X& C& ~$ m2 Q
  171.     $re = $this->database->$table->update($where, array('$set' => $data));- F! E' _6 Y9 W9 ?! G- C
  172.     return $re;
    3 n& r7 a' E$ `* ]7 K4 v
  173.   }
    / [* M0 q; B3 T) y/ c/ q/ @- T. L
  174.   /**, [7 j5 D0 o" W2 t+ c: v) J: K2 E
  175.    * 获取唯一数据" `9 N) [3 v+ |/ C
  176.    * @param $table1 i, i; c/ f/ y
  177.    * @param $key# ~6 @% q6 G7 k* z8 {! b  I
  178.    * @return array
    1 e" P+ G$ C" V: o  j$ b; B2 z
  179.    */
    ' X) ]  p  N  |
  180.   public function distinctData($table, $key, $query = array()) {
      \1 r0 @, Y' z0 H
  181.     if (!empty($query)) {
    8 x  t  A& s1 K, |- |
  182.       $where = array('distinct' => $table, 'key' => $key, 'query' => $query);3 q. t3 l4 u; ~" X; U/ h) I  c
  183.     } else {
    ) q8 p' w; S9 a9 H# b- w# D! p3 [/ L
  184.       $where = array('distinct' => $table, 'key' => $key);9 U( g( L1 S5 ?  s2 Y* N' M
  185.     }
    0 z: V) E* T) M7 J$ k# m* _
  186.     $data = $this->database->command($where);" @/ b" Y& c# ]* ~+ d' k
  187.     return $data['values'];
    7 q' ^1 k2 ^! E6 G
  188.   }% p7 s$ {& e5 b4 q" _9 y% D
  189. }
    4 G- k& `3 L) F( i7 B: u: m, Q  k
  190. ?>
复制代码

) v6 L: @7 J9 s  E9 ?
4 _  d/ w% {: y5 G9 }% I4 P: Z' E% ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:14 , Processed in 0.104036 second(s), 20 queries .

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