|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
+ \0 i8 e, l/ r9 Q- U模式自由。
3 k F3 p4 [" X- A. ], q3 N支持动态查询。
" c7 _& @0 u8 H8 H6 z支持完全索引,包含内部对象。
' r6 s7 f3 A" p: o支持查询。
9 X$ Y, `) B! ~$ E# s* l; R! Q) [5 @ n支持复制和故障恢复。# a0 l" q& I/ f/ g! P7 d( j; j5 q
使用高效的二进制数据存储,包括大型对象(如视频等)。
- V+ {8 [& n. i4 o自动处理碎片,以支持云计算层次的扩展性$ T! ^: D) G6 c( L. G. E# N# I
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。6 Y+ E( N8 x' |) R
文件存储格式为BSON(一种JSON的扩展)# x& W$ N' o+ f7 d7 T
可通过网络访问 所谓“面向集合”(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
$ r! [& `; b# z" b7 U! T - /**/ z5 R* t g5 G' F+ ], d' I `# z
- * PHP操作mongodb数据库操作类& B7 S v* }$ ]2 q
- */% c2 O5 [# d9 `
- class Database {4 M- c$ \- [4 Z! w: A
- protected $database = '';
5 y+ @8 z, L1 k0 x8 h - protected $mo;6 B; k# W0 q! X: @6 P
- /**
8 `* ?4 d/ S7 T8 E3 d* L - * 构造方法
9 a% {/ \4 P6 p1 m% j9 B9 w - */
8 y! v% F; {; T2 K+ f d - public function __construct() {. `' f5 A7 a$ B5 Z3 H
- $server = DBSERVER;
7 ~0 A* r+ U7 b9 X* `$ [ - $user = DBUSER;
* b3 S. c7 R8 @0 ?! S2 a - $password = DBPASS;
c3 {1 x$ L/ b/ |5 Q - $port = DBPORT;8 [2 T9 I) A" X) R
- $database = DBNAME;
: v% o$ u* I- h - $mongo = $this->getInstance($server, $user, $password, $port);9 |1 r! v! q- W$ C
- $this->database = $mongo->$database;5 \; S1 O2 N/ u5 |
- }
0 _/ N- [4 X3 k, ~/ P, p - /**
5 o. u% `0 v5 G8 i* K - * 数据库单例方法
/ F% t5 _4 ?* y5 A8 _( y$ @ E - * @param $server
7 g/ B3 P/ w0 l7 C4 k - * @param $user) m5 G7 v( s% M3 Y6 _5 B
- * @param $password
9 ? x; A9 v' p& e/ |9 i - * @param $port
& H( K! Q' V& `0 b& M5 V - * @return Mongo; C. y; H3 q9 R9 }0 h
- */* q* ?# P* R) b- ^4 L& w
- public function getInstance($server, $user, $password, $port) {
/ p" A0 `( e! L w5 u3 t3 d& I/ H4 f! g - if (isset($this->mo)) {7 f. Z) ?. i; b3 G: n/ U! F
- return $this->mo;! i& y, ^8 W {2 Q
- } else {8 Q, {: d; x) l* x6 c
- if (!empty($server)) {
~: j; ?6 N k' l( L - if (!empty($port)) {7 ^+ j& t L% _
- if (!empty($user) && !empty($password)) {
7 a& v5 V7 H/ u& ~" }2 b - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
R- f. ]8 J5 m# a; C$ L - } else {& U$ W, K* ^ {% z) Q' C
- $this->mo = new Mongo("mongodb://{$server}:{$port}");1 u1 n* M3 u9 P' \3 D5 h3 u! A
- }& ]' B8 j3 ]4 o- p; `
- } else {
# X- I' u, w( d, l$ ?6 d' ] - $this->mo = new Mongo("mongodb://{$server}");( |- y0 K, {9 u! F8 {7 F- G# d
- }
) s# W) N; h& G+ T) d/ ?! B. t. b& L+ S - } else {8 y5 u J% R" I4 J0 r8 n
- $this->mo = new Mongo();
5 h+ Z4 W& B! b9 V0 w" l$ U - }1 U/ H9 h- M0 d/ c
- return $this->mo;) u! s3 w# n& d: S1 g( M: H! N
- }
$ {) }$ |4 u( l3 f& D$ o. I( F0 A - }( m2 F" r) T6 ]0 K4 k, p
- /**
" y! o" h" u+ J c9 k9 U - * 查询表中所有数据
6 b& h I$ C/ \& c - * @param $table) m- X3 n" ^# K% G+ m& l4 p
- * @param array $where
9 u) i0 z5 I/ X2 h& S - * @param array $sort2 H* u9 f9 i) y+ a* O- S
- * @param string $limit
. b- Y5 ^7 a) Q- O - * @param string $skip
6 U/ r- l7 o3 f" | - * @return array|int
9 O, q: G" D! y% w& @: o3 F - */; v* ?( c! B; a" g1 i
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
) {$ L6 ~ z X. B - if (!empty($where)) {
; |' U$ {5 v" O - $data = $this->database->$table->find($where);, D* M* P8 X% |# d
- } else {
* J3 X- X5 n" ? - $data = $this->database->$table->find();1 L3 N3 k) t) l0 _7 m. W; V
- }
2 X3 T B" M6 b- \: j w- { - if (!empty($sort)) {2 X2 K/ V2 |+ } m; z' Q2 D
- $data = $data->sort($sort);
' v" ]4 h3 Y1 G f0 f- }. g6 {7 X - } K. F% V3 t ~& |
- if (!empty($limit)) {& }+ e' @5 M' {2 J& ^
- $data = $data->limit($limit);
# }% K4 t/ d) q. l: j4 Y" _' R" {) p - }" j' V7 p: V9 A! \: {& M/ h
- if (!empty($skip)) {- M3 v# I" N W# ~
- $data = $data->skip($skip);4 o# }! Q" W& [- k. ]. r+ y; C# G
- }" V( n9 }4 c7 Z
- $newData = array();9 ]8 V: L/ [8 l2 Z3 ?0 P
- while ($data->hasNext()) {# I( o% R& m8 A- w
- $newData[] = $data->getNext();
# b1 p, y" I+ c" ~4 K. G - }
. l" d! D7 Q7 c1 G2 I" \/ p - if (count($newData) == 0) {
6 n. a! e3 Z' R, |& v - return 0;; ^: x; F6 [' ~5 m% w' t4 s
- }
1 x' n8 `" {& R - return $newData;
[6 K' E# Q8 K4 E* v - }
3 [( G. H5 Y3 d& q* n - /**
U D8 b/ v/ e; N$ R! _4 p - * 查询指定一条数据" p! y1 I X! ]
- * @param $table! f; [( A: k9 k) x. G8 S+ \
- * @param array $where( ?/ K1 k) ?% z1 s' ?( Q
- * @return int, _3 D4 ^/ t* g6 ~
- */, D- ^- ]5 h# _" K, T
- public function getOne($table, $where = array()) {6 w4 ~! F9 T" S* _+ U$ L( C; \
- if (!empty($where)) {
% ~; V/ ?4 Y) J! l# y - $data = $this->database->$table->findOne($where);
& |0 J& u, ^" G - } else {0 M" C/ O. e6 u/ U! B5 S. e+ `
- $data = $this->database->$table->findOne();) _* \3 W; o& Y' ~6 G
- }
+ M, N) }: V. f7 [/ U, v - return $data;1 F" \* U6 I% n6 r5 \* N
- }
4 M7 T4 e3 m8 K - /**% M% c8 {& b M- F
- * 统计个数
' e$ ?/ _' k7 X2 L V) }% c- j; R - * @param $table
8 U7 N4 b; f" x. g9 K1 p - * @param array $where
: y, v: u+ O- K9 y - * @return mixed0 K! B& ~& C6 O
- */
: j0 j8 i& W, M5 S% w2 ^ - public function getCount($table, $where = array()) {/ a! s2 b) A8 N! b8 r% Y" u
- if (!empty($where)) {. G! k) N" \6 `7 L# y) Q& f
- $data = $this->database->$table->find($where)->count();
" a1 k r8 E7 v& l6 {" l" D' { s - } else {9 A4 |/ p4 G/ a1 N, |0 U
- $data = $this->database->$table->find()->count(); i& B9 S' ^# l# K; J
- } O+ u" s+ |4 b
- return $data;
2 y" |/ V9 m* V - }
2 t/ Y+ H: ]+ ^2 o3 G2 V% E7 k- g# {: B - /**$ [$ t0 ^+ V( R1 p9 u; Y6 Z
- * 直接执行mongo命令( [4 @9 j( e k* [5 E# y( y# I
- * @param $sql
$ x" m; ~! j b7 ~; Z$ S - * @return array
c; h- u8 \ X; g- C$ j4 k - */
z6 J0 }' V/ O# f - public function toExcute($sql) {. ^( ~: I7 {8 Y
- $result = $this->database->execute($sql);& y, R. A( |7 X8 q/ |3 g
- return $result;8 v& K* Y) P, H E9 {
- }
0 f6 F9 R" ~: ]% U0 D - /**5 B% n" ?( N: \! B$ G
- * 分组统计个数
) B: x- k& B# j6 E2 o0 m1 I9 Z) e - * @param $table- W$ W3 B! \/ o- G8 q
- * @param $where
# B( f+ M. b- }; L - * @param $field9 Q/ e, t8 ?+ P! t" O# }2 C* {8 ?
- */
@7 R2 ~+ R- Z w% A! V; {8 j. V - public function groupCount($table, $where, $field) { Z! O8 o6 Z% v) l
- $cond = array(/ @( w' @5 g, L: c6 `
- array(
1 {+ b4 b1 ^7 g" a - '$match' => $where,
/ C" w" W6 K. M- J. @0 @& a$ [/ v - ),; x F$ u7 B* C8 A0 E, s
- array(
4 D1 k2 c/ x: V2 M/ z! L; \ - '$group' => array(
7 p/ j/ ^; A/ A! Y; c# \& r - '_id' => '" {; s$ M4 u% c" R) u z
- 1 P0 k* M# E! _# A2 e7 x
- . $field,! `, W( v; j7 W5 \. g% h3 r' E
- 'count' => array('$sum' => 1),
. }$ \ u9 A) G# o& } - ),
5 C0 m# M& I- t& x7 @7 X: n - ),
5 x" G: ^9 I) K7 v6 X, B7 L8 f - array(, D( J2 e; D$ {
- '$sort' => array("count" => -1),* s4 p: Z% S. u# x8 C
- ),8 q6 q3 i7 |7 K& A
- );6 ?, X O/ Z3 l. [+ i
- $this->database->$table->aggregate($cond);
' K$ A; S/ ]5 Q* ~% t& }+ [$ `3 ` - }
* f- j" g& x/ ]; t5 V - /**! s5 B* D. r# p3 G
- * 删除数据
' ~, m; s& H, p' _ - * @param $table
& O. z, c2 N% r - * @param $where% `; {1 L* @! e8 w* @3 ?( ^
- * @return array|bool
9 w3 U; s7 \, W1 Q - *// a$ _( v' ^0 F* [2 p! q% N
- public function toDelete($table, $where) {% C* S9 t4 N2 P+ {! s
- $re = $this->database->$table->remove($where);
# q/ |$ R* {4 U/ G' N# e3 y - return $re;6 f0 l3 R3 W. P! m5 M
- }0 t C8 K; r% X4 Y
- /**
2 z: @$ D, q/ H2 k, l( f9 m. P c - * 插入数据/ U2 H7 x5 [. s! C2 f
- * @param $table
+ r* @8 N Y) ], E - * @param $data+ E' _0 n9 A! H1 [; v B) D
- * @return array|bool1 T& r4 t4 j6 i7 c( }
- */
4 b C3 |- g8 k! W - public function toInsert($table, $data) {) d6 F1 w2 C$ C! c
- $re = $this->database->$table->insert($data);! e+ {6 J2 S5 Y0 d' B5 W1 w4 \
- return $re;+ S, X" X+ h5 g: {9 {" H; D
- }6 B) P" f) Q$ D6 w" F
- /**5 U6 M. j7 Z" w3 V' }
- * 更新数据 h! _8 i( u0 k) X+ e5 g, q9 R
- * @param $table8 j1 `! t* R3 u0 ]4 s
- * @param $where
$ L; w/ k2 o$ O4 J/ h' C - * @param $data
9 D; N) ?5 S" L& _, c! w - * @return bool3 w0 b. C$ r9 m. ?5 U
- */ c9 C% U/ J1 _' ^' N) {
- public function toUpdate($table, $where, $data) {
* ~* ]; H, y! G, y - $re = $this->database->$table->update($where, array('$set' => $data));
4 U ]5 c& h# F2 f) c6 i! o - return $re;
/ _, {) C5 H6 U/ O. p2 I - }1 Z W8 A. |, b6 k
- /**, ?3 x" h! |9 h% G0 H4 p6 |$ T
- * 获取唯一数据+ U7 \7 S7 _1 {$ X! m$ x
- * @param $table
, [: `5 D0 Z& `7 {, P - * @param $key
$ i) j, ~ N) N6 c+ T Z - * @return array4 v) \. m5 b) A3 r; X
- */
* T. _/ U& `( E! F+ X# b7 f - public function distinctData($table, $key, $query = array()) {) w3 ~& I4 ^3 B* \% J
- if (!empty($query)) {
. @2 N6 n( _3 |' a2 x - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);- ~" ^- f8 D1 T
- } else {
* K( [% J. A$ i8 d* f8 I; Q/ Z - $where = array('distinct' => $table, 'key' => $key);
/ p6 u4 A ~ u+ ?- S - }+ J* a! Y, g. g6 A; d! `: f
- $data = $this->database->command($where);
/ p7 M+ P4 f7 y9 O - return $data['values'];
9 y, \6 ~" d* ?8 m! m: L9 [( M - }
9 I- ^ r) N9 B% d5 E% Z - }+ z$ v5 @% s2 P$ e' @$ `$ S6 q" F
- ?>
复制代码 . c" ~& e3 N' B4 W |8 k9 u8 W
' ^, _& W7 [) w8 n7 L3 G
|