|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。; b0 Z# k* k) |2 B) |) R: S! J
模式自由。
) s1 |2 ~0 J @: A支持动态查询。
: g3 l/ }5 Z4 a9 z2 j7 w支持完全索引,包含内部对象。# B4 ?3 s2 I+ I( d; b7 {3 x$ x
支持查询。% ?3 q% N$ Z& D* F* \
支持复制和故障恢复。0 {/ O+ z6 N8 b! [
使用高效的二进制数据存储,包括大型对象(如视频等)。1 I" O, S6 t/ y7 p' x( [
自动处理碎片,以支持云计算层次的扩展性& ~7 M j' ~2 [, h. R* v3 @ x' ~
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
0 I# ]1 w5 ^1 [. r2 g( n文件存储格式为BSON(一种JSON的扩展), d; T3 `8 Z9 O0 i& \* U) r
可通过网络访问 所谓“面向集合”(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% C( I0 @; B% T! c
- /**8 q+ ^5 o5 r2 i
- * PHP操作mongodb数据库操作类
, G' D7 y S8 ~# j) Z M - */
# W$ C& t( t2 s1 @ - class Database {2 F7 t8 G. |; t- u
- protected $database = ''; W: `2 ?* `! B. e" I9 B _
- protected $mo;
+ H$ T0 Y* i" |% A - /**$ _0 y; |' n; J3 ~" d1 C
- * 构造方法
2 n0 o2 B/ s* k6 m6 P: | - */
- u; m ^- t0 [ - public function __construct() {5 _0 ~! |, `: U& l, G
- $server = DBSERVER;8 Z( y: K8 E y& }: B! F/ E
- $user = DBUSER;
5 H- A4 I: a8 s1 }$ A - $password = DBPASS;- V7 q8 Y: w2 Y0 G6 C P
- $port = DBPORT;% w' k; A0 h8 \" _7 W M+ c; k! W+ f
- $database = DBNAME;1 e l% e( y1 k& R, K9 t, e
- $mongo = $this->getInstance($server, $user, $password, $port);& }" }8 j+ ~6 ?3 i9 {% z
- $this->database = $mongo->$database;
- L+ `$ l) c( ^2 _6 {; D5 O8 d - }# c& D! E% x: e: j. o1 y
- /**" \- H( g5 ~! o0 k' D- g' g+ a6 j
- * 数据库单例方法
; C6 a# @0 Y8 C4 k - * @param $server, S; W5 _- @, x0 R$ ]
- * @param $user
. ?- t3 i. o' Q' S# m& w2 x - * @param $password
) [0 H0 V A8 F, r - * @param $port9 V* E; M3 T& n$ T
- * @return Mongo
) X7 b+ x) A" ~ - */
. k* K) k* t1 d2 Y7 J& ?7 ?' D( V - public function getInstance($server, $user, $password, $port) {2 Z& \3 j% X E' A! h% k
- if (isset($this->mo)) { P: E3 L! L- C0 p* t! |& {3 j7 n
- return $this->mo;- O# o j3 J+ O- A% I
- } else {
3 z7 u% @' C8 @8 s) M" ` - if (!empty($server)) {6 }+ s, p0 M: s/ m# _8 G
- if (!empty($port)) {1 `1 p( _+ s6 X# P
- if (!empty($user) && !empty($password)) {* |( r* W2 M# r d6 r" W7 z) o
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
) }2 [! Y8 R M& D5 t: Z# R - } else {) b* ` [( |3 W: I; V6 C% M+ ~
- $this->mo = new Mongo("mongodb://{$server}:{$port}");/ ], i1 N8 U' F0 V! Q2 J. X" Y/ N
- }7 u* a% j- ?# [$ ^* B0 W
- } else { w. C2 I7 ~! T( u% g
- $this->mo = new Mongo("mongodb://{$server}");
# ~8 {( @4 R- |2 p/ d9 c - }
0 L' \: B% G4 P) B - } else {; I; A" ~9 j+ ^' L9 ?: o5 j
- $this->mo = new Mongo();4 a7 S3 |( X0 u, I3 f6 N0 W. A2 u
- }
* g- ?! ]* i; W; t3 e - return $this->mo;1 J- Y, |" d) K$ J$ ~* h
- }, R3 w; h- ?( W9 a+ t+ I C
- }
3 `: P$ E/ N" V2 S' L - /**
+ V& W4 k. g, \8 i8 {: ~; N - * 查询表中所有数据
! \, Z; {$ x& E4 w - * @param $table) _$ u' K" e2 U: H3 W3 Q# w
- * @param array $where8 n$ l1 H6 y- K. s1 ?
- * @param array $sort! h! z L1 A' D8 Y3 {6 [$ ~3 Y
- * @param string $limit
+ b* ?% U% d/ `7 g - * @param string $skip
# }9 R, ?7 v1 m0 i4 @$ F6 M4 z$ k - * @return array|int
, ^2 Q% F5 F1 O3 q; K - */& A R/ V7 z0 j d9 X, D' ?
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {7 Q( F5 U, M9 b: N" v4 i7 u
- if (!empty($where)) {5 n L4 t- q/ {% a
- $data = $this->database->$table->find($where);. r4 ]" _/ t8 l; H7 N N
- } else {6 y/ h) ~7 a3 `! }
- $data = $this->database->$table->find();. b: G% a( J* V/ {' M
- }
* { z: C! f% F - if (!empty($sort)) {
/ K6 o' _! w: B! J/ Y S+ s$ D - $data = $data->sort($sort);
0 i# `; G, x) W& \' { - }
8 } Q3 O$ }' [0 w - if (!empty($limit)) {6 j& W/ E5 b! q* g. G; H1 J
- $data = $data->limit($limit);
) i$ h- z' ]* k - }
+ S. n7 P6 n3 Y! Y: m - if (!empty($skip)) {7 c: C: |8 m6 b# r
- $data = $data->skip($skip);: ^1 t% U3 o. d: ]- j) i
- }
. O6 J4 E' Q2 ^) P* r - $newData = array();. k8 p$ H4 W4 ?
- while ($data->hasNext()) {( g( s: [7 E0 |( i6 i* e
- $newData[] = $data->getNext();
! z( V F S! n: L - }
Y: |) y7 m' {7 y2 y$ u7 c - if (count($newData) == 0) {
+ N2 D* I, t) e1 ~5 J M7 ? - return 0;
) i0 I8 H& Y3 F* k7 m0 ]+ H - }; Q! q& x6 x. n& q G
- return $newData;# ~0 P0 a0 c4 m; Q
- }
7 T) H" G7 `3 Z' c# J! L - /**
3 J; Q2 T6 j/ }6 w0 | - * 查询指定一条数据
3 n. m Y! E* B- r" a3 Z - * @param $table
$ M( }: w/ l4 [! p$ r - * @param array $where6 G0 n' n+ V: K. r9 B
- * @return int
$ z1 W) o, \' r3 _$ z3 \2 w( T8 w4 K; S - */
9 m$ L4 Q, |1 S7 x a j; T& h6 s/ z - public function getOne($table, $where = array()) {
: r1 P. m1 ~9 V, s$ P0 i" K: k - if (!empty($where)) {
7 h1 ^. E) U V% v, I5 W% ? - $data = $this->database->$table->findOne($where);
% Q: V( J9 y5 F- _ A t+ q - } else {- u$ f8 Y' \* l0 G- d
- $data = $this->database->$table->findOne(); ?! ^6 I) N. S: p0 I2 b2 ?" W( X# Y9 J
- }
8 O* X% I+ v+ ]9 K - return $data;# N+ U2 h1 D- n; H/ O2 U# ?
- } J' A( w% X0 q; d
- /**
% a- _2 t$ [, I - * 统计个数
' @# [$ e Q% H) K6 A9 a# a - * @param $table$ Z, Y( b4 H$ b3 G
- * @param array $where6 b/ w) W/ e1 `5 W" t4 e2 k
- * @return mixed
3 F$ x9 ]( D' o) y2 Q. ? - */
& Q8 Y& _. w* t - public function getCount($table, $where = array()) {
( k2 j! x" { m3 @) T/ L - if (!empty($where)) {2 L1 x/ S' u3 @, K
- $data = $this->database->$table->find($where)->count();( @* W3 V$ T4 E% f2 N3 n
- } else {% l `& Y3 F3 e% J3 U. q ^
- $data = $this->database->$table->find()->count();
4 ^$ G+ j% n0 B - }3 g- Q; [: v6 I9 v" f( Q+ |
- return $data;
: S1 ?, J+ z% L) e - }& A8 N# T7 Z4 s2 f& O: e
- /**
* Z! I) o3 S9 \+ _ - * 直接执行mongo命令
7 \" M+ {" X0 d" Y) k - * @param $sql
, w; @( z; z, B, n- ^: @9 w - * @return array; e& e5 O, G' y" @# m; }
- */ }) {+ O. ?/ n
- public function toExcute($sql) {7 L4 o4 O% e5 {8 U
- $result = $this->database->execute($sql);
% c0 x+ o& X- O" [$ l# a5 x1 G. A - return $result;
, p2 A/ M4 I; E' S& b - } f2 L' f4 ] l
- /**+ w( D( }% J- w- Q% K
- * 分组统计个数5 ?( B& H# U! V
- * @param $table
5 R7 F5 r. o$ F( t - * @param $where
/ b# b9 Y0 t# x. G8 E, r - * @param $field) _& b Y$ [( x+ G5 @
- */ X# _. J# }2 N6 i2 a' Z, b. Q
- public function groupCount($table, $where, $field) {
* Q- {' V8 j+ \) l0 M x% F - $cond = array(
( w3 p, D3 |7 O$ x" K - array(- G4 m. x7 p0 y/ S
- '$match' => $where,9 X! d8 S: g$ b: h: N
- ),
1 d5 t; }9 k+ ~# x - array(2 `2 ~& z3 w% W3 E
- '$group' => array(
8 O; k+ k# s- s9 e" d - '_id' => '
9 v1 r/ | c t" \
, b% u! D4 V, A0 A* g- . $field,
, c; b' q5 T/ S' ~ - 'count' => array('$sum' => 1),
+ M/ M A0 Q" p - ),7 E; |. |7 @# [9 Q4 }4 ~$ E
- ),
6 P! t) F: A% I4 d - array(
( r9 ?$ x1 y* t) T+ t - '$sort' => array("count" => -1),1 K; m3 ^3 E3 \! u/ a* R
- ),& h1 l" N! w4 C' Y4 n2 Y3 O$ t- D& c
- );
# C5 {; q& Z+ V2 L - $this->database->$table->aggregate($cond);
, q" _7 f6 l7 @8 F" ?$ E - }' Q; S/ Z1 {( V. u+ Y i! m
- /**9 A6 R% P1 U* v% C, [8 U& @$ w
- * 删除数据! d4 S) y7 N' X
- * @param $table
! [- Q% ?' h3 j! R - * @param $where
7 Z5 a. {+ {1 a8 y0 \ - * @return array|bool" C: @; u$ r6 L2 F) c2 Z
- */
3 ?' k5 e+ V, M# Q2 H8 t# [ - public function toDelete($table, $where) {
c8 |' P' _- n% b. s( t* b - $re = $this->database->$table->remove($where);% }6 m1 `2 e6 b7 h
- return $re;+ I* q2 Y2 d1 P+ F
- }
! Z# ^7 F6 L( E: M! j - /**
3 K6 `# @& C. Q% i" l - * 插入数据
: O, @2 F. m3 L - * @param $table
6 ~' w! \- L2 d" r' r - * @param $data8 g# e9 m5 [: I$ e1 w! ]5 X
- * @return array|bool
* m- B. o% i' f3 ?$ B# u - */: y2 R) o) R2 O/ @- P0 Q! I
- public function toInsert($table, $data) {7 P2 B. H& L' @# |; I
- $re = $this->database->$table->insert($data);
1 R, G! t6 l+ T* e4 a4 X* n8 X - return $re;
& {: }. J# e9 n4 ?- p' t - }6 v* b; j0 v. w+ m7 `" Z
- /**2 Z3 B5 ~; u& S( m
- * 更新数据* C) s6 i( H7 O' {
- * @param $table
; I1 d: u0 U% r; } - * @param $where0 t1 _, ^! X% o% w+ A, h# z" K' V/ Y
- * @param $data
% z* n/ ^4 ?* M - * @return bool
, H* H' Y. {& K. Q$ i - */
5 e) `# _/ l9 K - public function toUpdate($table, $where, $data) {
5 S+ A( l+ d% M Y# R - $re = $this->database->$table->update($where, array('$set' => $data));+ U+ M# a/ Q% L! B8 |
- return $re;
- Y' e8 C5 {! z/ W - }- h; M) e' R& E, r. Z' E5 E
- /**
7 l. ]1 X; O) o& ^5 D - * 获取唯一数据# h/ e$ C0 M. F& d2 ]) w
- * @param $table
" f! [1 `- _- R( }: Q' V - * @param $key
' L& O5 K1 x/ N0 b - * @return array3 f, g5 Q8 p! h; z3 q* }
- */6 R$ X+ X& Y+ f1 w: ]
- public function distinctData($table, $key, $query = array()) {8 r6 n8 C7 A+ r% t2 a
- if (!empty($query)) {4 I& V1 y# P$ ] B' B( G
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);( L, S; x" \; e+ c4 q5 h7 J* \! [9 @
- } else {
/ b- ?" R( h4 c# g9 G - $where = array('distinct' => $table, 'key' => $key);6 Q8 L6 Y; m& l. T4 z
- }; Y: Z9 A/ H5 u/ y% O% z, @" L
- $data = $this->database->command($where);. K* \$ v; W5 j5 @! g( Z
- return $data['values'];' k* W' B% ~/ q; e" ?' a
- }& V9 g2 h- b0 j
- }
: R" @. Z% W+ a: v3 W' h - ?>
复制代码 ; I& H/ E1 Y- X
1 K& [$ [1 e1 X: u9 `* o |