|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。6 `- i5 f7 c3 `0 l/ y* E3 M# J6 |
模式自由。
4 r3 f" R# y( r7 R" w& a& B! @支持动态查询。
- S" |; q) ^( c, t支持完全索引,包含内部对象。; a( h9 n% w' J t. r) B4 y
支持查询。
1 h* l' P) {6 W' V4 S+ @% j支持复制和故障恢复。
0 M4 v8 b/ m$ k+ I8 t+ j使用高效的二进制数据存储,包括大型对象(如视频等)。/ a5 \9 Q4 c% \& y3 v; {7 y
自动处理碎片,以支持云计算层次的扩展性
, ^( m& L. p/ b5 P) a支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
& y" U8 k" _0 n" N1 b' l ]文件存储格式为BSON(一种JSON的扩展)% t/ k* h' e% }* e
可通过网络访问 所谓“面向集合”(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
+ N) p3 _3 k' w0 ?* n1 d# { - /**0 Q& e, A0 x5 L l0 W: m: W! G
- * PHP操作mongodb数据库操作类0 F& d; W0 u9 j9 B) E, h5 ]# U
- */
5 I- X! f6 h$ {$ n - class Database {
9 S# ? U0 {0 _* e - protected $database = '';
2 ?2 R' D3 P. ~! G& _9 W: j - protected $mo;
6 Z% c6 O9 V2 }/ v - /**% k4 m9 N& B' y2 G
- * 构造方法; E- B9 I( Z9 y# _. S
- */* \. `* y3 J: c F
- public function __construct() {
+ [$ J* U) F7 k8 B( Q6 C - $server = DBSERVER;
1 L9 V# n: X& Q - $user = DBUSER;
! _2 c& [" Q. p7 J2 m - $password = DBPASS;
- {( g0 Y# z1 \$ |5 B& c: Y - $port = DBPORT;9 q# _8 V& p( f, }' ?
- $database = DBNAME;8 [7 s# @+ m- A6 b
- $mongo = $this->getInstance($server, $user, $password, $port);
3 z+ c$ Y& y1 W9 ~3 u. A7 A' s# ~ - $this->database = $mongo->$database;
" m: |3 n6 ]5 W2 z' a - }* g" i8 v) L6 W! ]; C
- /**
/ z8 A* ^9 P% g& e, W% l - * 数据库单例方法& t* z, u# p. X& P9 C4 D& f
- * @param $server
: ~3 L& C& ~/ \! `( c5 |8 p - * @param $user
0 b! }0 m3 W$ Y+ c5 v9 p - * @param $password8 e* T. \' ^# M" w
- * @param $port. N9 l# g1 m. E. {8 r
- * @return Mongo
8 n/ {* i" O7 |# b; L6 N - */
% @$ E* L9 J* V" b3 d! {3 ] - public function getInstance($server, $user, $password, $port) {
, a" J" r$ m# x, N2 d" A - if (isset($this->mo)) {
' j" j3 H( Y/ m1 ^0 v E - return $this->mo;
* F+ Q$ [' D" L, F - } else {: {; y, N( P4 x- \
- if (!empty($server)) {
; D6 `; s1 c2 c! N' m. j - if (!empty($port)) {/ _# ^+ k/ @; X+ j
- if (!empty($user) && !empty($password)) {5 A, P4 C- w3 ^ E$ Z6 \+ h
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
) F2 Z$ ?3 u$ Y! M - } else {
/ ?4 u; }0 k/ N+ v% c/ T& Q - $this->mo = new Mongo("mongodb://{$server}:{$port}");
* q/ e1 Z/ o8 r& H" b+ W% S4 h - }
9 [( @$ A& i3 e$ Y - } else {6 V; C; ^: u0 c+ K
- $this->mo = new Mongo("mongodb://{$server}");2 }+ X! ^+ f5 h+ k
- }
- S% u- Z: m" V - } else {. I6 T, q% f- C% c! D' P
- $this->mo = new Mongo();" \0 t- Y6 z) u0 [0 K0 }9 D
- }
" \# ?3 ~' u+ B1 |0 Y - return $this->mo;3 v" m" X4 N7 s+ t8 `
- }( J1 \6 J3 _: B s! L3 q& g
- }
5 H. z7 f, X0 r) { l0 V; ] - /**) Q: @& \% Y7 T" D) l I) l3 j
- * 查询表中所有数据
+ Z( A0 ^- F1 M4 F3 z - * @param $table$ E+ _8 P- I) F" ? l
- * @param array $where
1 @3 }) ~ f" d - * @param array $sort
0 K j" {5 Z1 y: W/ m! f F - * @param string $limit
% k, K9 a# ]# V" _ - * @param string $skip% }. x; ^' i( j0 }! ]
- * @return array|int
. [6 |5 {) R- y" _0 D) U- B - */3 b) D, O2 Z" R' m0 z# r) {
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
3 j3 l1 S) _7 W - if (!empty($where)) {
! T* G6 H7 @' S0 i5 J5 i4 G - $data = $this->database->$table->find($where);
( m2 e8 T4 M) }( l+ q" l N - } else {% O) V' U l1 R9 m: K; O
- $data = $this->database->$table->find();% s2 s$ V1 L$ j- j1 m4 N- _
- }$ ?: b6 ?) f2 k6 F$ K' w Q9 T+ p) |
- if (!empty($sort)) {
7 t- l3 S R- i+ |/ G' \ - $data = $data->sort($sort);
- v$ o! A$ W# v - }5 e2 j% S3 d* ]0 x$ A8 [
- if (!empty($limit)) {
: ~1 y" u' l: \7 M3 Q. ` - $data = $data->limit($limit);9 M( a% l$ Z2 K+ L. R0 O2 U
- }/ S1 V9 i o2 b+ J! L; q$ A/ F
- if (!empty($skip)) {
# I4 J( |: V, _! D - $data = $data->skip($skip);8 l7 @5 L" f$ U5 s
- }& T% h+ J3 h- M1 Y) t
- $newData = array();" y3 `" A; |/ Y
- while ($data->hasNext()) {, }( U" T2 Y, w7 Q+ m! s* e5 C9 J
- $newData[] = $data->getNext();5 B3 v$ r7 ? T7 ~ G% Q
- }
8 E( l1 B& ]& x. O) w5 ]$ p1 }8 @) n - if (count($newData) == 0) {3 \6 R5 ~+ z6 J0 [
- return 0;9 e0 S' Y3 R1 s& A0 J
- }4 c! r$ P4 }/ ~6 |! V
- return $newData;
! n5 f4 t3 G! X0 E; ]* [4 m - }% {; e+ I( d. M W2 r& E1 ~
- /**; o$ T: ~2 o0 a
- * 查询指定一条数据; l0 u3 q- d7 M# j2 }8 u) _2 x; |
- * @param $table! c& a: s' _+ P2 j* V: @
- * @param array $where) s1 D0 N. w! y1 E& I! U' J5 N2 W
- * @return int9 l/ u) I0 H4 l, x" y, X. O, l
- */! t8 P! U2 C: L9 z
- public function getOne($table, $where = array()) {
' `4 Q. E9 ^% n" s- ]! M4 `5 [: V - if (!empty($where)) {6 Y* O0 d" |0 G
- $data = $this->database->$table->findOne($where);
9 k1 Q& F" S. L/ _ - } else {
2 D9 G( T x8 T - $data = $this->database->$table->findOne();: @- T5 ~# q- z. S
- }/ f8 K, P m4 p- g
- return $data;& q$ S. W/ R7 M' O+ E) {3 A5 |
- }
# P$ p& u! \. U - /**, S, U G& }& C# [5 E9 a
- * 统计个数
) M9 I! ]: o8 x9 d9 I8 f - * @param $table
2 }6 i; Z, G/ W8 D8 \, x - * @param array $where1 }; `( w; o( N
- * @return mixed: ~7 ^6 X. ^; V5 D' X2 x- [; E" Y
- */
! v4 x C. i. K& ] - public function getCount($table, $where = array()) {5 }; @' |: y! M- {2 K
- if (!empty($where)) {* e! Z7 i/ t2 d g( p; _5 ?3 Y, p
- $data = $this->database->$table->find($where)->count();
* x' T! G7 m/ i1 }" K - } else {7 F5 J5 F- v. ?, ^
- $data = $this->database->$table->find()->count();+ L/ h0 Z2 R% z$ m6 V3 Y
- }
# _0 g& M& f' z4 o' R# t$ W - return $data;5 u" [+ d$ m6 `# m. P# u: A
- }4 f- r& y$ ~. @5 h6 u
- /**' |. c; k; I5 u: t0 Y3 e- {+ w2 E
- * 直接执行mongo命令
7 l$ z9 o$ D; S8 a - * @param $sql0 `" @+ Z+ N$ @& L
- * @return array8 k3 ~4 a0 u; S2 V6 R' x! w
- */
' _$ J4 C' w7 w! t3 r - public function toExcute($sql) {
% V* Y2 n, G7 u$ l - $result = $this->database->execute($sql);1 `: A9 \7 ~3 v. u
- return $result;& I6 F" O9 S1 ^) c: G9 j
- }6 V! R1 i; D' w5 T d
- /**
' P, t) f1 _7 } - * 分组统计个数! ]' V+ V0 y& T% s
- * @param $table- X& f% Y0 m, `- W
- * @param $where, F% T: k* d" M$ ?/ N: F: ?
- * @param $field
! F$ u( k# t5 e f0 ~5 m; S( A - */. i4 Q l* o+ a( @) u
- public function groupCount($table, $where, $field) {
, a+ z9 g& B { - $cond = array(
7 x' n% ]9 Q3 M) f( Q4 G5 b - array(
4 a$ K1 S5 ]- ^) k/ u - '$match' => $where,
$ L7 J/ S, F" j) I0 b; j - ),
+ v5 s& i- Z% u V3 c& l2 j y - array( J5 |% n2 Q& Z2 t! e3 [& `
- '$group' => array(
$ M. p8 [$ X% [1 o$ ` - '_id' => '
4 F4 J0 M1 Z* u$ n4 I: V9 c - 2 I. O4 a% x4 j* s7 p$ g
- . $field,
: d. m/ r. s9 L$ b& q8 w0 h - 'count' => array('$sum' => 1),( M! ^& w$ T1 w# S
- ),6 f: U2 I0 [; S0 p* m8 A7 N
- ),+ V1 Z; }; d: Y
- array(- y5 J5 R: p& x/ N A
- '$sort' => array("count" => -1),
/ `7 c V# ?& d5 x. d( T' x - ),. F% x+ O7 U4 @6 Z
- );* k5 L! o' ` q5 t6 w0 n# n
- $this->database->$table->aggregate($cond);
1 u' [2 H& |: ~; |& z - }
: @, a% Y& n/ o3 { - /**7 Q/ @! t, }" U6 U
- * 删除数据
" y( S3 F5 |4 r% J - * @param $table
# W8 P; y- e: u. [ @- c& E5 O( ? - * @param $where
7 l. r# f, X2 W1 I6 l& T - * @return array|bool, X# n6 p& {# o9 @/ h8 M& B
- */# M7 u* u1 |, _/ {
- public function toDelete($table, $where) {
7 z1 ~& f$ Y7 `: C% \& v1 F. H - $re = $this->database->$table->remove($where);
* l! C% D/ J7 m5 K- Z* \2 C - return $re;/ U- O8 k! D* w
- }1 B/ ], X( Z9 l( K& F0 m6 J
- /**
5 A6 |- W% E! n) c - * 插入数据2 ?+ q- b. t# p$ j
- * @param $table
" x- R7 s% M# H0 S( D - * @param $data: ^ N4 b1 T/ ~! i$ ~
- * @return array|bool
; f( m- A) S- Q3 Y) L c& u9 p - */
# B4 x0 f+ \, K4 E; u9 p6 [# Q- H: c - public function toInsert($table, $data) {
8 C* o7 ]+ c8 B1 X8 y( k. `5 D - $re = $this->database->$table->insert($data);4 Z% D! h+ T; c( ^- e% D+ B7 ~
- return $re;1 Y5 T* u0 F% H$ l' M& r
- }& O& A* b; D) G# [9 M
- /**; O. c) k4 _5 _ R
- * 更新数据 u% @" i: C/ g/ I
- * @param $table" D- g' S, s% q9 C
- * @param $where; ]' I* N# l- d- V2 w
- * @param $data7 G$ b2 O8 Q# V5 ?9 s! e6 W
- * @return bool
9 D' h5 }1 l# F6 Z1 p3 h - */: z- q: W. N/ k0 \* X1 k$ G
- public function toUpdate($table, $where, $data) {
! C' X1 l0 q4 y" h - $re = $this->database->$table->update($where, array('$set' => $data));
' v- Y9 M& B0 N, j - return $re;6 c: S' S+ |6 b; [% U/ T
- }
4 ^% q% K9 Y& z - /**
* l8 k) r) T; Z- B, {" F - * 获取唯一数据
* j5 m1 l _8 S4 ]2 b - * @param $table$ }% _5 A S5 d
- * @param $key2 I/ z9 |4 Z2 F( S2 a
- * @return array) g/ l$ K* u6 j1 z
- */
! h; e" z5 a- Y7 R7 ? - public function distinctData($table, $key, $query = array()) {$ T0 i- d# X5 u! R. ~1 Q0 M7 f& a
- if (!empty($query)) {3 H. [/ B8 A) f
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);& d& `4 Q$ o4 r$ n
- } else {0 [& e% ^) C; g5 y6 D) o& a5 F- }& V
- $where = array('distinct' => $table, 'key' => $key);
" b( L. x% c: g$ v+ G7 z0 r+ D7 X - }
6 a4 }5 V' n& X7 }8 E, j8 z! r - $data = $this->database->command($where);
: A% n' v; e% a3 H! s - return $data['values'];
5 p3 ?7 s& U. r3 ^3 O - }
) F: U8 V6 U: @9 F! J - }; d, G2 a. ^" R( I2 v
- ?>
复制代码
; V J( q3 N {7 w) G4 E) ^- S9 f) m+ W3 @
|