|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
. n+ q; [2 }) u9 N' ~8 k% `模式自由。9 g2 D; K$ A- k
支持动态查询。! y8 C! U4 X0 `
支持完全索引,包含内部对象。
8 r/ [# E3 V1 I v; e支持查询。
% }! d% W k( N6 s5 z; Y6 \+ d支持复制和故障恢复。
7 R3 v S1 e# \7 I' c" d& b+ r5 F+ K使用高效的二进制数据存储,包括大型对象(如视频等)。5 f- q6 L# k$ b5 N1 H: [! d2 q
自动处理碎片,以支持云计算层次的扩展性/ y% J2 U, D F4 {9 h( a7 N3 }
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ _( T9 K6 ~5 H: b) b* X: u文件存储格式为BSON(一种JSON的扩展)7 h# p1 r% t! x- X I, Z! ^+ H
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php
9 |, k1 J) l9 D$ X8 [9 ? - /**
+ ], n# o, L1 K, D7 }) u# e/ p - * PHP操作mongodb数据库操作类
+ @8 u6 V9 w4 h+ }4 P7 S - */% g3 Q+ X" v0 U
- class Database {
v- `+ z+ w" e. ?0 R9 T - protected $database = '';
7 o0 ]. t+ C6 w - protected $mo;
2 b/ F( l" P6 I O8 w - /**; ~ V1 F3 B! X/ H3 r
- * 构造方法
3 J1 [; K; @* Q+ t8 b - */
2 I# n# \1 ~' q8 I$ \ - public function __construct() {6 A. m, [0 T) f& H$ Y$ M
- $server = DBSERVER; ^ m1 _9 s, x, F: X' @& o
- $user = DBUSER;
8 L5 q4 Q; B% u% s1 t ` - $password = DBPASS;* Z8 W" h+ I. U, S2 v! }
- $port = DBPORT;
' P: K$ s3 ?1 O% @2 [! ?% @$ U ] - $database = DBNAME;& s3 \6 u! q9 J4 b
- $mongo = $this->getInstance($server, $user, $password, $port);9 o) s# y# l0 N( ^
- $this->database = $mongo->$database;( A/ d/ ^9 F4 z/ g2 M5 s
- }
# t/ j2 c" B$ r, B/ O# c - /**
7 s3 M6 a9 v+ W - * 数据库单例方法4 V2 E. {# T# L! r" M
- * @param $server) @# v6 }- K5 a' ~8 K+ J
- * @param $user8 [; A% {! D4 d. T' B3 D C+ V3 w
- * @param $password
" P) T9 g! p' Y - * @param $port
2 t" \) F7 V1 s- T: W u - * @return Mongo
/ Z/ G4 f9 n- y7 M F( G5 w B - */) W3 X( a* B) M+ x
- public function getInstance($server, $user, $password, $port) {
) o( A, y3 h5 K W* y - if (isset($this->mo)) {& j9 ]1 K0 V! q8 }8 G, r( x3 X4 k9 a
- return $this->mo;6 D5 q, n* E* Z- t9 a% b
- } else {
- z0 q2 O. u- [ - if (!empty($server)) {4 q5 o, ^& ~$ v) W& E
- if (!empty($port)) {, Y& W- l" |6 N+ B) k \& q# F
- if (!empty($user) && !empty($password)) {
$ q& V4 R7 h2 B8 ^ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
; J8 N0 ]4 s# c - } else {1 @8 n/ w9 J0 ^7 D% @
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
9 e$ v1 ~# N* D& g, _ - }
# M& ]. e+ d5 C- c - } else {- _: M S: n/ I9 { y
- $this->mo = new Mongo("mongodb://{$server}");: U( F$ u$ Z9 x* K
- }
, @1 `: _* d- g3 m1 } - } else {- T5 d1 ]) O, K8 k) h+ X9 j* e
- $this->mo = new Mongo();
, |# i. Z4 p2 h6 [ - }
5 E0 b" J/ F! g; G - return $this->mo;2 ?, F) d4 S$ J) ?: R/ }, K: k
- }" J# F4 E9 P5 z6 R' ~
- }
- Y5 y% b2 E+ K2 S4 N; W - /**
! b* `0 L1 j. @/ e7 V R - * 查询表中所有数据6 w3 b" ]. g! q+ ?6 M! A
- * @param $table
& P) U) e8 D; i7 Q1 Y/ G v0 b - * @param array $where* U- c6 R( Y3 W5 p$ Z* G$ W \, ]* B
- * @param array $sort
5 \5 t- h, _' Q- w0 O6 ~3 |1 ^, ] - * @param string $limit6 M9 l4 t( h% `" _$ A
- * @param string $skip& K# f$ @7 ^6 P8 z. F+ d3 P- M
- * @return array|int
@% b3 l5 c7 z; ]4 p# s6 i - */
) N3 ?! M$ i$ E+ U! e - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
" F# Q! b& {( _7 o9 i$ z0 A) m - if (!empty($where)) {& e1 U2 `' l7 d5 C% v" J
- $data = $this->database->$table->find($where);
, G e& m9 f& M* K& Q. A - } else {
9 }9 ^/ ^* C% U5 p8 y, a, m - $data = $this->database->$table->find();
' T' s' `1 W8 { - }) L8 L/ E6 ]2 k: i5 i' g
- if (!empty($sort)) {4 U9 y3 F% @4 H0 m5 M
- $data = $data->sort($sort);
' S# Y9 ?0 q1 C( s - }9 D- D, v& S: K# V' \* U. b
- if (!empty($limit)) {; v5 |9 K1 Q9 n, f
- $data = $data->limit($limit);
% |" i7 @, R- q5 J: ^0 l9 B - }
" q0 a* c# D( [6 x) { - if (!empty($skip)) {
& U6 d9 M) o, `/ g - $data = $data->skip($skip);/ @2 \! R$ f |, o: }
- }1 ~7 @% X% t; j& U! b3 q
- $newData = array();
% m+ `+ m( [6 `% P/ }0 T - while ($data->hasNext()) {. L2 Z+ [4 z4 y7 B. f [
- $newData[] = $data->getNext();4 t5 |' G& W* W# V A9 P
- }' M+ E( q) J3 L5 X+ j
- if (count($newData) == 0) {* G9 w4 q4 Y1 {7 z3 F" o
- return 0;, j, D# V6 {& o6 g
- }
0 J; [. G% f6 F: g - return $newData;
7 V3 m7 V+ L" g) ^. N$ r - }: Y# j: [" ?- F' e
- /**
+ A$ f& j& [' x& y - * 查询指定一条数据 Q' j. |( o1 \5 x) x, A! ~
- * @param $table# o# Z7 G8 G% }# c$ W, a
- * @param array $where, X) e- X7 {- ]& N6 r5 [! B
- * @return int) w! P, ~4 J A4 b- f6 f
- */0 j/ S% k8 A* R% @( u
- public function getOne($table, $where = array()) {+ U# F& v' A m6 D
- if (!empty($where)) {; h5 E) w, ], I
- $data = $this->database->$table->findOne($where);
8 E& R3 R O k - } else {
! M9 B( C7 F& n8 z2 v - $data = $this->database->$table->findOne();
- C1 t% R/ x, T- g - }; W: E v2 [4 a' Z
- return $data;+ R# U3 g$ L. u1 q
- }* |# E+ [" z: ]) p
- /**( Z$ F, P4 _+ Q2 t
- * 统计个数
: @; Y2 m. q) a! O - * @param $table: A" Y2 t; P9 Q* v$ i% P0 ]4 B
- * @param array $where/ D: y% V7 g( ?" F! L3 I) p9 N# ?+ _
- * @return mixed
4 j! U" m$ N* b& n - */) W ~8 [2 ^4 s
- public function getCount($table, $where = array()) {, g# m2 p, K9 @* K- ^5 C' }0 j
- if (!empty($where)) {; G" _8 A3 g \: }7 G3 o H! E+ M5 I
- $data = $this->database->$table->find($where)->count();) F% t$ L. \6 [+ N# l J
- } else {) ~7 h$ K' q( |* M1 T9 R! ^' J
- $data = $this->database->$table->find()->count();5 T; C& P* {& S4 A* m/ i, i9 S @# Y
- }
& v3 o8 f7 g" H3 B( D6 Y1 D - return $data;
1 z! `6 b8 @; N4 ^, U - }
! B) Q, C7 ^& _+ M: M: I - /**7 L* p' B2 t n/ ` R* w- ]" O
- * 直接执行mongo命令5 z) ~( T* n# i. B) V
- * @param $sql) s& t/ X+ y% ]+ P; h
- * @return array
# |, j% U0 ^' g. Q$ s - */# V; D' \5 z6 a2 [. A# K& a
- public function toExcute($sql) {1 y& c% T1 e7 `- [% o9 r
- $result = $this->database->execute($sql);
3 _/ p8 X+ Q$ t - return $result;# j* X2 i2 [* s9 B7 f
- }4 C' u/ ?( a. h/ A7 K, H
- /**
# s: m9 ?: T7 M1 {7 b- z - * 分组统计个数
- B2 ^/ Q+ ]5 X, t$ a* Y - * @param $table
- g1 j# d0 l K) r - * @param $where
8 H+ w% r) s8 e: v! ^0 Y9 C - * @param $field# _! J, c# m% x0 Z" V! W
- */
( Z5 V5 n' k Q r - public function groupCount($table, $where, $field) {
% U7 X3 ~6 t+ ^( K1 j7 O - $cond = array(: C" \9 B# }, Y3 q
- array(
+ a- i8 p1 J8 V - '$match' => $where,
' H1 m$ \1 l4 r: ^! E- ? - ),
5 Z0 D: m8 j6 ~( Q- @/ i - array(% |, W/ Q% t) ]7 I! Y2 j
- '$group' => array(
" C& C- i1 {' a1 q4 l - '_id' => '
- O- u% n( V4 C! K: p, D# F
$ S9 l. O2 u, K ?% m: _- . $field,2 o% ?( e( x0 @: Y
- 'count' => array('$sum' => 1),' ^; T/ L% ^6 [% w5 L
- ),
- w0 d/ A- j# F# r% U; E - ),% O- o6 Z7 |* G
- array(
: M* Z6 }1 E' e$ m' k8 { - '$sort' => array("count" => -1),
# Y/ c0 f( ?( C - ),
- x# ?3 C; V- x: j. e, O: X3 a9 _# D - );
* k. v+ g# G1 Y! v, {, M - $this->database->$table->aggregate($cond);9 ~5 b/ v" n, X5 s+ A5 M( j
- }$ `7 N2 T4 [, F+ X8 D
- /** R: C2 T, p7 @" h% h& l
- * 删除数据
/ r, I' a. U% ^ - * @param $table( ? m; d2 q7 }# c
- * @param $where& E! K2 ~4 P4 C
- * @return array|bool
! ~ i6 M. F8 a! f, ]. z# b - */
D3 w P3 b, @4 G+ R1 t - public function toDelete($table, $where) {7 H' O% J- X1 d
- $re = $this->database->$table->remove($where);, q' ~7 @& s) m& i2 E
- return $re;
( w. I; \6 r' s9 u* [ - }
5 y! o( P! W. t8 p& i( i7 ` a - /**
: d; H) N) o' J! f$ ?9 n - * 插入数据
2 T. Q# v: b! C4 ` - * @param $table6 w6 [ y1 F' u& Y6 Z9 Q
- * @param $data: S0 f' M4 y9 B: @0 M
- * @return array|bool
/ a3 u% a; Z8 Z! u9 C - */
+ A: L% ?6 J0 d! r M6 [& A' ^! S) X - public function toInsert($table, $data) {- F9 J8 u0 B' d9 }) T
- $re = $this->database->$table->insert($data);
/ X& G/ [0 o( ^- x6 P* R - return $re;6 C5 L, M& f* P2 q2 `* Q' }
- }0 F" P0 |6 ^9 S$ a j. |- X
- /**3 j/ D/ g, g* }4 r& }: u
- * 更新数据
{& O9 O5 }; S9 _; U q8 |9 a, a - * @param $table
# L. r# p3 i% I" L0 P5 z - * @param $where5 {! y; M/ p+ ^# d# Q
- * @param $data
$ Y8 @+ D* K- Z( @ - * @return bool
6 v# Y1 l- w' Z+ z: ^" r' h6 H4 S, ` - */4 A5 l3 I6 X% l `& ]( n2 G8 V" w, Q
- public function toUpdate($table, $where, $data) {7 i- ^# V# k+ P+ b
- $re = $this->database->$table->update($where, array('$set' => $data));2 N6 C1 z- e+ ~) A, S: f) `" F, A
- return $re;1 Q T& R* I7 }( q, E
- }
5 `4 d0 ]7 @3 s6 |0 ], Q - /*** c/ N, B$ q1 h4 u- @
- * 获取唯一数据
! i G3 I* J7 V, l* W - * @param $table V, q* u9 N2 U* Q' w
- * @param $key
0 a' x) t% S7 T5 c! H - * @return array0 n8 b, Y$ s& M" d( T7 l
- */
+ {5 `+ X# M* M. Y u( O3 n - public function distinctData($table, $key, $query = array()) {+ _% C# g2 {# i0 W4 G
- if (!empty($query)) {; {: u! `) C4 c3 c- a. m
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
7 N* Y# T: m- K1 q0 z' w - } else {
2 P' L' j2 b H; J& [: u& L. |5 W - $where = array('distinct' => $table, 'key' => $key);
9 h; W) j0 ?1 k) D* E8 o \( F - }
5 s+ z! U4 P1 {2 p4 g+ V - $data = $this->database->command($where);
- h6 i4 r/ `/ O - return $data['values'];# I1 L' A4 {7 J+ Y
- }
8 p9 x7 o" w1 ^5 d: ` - }
# E h, R4 t7 w" s& V8 a9 |/ m - ?>
复制代码 ( r8 B* t4 h& z$ ~: A; s
" X. D6 p2 `1 c4 A4 X4 d |