|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
( u: \0 ^4 p8 S7 g' N, w模式自由。
% ^% w( S# v2 \支持动态查询。
& r& Z* M; K% a5 H支持完全索引,包含内部对象。
`. T3 `3 h- B- Y支持查询。
2 m. J* B0 b, L. C) N. y支持复制和故障恢复。
$ f4 l: f6 b9 U% `& i' |8 P使用高效的二进制数据存储,包括大型对象(如视频等)。
4 B- X6 T- N8 J自动处理碎片,以支持云计算层次的扩展性
. z* g& ]2 P; b: @0 F支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。# y/ N f' |2 h9 d- S8 L! i i+ F
文件存储格式为BSON(一种JSON的扩展)5 Y3 \4 c5 D( \/ c; K4 g! c
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php5 L( K$ L- Q7 R% _4 h4 W l1 b) L
- /**
3 y- A0 Y) d5 c1 K$ {& A' Z - * PHP操作mongodb数据库操作类
& W; z2 C; r( {: \2 q- @! ^1 G - */
0 S1 C! [' v2 m7 o8 y: q7 ^ m - class Database {
2 r( _9 J3 d; W& F, [" u/ f - protected $database = '';
; t3 M- I B1 n, e" h+ w2 f7 H - protected $mo;
" Z6 b" Q$ s1 N) A% b+ c - /**( J* o' p+ `0 z- \1 r, `
- * 构造方法' o5 F6 T, u* b0 e9 v
- */4 ?1 p7 V7 d( t6 v
- public function __construct() {
7 H* u$ l8 @# {1 C, {5 {7 V - $server = DBSERVER;
; z3 r" b( t. e/ F0 [7 C+ ? - $user = DBUSER;- ~, a/ ~+ E" ?" k. Q
- $password = DBPASS;8 B; ~6 z, e; n& {$ I+ j$ A
- $port = DBPORT;
+ o! P# p {3 A2 t) ^' n - $database = DBNAME;
! v- f9 M6 Q8 P( H) b - $mongo = $this->getInstance($server, $user, $password, $port);" d' P% v O. |9 i2 M% y
- $this->database = $mongo->$database;
b. s. _9 {2 h4 y# m& | - }
9 w- I/ d6 [+ \ - /**0 ~! l5 Y, `2 D. J6 j. s: S- }: l
- * 数据库单例方法
; I% z' p, u4 d' I3 D$ a3 e) B - * @param $server5 J/ q* A x# U- M6 J. p" s
- * @param $user0 @8 H. T' B# o6 H" m) z6 h/ M3 g
- * @param $password c, Y- Z& r- Z+ k
- * @param $port1 M5 k- \8 a7 e7 n
- * @return Mongo0 K+ K- h4 x% h# l p3 \ B. k
- *// f% m( G$ c# s; F; u
- public function getInstance($server, $user, $password, $port) {8 J/ t n( D2 e, m5 O) a, I
- if (isset($this->mo)) {
; v2 B3 u& c: l; ^, r; x6 h2 u - return $this->mo;. {/ A4 _0 R/ Z7 N( [
- } else {* } d' Y& t1 r; l
- if (!empty($server)) {
$ b! g5 f6 D u' S6 R! G - if (!empty($port)) {/ x7 g6 ~( S* Q* Q6 G) z$ C
- if (!empty($user) && !empty($password)) {3 p8 f7 K& d' \$ ]5 `+ J/ S
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");3 s8 b: ^) j. F6 t/ y
- } else {
; {" z. i5 w: A2 u8 A - $this->mo = new Mongo("mongodb://{$server}:{$port}");
% X9 E$ X! H' V$ ]3 ?$ {/ E" i - }: Z8 X& F6 G( s
- } else {* k) M' [6 r$ j4 C% v/ n
- $this->mo = new Mongo("mongodb://{$server}");
3 J* N" n7 _4 w8 K* M9 f - }" V# I1 K0 `. r( |4 p; ~- u# @
- } else {1 Z- H" K4 ^ S8 N2 X: |
- $this->mo = new Mongo();8 I! f" F, Q0 ~
- }
: p' `" U, p. i! f$ q- J - return $this->mo;
8 T% h7 Y% K3 T3 ]( g% E1 F9 {, S1 @ - }% k& u- U3 p S: u9 l/ P$ w, S+ ?1 ]
- }: W' f+ ]: d3 ~
- /**
+ Q" @. U0 N5 ]* S/ s: Z. i- w - * 查询表中所有数据9 K7 V' _$ X$ R, a, L, V. B; Y* C0 \+ `
- * @param $table
8 { U3 V5 t, K/ S3 D+ P - * @param array $where6 I7 P; t- a6 U9 J& Z
- * @param array $sort
: K, n- H. x& |% N# v P0 R - * @param string $limit: h- V2 D. F( _! d' L" x8 c& K" K
- * @param string $skip
5 v2 s# W7 d5 z! ~* g! B - * @return array|int$ F2 N& `) c$ `$ f/ ?3 C( e4 U
- */
9 r6 g! L1 ^- _% |+ M - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
8 o! z" N+ b9 u% X/ | - if (!empty($where)) {+ l! c4 M k' a' W7 B6 l6 `
- $data = $this->database->$table->find($where);
. G$ E( P" M. C6 R* R& w* H - } else { } ?, f. R$ B+ {
- $data = $this->database->$table->find();
( {* P" E% E7 y$ n# n - }
! d1 i8 z; K$ u* w. h, | - if (!empty($sort)) {+ K) V8 @7 Z9 N, Z+ u
- $data = $data->sort($sort);" n4 \9 }# }4 L( g) H' ~
- }
+ K* U9 i8 {5 c X - if (!empty($limit)) {" u2 c/ [& z' u) M
- $data = $data->limit($limit);
: M9 `8 P$ [% h0 u. |. _ A2 } - }' y) s! N6 l8 I/ J7 ^
- if (!empty($skip)) {- x6 z" t: Z! f
- $data = $data->skip($skip);4 y7 b' `8 U& |
- }
5 u& ^6 [' I+ h! Q# k, U - $newData = array();
, M; K' c7 I0 Q, i9 l! j - while ($data->hasNext()) {
8 x4 u9 ]2 r: {/ _" U- R - $newData[] = $data->getNext();$ g! W( }' K3 j: L6 N" M. U
- }" b" w6 m% r% F# D, Q
- if (count($newData) == 0) {8 ~3 | V+ o: \4 t2 `
- return 0;( T& Z% \% }* D, m2 g
- }: ]: }# z; o6 ?! R( M
- return $newData;
" p3 C. ^" Y+ @ - }
, T# m9 e& A$ S9 O - /**+ `9 [2 x! b7 F* M
- * 查询指定一条数据
1 b, n8 g+ `' r - * @param $table
5 d ]. N* E( s' ^. D9 L - * @param array $where
6 s! u _. d/ n; q1 ] - * @return int
7 g' v: j1 x# ?% X' c0 F# } - */& t$ U6 C7 D+ \, g+ a
- public function getOne($table, $where = array()) {9 {' I3 y; B+ p& N) l
- if (!empty($where)) {
2 Y k9 a& d) K7 G - $data = $this->database->$table->findOne($where);
" t1 U+ l' n' A( ~$ T - } else {
6 i6 F0 h$ m$ {% [ - $data = $this->database->$table->findOne();
! M! m4 J6 x2 M5 I2 z3 A. | - }
7 N. @0 K4 @; s, r( X' f3 d - return $data;
8 ] D! [, d2 E D4 B - }
3 Z8 V7 @# ~8 @8 L7 ], o - /**
5 e" Z8 B2 K) \6 c& X - * 统计个数
! b, _$ \) ?2 I5 u+ J5 ~- V - * @param $table
3 w2 @/ n% y1 d- [3 r) S - * @param array $where
, o, P. U: [- U& f: u - * @return mixed! x8 x) P! d: O) x
- */
) A2 L7 w$ m' o; J3 [% H - public function getCount($table, $where = array()) {4 ?$ _; V, W& B$ L
- if (!empty($where)) {4 i8 v2 X' p* ]* Y
- $data = $this->database->$table->find($where)->count();9 A9 p. B. T! |8 T- D. `
- } else {
. R1 J( i+ s' `$ E* V - $data = $this->database->$table->find()->count();
+ t; X8 @, m/ n/ [* t. L - }& U [8 e, ?. c8 z' S6 `
- return $data;) N6 Z- O& O; n3 `# a
- }
" b4 c/ R% @ K" m1 A5 ~) c! ^ - /**1 p2 V( N3 o8 z/ ~
- * 直接执行mongo命令
# F7 y. \* k2 C9 J - * @param $sql. q& x- `+ s; n
- * @return array% w( P/ P) t. `( L: @5 X9 v
- */
% p- o7 x* K7 _/ p. @3 i - public function toExcute($sql) {
( o& M( z; s5 j1 M; | - $result = $this->database->execute($sql);7 H4 b* J* r# s* h+ B
- return $result;# O3 W( F5 G5 L
- }$ z% o1 @" j. s# Z9 u) v' [. v
- /**3 |' G6 l( ?' M- R& P; m E Q
- * 分组统计个数
R6 B$ @# A1 _2 Z: D - * @param $table5 q) ^+ ]' N* W2 \% w
- * @param $where
" H9 o: I7 C1 W2 x5 k5 x - * @param $field J% i/ k5 I* u
- */
; @& E8 A2 `0 X& r+ @. s; L% T - public function groupCount($table, $where, $field) {6 G; k( {8 ~2 k
- $cond = array(& I3 D- V1 S8 M% j( ]
- array(
1 r! J8 B6 h; ]: Z6 R5 @0 b - '$match' => $where,
1 G- }) v! ]* d# j( v9 G2 { - ),% j9 L1 x8 T7 {& \9 F
- array(& |: y `# T1 d7 a8 C7 p
- '$group' => array(# R) J# ^. Y, w( t0 H% a7 t* |
- '_id' => '8 q" {& v: s3 P) m4 r
`9 F7 r: o" ]3 {( Y+ M3 e0 h- . $field,
3 N: T) N# r4 |9 I - 'count' => array('$sum' => 1),7 `; j4 p2 K) k% ]8 w
- ),, Z5 y2 I8 E, F# x+ N
- ),
6 a9 v. `8 e3 w* j; o. \# [9 m - array($ a- L6 a4 G- i/ y
- '$sort' => array("count" => -1),
6 j5 X$ D& O4 |9 ]! c1 x3 m# _ - ),: I+ U7 D2 ?# _7 Q
- );
' V, Z/ i2 J. z - $this->database->$table->aggregate($cond);. a( |" h x6 G
- }
& f# d/ X" p# }9 n - /**/ d" x6 s; r4 E# t% p7 W
- * 删除数据- { P Y4 Y' I' n
- * @param $table
1 x: p" P5 }1 `# n1 J - * @param $where
3 w% e% q) K- G4 E: o - * @return array|bool
5 Y7 k* i6 P, r$ @) s% F/ z - */
4 d/ {! t0 d. j. w4 L+ z - public function toDelete($table, $where) {
; t0 q3 Z3 h6 b2 b7 y" |8 c8 I" C - $re = $this->database->$table->remove($where);& p9 s5 u( P( m
- return $re;& w5 G, g) \ Q4 H6 B. a& w
- }/ d: O$ G3 y3 k0 P! |
- /**
, ~9 G! y- Y; l# Q: E8 o3 E) v - * 插入数据+ s1 F0 I# K5 z; ~
- * @param $table( f5 `: ~( }$ B
- * @param $data
% g* s# i* P1 E' x, S+ G) ]& A - * @return array|bool
* g% h8 |( _( R e1 W# R7 Y - */) K( C& l7 E# y! p5 M6 N" E" c
- public function toInsert($table, $data) {
9 f, ^5 n- ~8 B - $re = $this->database->$table->insert($data);
; x; a: o+ L) B - return $re;5 n- W! p H& t. o" b
- }! ^2 _1 [* Z; ?5 h- Z' V, h3 u. x8 Q) F
- /**6 D% I* C% m. H" v6 {# I8 W
- * 更新数据
* x" u8 v0 r# t' B - * @param $table
; z8 m' R0 C5 c6 k* }9 B - * @param $where
% [5 }( Y0 l% j% ~, s - * @param $data7 L. Y8 K, T/ h- w7 E! k; N/ G
- * @return bool
# O; r6 P" y, j" L0 i - */
/ `' G2 j! D/ j2 ~& ` - public function toUpdate($table, $where, $data) {
" W" m6 U) w6 A7 U& Y+ ^ - $re = $this->database->$table->update($where, array('$set' => $data));
( m3 N& q5 F; h" d, h5 \ - return $re;8 h. r" H, Y" D, j2 Q E$ u
- }
+ y! c( i. D$ T9 h7 E - /**. G4 g. G/ m/ Y: n, y! V4 U
- * 获取唯一数据
- C7 R( f2 ~ x U3 v+ g - * @param $table3 }. ^* e2 |: S( M0 Q; ]
- * @param $key
/ Q+ v9 {" V: \6 J - * @return array
9 M& O; z5 R# P5 k4 z9 E6 P( O0 f - */
6 n- g& `: n L) G; }0 d - public function distinctData($table, $key, $query = array()) {
9 v% k. {# x% ]3 |- H3 W - if (!empty($query)) {6 C% ?4 g6 f: a) V6 \
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);; x& L; ]- n2 y9 `! n
- } else {6 |+ X+ j) u9 t0 w
- $where = array('distinct' => $table, 'key' => $key);
5 n/ @# L; ?: F8 b# r) y - }
8 {2 }+ b% M9 L - $data = $this->database->command($where);# [; F' d3 S# A
- return $data['values'];8 U$ E: S7 j: E. D4 M* q n/ L
- }+ y# i. G1 x2 l9 m2 M
- }
' T; u/ g7 [& h' y2 ^1 _5 M5 I1 m - ?>
复制代码
& a, }0 p3 B5 p; r+ E( Z p P q
|