本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
4 G3 B8 d8 u7 T1 n$ Q1 x) C模式自由。
9 t3 Z: K+ J* _支持动态查询。
, ]8 V1 |( ?4 a# V$ s* @1 s3 f: n% Q支持完全索引,包含内部对象。
; v! R0 r. ]' ^" c, {' h+ U支持查询。
- e1 N1 @1 @4 M( K p4 I8 u6 f4 z支持复制和故障恢复。. T; t8 C# I! W. f/ B( J
使用高效的二进制数据存储,包括大型对象(如视频等)。+ B$ ]' [* A# y8 b4 Y* n
自动处理碎片,以支持云计算层次的扩展性
. F& Q( g% j- J3 U/ M( d3 Q/ C5 g) b1 k支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
f/ q8 k) F6 S文件存储格式为BSON(一种JSON的扩展)/ y( a* V- W+ [4 F
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php6 q2 R4 T& N$ {$ U6 @
- /**
( [0 Z1 }, g6 q- G f - * PHP操作mongodb数据库操作类) U5 u. c0 ^3 g3 K" y0 u
- */
5 j* Z. L( X, `( Q8 a& H - class Database {" j8 Z' d6 {. K8 p2 t
- protected $database = '';
1 l1 D A& f ?$ X - protected $mo;" `/ k& s; h+ O' N1 c7 B
- /**
2 d/ w0 t) \( ^2 L: G; ~ - * 构造方法
: L0 X# Q6 H; p: P - */
) }& {+ g0 m5 s/ h0 _$ b7 Y - public function __construct() {
) L8 s7 c% r2 t1 |3 L& O - $server = DBSERVER;% l& {, p# d! U# v) d6 Z1 Y* Q
- $user = DBUSER;, E9 _& q9 ^; t0 r
- $password = DBPASS;6 M( h- O7 @# r: {& V {
- $port = DBPORT;! I# T" } _1 u+ p4 q$ `
- $database = DBNAME;& e. ~! W; k- E* w
- $mongo = $this->getInstance($server, $user, $password, $port);* ]: I2 V+ Z5 E J
- $this->database = $mongo->$database;
- _+ h1 b9 V# \ - }
8 B; a+ T; j+ f# O8 O. p( ^3 I4 M - /**% w5 C$ O$ s9 |- k
- * 数据库单例方法
' ^/ }% s* a2 _2 k - * @param $server
" L% [' y) B. c# t8 R - * @param $user% }6 q8 b9 z5 z! i0 o
- * @param $password
- Q, |! D6 K7 Y - * @param $port% v: I; u3 f# ]5 ^: V4 J
- * @return Mongo
; A/ M/ f0 D/ m. D( J. p4 G - */
/ t7 L! }& t) ~# {& J3 z - public function getInstance($server, $user, $password, $port) {
# b8 F- p+ \1 J - if (isset($this->mo)) {! C, a" w! O: h
- return $this->mo;
0 J3 J. l3 l# Y* V6 C; {, V8 B - } else {8 n G6 g. ^7 V# L- _
- if (!empty($server)) {8 d" v; X# \3 ^' d4 ?( J8 W
- if (!empty($port)) {8 w* F5 m4 G, g# b4 T) r. D% Z
- if (!empty($user) && !empty($password)) {
" r$ S' R/ P" f. X1 m - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
0 N3 b" O8 Y7 ]" _: w. l - } else {6 y5 t, Y) f% H, }* p; N
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
+ L3 Q) X0 p3 Z' Y$ U6 y0 b - }/ P: N" C* d k/ ~
- } else {$ X9 F6 } i* n }+ n" f) v' }
- $this->mo = new Mongo("mongodb://{$server}");9 x+ A% q2 ]$ v8 S' m! T
- }/ `% G0 G$ ]7 b( G
- } else {
# t) p I1 Q! v+ S - $this->mo = new Mongo();
. m" F$ r% C3 Z/ Y: C3 v+ c a7 r - } } Y1 Y5 j% k5 E8 M5 ?6 h, C
- return $this->mo;
9 w2 Y, T" [( O- i+ Z) d4 |( f - }
. W9 E- L. p) m - }
2 `" \$ X" {7 m6 k - /**
& _+ v* M) Q- U. E - * 查询表中所有数据
3 y, a) _' ~% g. e - * @param $table* H6 t# z" b) ` z/ c# C' n' d
- * @param array $where
: I' v+ C1 M6 h+ v8 l4 i+ N - * @param array $sort
6 j6 B) ~, H1 D3 @. Q/ L/ }# x - * @param string $limit
9 n' V. k% w+ s" o* q! K- L0 C - * @param string $skip* K+ G( c8 y! m, i
- * @return array|int X. s6 M- J/ ]/ c$ Z8 p _
- */
' g1 |- E9 t6 F) F7 @7 R: }; e - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
! @; p( J* X, w6 e. U+ q$ b+ _ - if (!empty($where)) {- H8 Z" I0 {# o6 @: i9 R
- $data = $this->database->$table->find($where);, `9 V8 b0 H0 H" z, |' x% n' A8 u% Z- a
- } else {3 M: v- d* U* f" a- i7 R
- $data = $this->database->$table->find();0 C4 F6 c, g6 ?# N" U9 g
- }5 z; K4 U% _" z9 T1 D
- if (!empty($sort)) {
7 {; V* ?. o; X% ^% v - $data = $data->sort($sort);
) Q( R9 m1 k2 b9 M* _ E5 u - }% d! u. y! p) B- }# L: g
- if (!empty($limit)) {. N# }. ] L! v& Q+ I* l5 S$ p
- $data = $data->limit($limit);' u0 n% G* @7 F" a, ~
- }
# V% m5 _5 {9 B" \$ Z6 P - if (!empty($skip)) {
8 W, w2 N4 r* L0 K! K - $data = $data->skip($skip);
+ E) L4 K# ]; s* [3 ?. }' x - }4 u. \: ?, A" |
- $newData = array();
) F3 b3 s Z. C0 G8 x$ W! i: P( b - while ($data->hasNext()) {
1 ]& p p L( O. }* X - $newData[] = $data->getNext();9 F' X+ ]4 O, P; q
- }1 d& }0 `, K$ S7 K8 J9 I
- if (count($newData) == 0) {
) l+ `0 B4 W3 Z& o, [- F - return 0;
7 U! @: f* O; u - }
" \# p8 D- X2 p% X7 f - return $newData;& l8 Z: d& {; N
- }
# N) ~4 a8 |3 i - /**. l6 G* `* M* w2 V! M2 f
- * 查询指定一条数据
4 t" i9 S1 V) ^0 a' j! G - * @param $table) f. \, t, A) J" D3 L
- * @param array $where
7 _ N* H. `7 O- Y; y - * @return int
6 z1 a2 i% e* ?! a3 ]4 [ - */" H) D# \4 S# u: ]6 ^$ w" {! c: z
- public function getOne($table, $where = array()) {
! {' ^3 v1 _. A/ ^' B! \ - if (!empty($where)) {3 I4 E! w( u5 [, {) a K9 z+ \9 o
- $data = $this->database->$table->findOne($where);
3 g4 U4 i9 d! z, A( G8 N - } else {
5 M0 e6 w% p% N3 f2 S - $data = $this->database->$table->findOne();7 G+ z. @4 K( J1 ^- w$ g) ~) a
- }4 x. j3 @# H! m9 z# A, ?
- return $data;
4 {! ~) S' h$ ` - }& \8 d" U: R) M' g' @4 X. N0 H
- /**4 Z- F5 v6 }5 ~: P3 b
- * 统计个数. a6 ^* r3 K3 a$ N- ~* G
- * @param $table
8 O8 j2 w, Y: t5 z3 p3 i8 b- } - * @param array $where
8 ^- V! D0 a& q" d: W3 I- w" E - * @return mixed( S6 v$ d! L. J Y. ~! ^5 d7 ~
- */
* f) O: e- Z7 v& P( r& R - public function getCount($table, $where = array()) {
+ Q$ U) }7 K' E9 _/ ] W - if (!empty($where)) {
0 ^$ r; Z& V# T. {5 _$ g- ^ - $data = $this->database->$table->find($where)->count();
0 I/ P' h3 M0 H+ k - } else {
0 G/ G: e, O* e2 A: p# }6 j - $data = $this->database->$table->find()->count();
4 P( S1 R! n d, } - }
! P& e; x, M0 Y - return $data;! d+ }3 \2 I' y1 X
- }
5 U7 S: F& u. o - /**5 o( j6 P3 l# r
- * 直接执行mongo命令 v7 s4 I0 p8 U* F7 }' V" |
- * @param $sql$ c% v$ I( _; U2 e9 S6 Z
- * @return array
7 L* s3 g K; q0 ~! X+ B% i - */
2 c V' g1 G9 I2 q8 z - public function toExcute($sql) {; `. ]4 j0 \, u! h& t7 o5 w0 D+ k+ ?
- $result = $this->database->execute($sql);
/ ?) ~( V9 R; \; x5 x9 l! V# P7 x - return $result;$ A: l: L/ a H z7 W+ A4 F6 F7 n+ S. S
- }
8 [% J. R5 J) }% E8 J v - /**& x9 P' p; r( O. X8 K5 W
- * 分组统计个数
% j# S6 j# q6 a5 D. i# w - * @param $table
8 J7 X9 W- k4 e" P" ^ - * @param $where
) Z2 u4 m! L A$ C" q - * @param $field. `. h( D' x$ t( A
- */
0 E. ^) V( D0 J2 J - public function groupCount($table, $where, $field) {! }/ L: y5 E+ W3 R. |8 k
- $cond = array(" s% E( E( X; i5 p' O/ Q
- array(
$ i0 a" R3 j+ y. k: G" f" r - '$match' => $where, P% g2 S J3 K
- ),
7 F9 U$ ]4 x/ a6 K, J - array(
1 ]6 a5 M2 O) P# A: a - '$group' => array(% [' Y" w8 s$ K' w, F- F
- '_id' => '
7 b* {! E% U% A6 X x2 F
7 m2 }8 `9 B. \" G- . $field,( B9 R: m& C& C8 @
- 'count' => array('$sum' => 1),
: q+ U6 f( P2 I& ?& v# \3 {0 x - ), j! W, u2 F8 h) w+ b F( Z* E
- ),
& U5 F) s7 v/ N# M1 K4 h0 C - array(4 v/ d& W v2 U5 d3 P, {' z
- '$sort' => array("count" => -1),
. [: s. k' z& u* G q - ), N5 @0 f3 ]/ ]4 d! [, e
- );
+ E# a- c" g+ e - $this->database->$table->aggregate($cond);; u4 g8 W+ {5 @7 w4 ?9 c
- }! {' p2 k7 r( a' H3 `" C
- /**. p; [9 L+ E. o1 L! M( h" B
- * 删除数据9 l5 i1 q& \8 K1 [
- * @param $table
2 _0 {: ]# e+ U2 g1 {9 L4 t X - * @param $where/ t' y! r+ B, V' k* i* a
- * @return array|bool3 ^, `1 |4 L; y8 n1 Q
- */
) \! Y; R/ a# `/ h - public function toDelete($table, $where) {; ~9 ]( s' S( Z) N5 D/ f$ P
- $re = $this->database->$table->remove($where);
4 e% G2 e8 L; J+ u& M8 O - return $re;
: T. B( C2 _4 F' F; i, _8 A) r2 u( F - }/ q+ U! U2 j) R2 r" |' f
- /**
- S0 e0 S V. n3 \. o% F - * 插入数据) n$ }9 ?8 T1 R4 l) a$ o) j) @+ U0 Z
- * @param $table
. ]# ?1 j5 B: Q) E& P8 f - * @param $data
. v3 n& E1 I/ F - * @return array|bool
0 F0 T) m, g; b1 |) h - */
1 V/ ?) c: K' t - public function toInsert($table, $data) { O4 I: ~. v6 H
- $re = $this->database->$table->insert($data);9 ~2 f$ i) U2 d. D
- return $re;
8 c0 W, Q$ L- U7 m4 d, ? - }
; Q' i* @* l6 }5 f4 W$ \" Y2 M - /**+ D6 t2 W/ t0 k3 C' ?& }
- * 更新数据7 E$ C6 U6 J+ W7 @* P
- * @param $table7 q8 q! V5 f7 W% W& W `7 n
- * @param $where
9 X+ R! \1 n5 R x - * @param $data0 g+ r3 I/ Z0 G9 S
- * @return bool) }& D5 p2 P( p3 E: A: l( z
- */
7 }$ C. {2 P* N- G" Q - public function toUpdate($table, $where, $data) {" V( t! u( b0 H- Q' W2 Z
- $re = $this->database->$table->update($where, array('$set' => $data));
: O! V/ o" m S! O1 z( K4 e, h" d - return $re;
d3 m7 X: _0 u9 V- a - }
2 J/ y$ A! `( u& H' Q - /**8 P! |$ o* ~& k% T+ R
- * 获取唯一数据
9 J2 l' f6 z! I& s3 [ - * @param $table
5 \- E/ }4 e; ?: _5 Z - * @param $key
6 A& t$ k" ~* i9 z" y6 L6 Q. f - * @return array8 F% |/ n) B$ I9 S u
- */
7 `5 p/ u/ S$ S6 M - public function distinctData($table, $key, $query = array()) {0 W) O; W3 o- C b# `. f4 f
- if (!empty($query)) {* k; ?& {3 U: }7 Q
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);. t4 S2 w; P5 B
- } else {
; X' }% _3 L/ y% T$ I - $where = array('distinct' => $table, 'key' => $key);& `, m5 ?% S* c$ K4 \. B0 W" e
- }
& e& O8 w# u& k3 E3 d4 M - $data = $this->database->command($where);2 a; L' D& U, o/ C6 v6 Q
- return $data['values'];
6 T$ P" c4 ]# t. O0 T+ M - }
7 X0 y0 O" U8 I) v8 w" R' ? - }) a d8 G8 l) `( q% U! ]
- ?>
复制代码 . C- q! H& Q; L% A# p
1 q- S$ L4 A( _1 j6 V
|