|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。0 O; k6 z* ?; P6 {5 o- t
模式自由。. Z& l) x7 M8 A1 f3 t( R5 H
支持动态查询。9 z. A) s* M/ l. e4 w* [& }3 x
支持完全索引,包含内部对象。1 v4 a, K- y$ o
支持查询。
& U* O8 ^. F% l7 Q支持复制和故障恢复。4 E/ n3 u; b3 b5 B5 h
使用高效的二进制数据存储,包括大型对象(如视频等)。
! M ]& `, Q* }8 F! Y自动处理碎片,以支持云计算层次的扩展性
- M+ a4 r6 E( |! L% y( d: e+ O支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ I# _3 ?8 g: t9 B9 g文件存储格式为BSON(一种JSON的扩展)/ l) ~6 z% D5 a5 U% u
可通过网络访问 所谓“面向集合”(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
8 @4 t# L6 ]; ^* g - /**. g! A0 O h: }" D1 A$ z! k
- * PHP操作mongodb数据库操作类3 |. F( N h9 B0 i4 M7 h
- */1 G! k7 W) d& K- `: _5 s
- class Database {8 w9 E7 ], C# g; W9 U* m
- protected $database = '';: D& }4 R4 O2 u' Z$ v
- protected $mo;5 l+ g; b7 O2 P; v
- /**
% o' r' q8 Q5 k& ^ c - * 构造方法" u. T% f: k1 N+ h' z
- */
1 e/ p8 m9 J5 E$ f# l; F, {% p3 d" V - public function __construct() {0 N. J9 y+ \, E; \7 h! h" C
- $server = DBSERVER;/ P: L* G" d) G
- $user = DBUSER;3 Q" @" T" f) q( S
- $password = DBPASS;
% e8 i8 k1 l/ b5 s - $port = DBPORT;
9 X) ~1 S, y) x# Z0 w" H - $database = DBNAME;, E/ u2 o. ?0 D2 B/ l& m4 W- F, w
- $mongo = $this->getInstance($server, $user, $password, $port);
/ Y$ n! G+ N i. v0 U! M - $this->database = $mongo->$database;
9 \/ G2 E9 L k- k$ ~: l - }
5 I; }- T$ W8 Y' L - /**9 M# {. O& ~9 e8 A
- * 数据库单例方法
1 \' }* I" i; q- ^+ ~ - * @param $server
7 E! r0 w, f; j) E# Y" ~) j( f7 F - * @param $user) |+ V8 g# ]" ]2 Z5 X
- * @param $password
& _- q3 I }* ~: _# q# s - * @param $port9 ? q. u9 A- @& E! M8 Q
- * @return Mongo& v0 N5 V8 v+ l9 L$ `$ S0 B
- */
$ j$ [4 m: D! x: o& G7 ] - public function getInstance($server, $user, $password, $port) {
8 O% S4 m7 g) M, @ - if (isset($this->mo)) {
) v- `; Y/ k- }5 M' e - return $this->mo;& {( `9 ]$ ~" H* l) P3 d4 V
- } else {# u: q% X' Z5 }+ Q( {
- if (!empty($server)) {7 H5 W$ T1 s. S; m
- if (!empty($port)) {. F3 b! O) {0 i M* ~0 m
- if (!empty($user) && !empty($password)) {
8 F' W/ a( o: `+ @1 Z- [ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
' P( g& M8 q. } - } else {
6 A' ?6 l8 p S3 H - $this->mo = new Mongo("mongodb://{$server}:{$port}");- M7 b2 g: h) c2 d
- }9 j) i! i0 U: A( y: B" |
- } else {: M# @4 _; K" `: m. ?( n& x1 d
- $this->mo = new Mongo("mongodb://{$server}");
1 k) Z% ?: s6 B! Z, V8 A) l, H - }
7 @/ v# D- M3 A" S5 j+ ~! Q) n - } else {
3 ?/ Y- C1 p" [% ?0 r( k - $this->mo = new Mongo();
% z9 ^% N: p/ H ]8 @5 J5 A! X6 R - }8 s2 }4 o" P: C! K3 E3 \
- return $this->mo;% F4 H- T8 k8 `7 e; D' _- y% T
- }
5 O1 ? H( z0 c - }
/ [& i, _( N$ @ - /**
- X, |9 e! N$ X* y3 }, _ - * 查询表中所有数据& S' [1 D$ k i9 m/ B- m
- * @param $table
`- v1 [7 a4 { - * @param array $where
. l" |& i: n: a - * @param array $sort, h' Q8 Y" U0 p) V* j
- * @param string $limit( W7 z$ l: o9 |
- * @param string $skip
) s6 v" c8 n" Z$ Z7 e/ \* Q% P# _* Z - * @return array|int. l6 c: g) X' F& \7 G/ x7 M$ ^& d
- */5 Q( `2 _9 D- B% B
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
1 t' r' E7 S* j( k' @& w6 ~, {+ i - if (!empty($where)) {* {: t+ T8 y$ k& y6 b5 f* g
- $data = $this->database->$table->find($where);
0 y- D7 ]7 F* I$ Q - } else {
; @1 ?3 u1 A* C# m - $data = $this->database->$table->find();, ~+ A) Q& x* v* f" D
- }
0 P! K! u9 I' v4 | - if (!empty($sort)) {
" ^6 ~( A6 z- R$ Z0 g - $data = $data->sort($sort);
# O# R4 i9 X( Q - }, ?8 V% r3 f7 P( y' }/ S
- if (!empty($limit)) {- j1 T% b9 _3 d& N
- $data = $data->limit($limit);! V2 D- c* ]% h6 P( L$ l8 S
- }
4 q" s) |+ N9 I% _& K, ~3 R - if (!empty($skip)) {1 ~+ I. z7 X3 h0 c) l6 ?
- $data = $data->skip($skip);1 [, M1 ]% J3 Q" i U; X. N
- }
; ~6 O8 H: p! L! D+ j - $newData = array();- i1 y; N! \, m
- while ($data->hasNext()) {; k" g/ P* H: c) {
- $newData[] = $data->getNext();
' T6 x" m; u9 y3 r; E - }
! d: t5 k! ]5 @, t2 c - if (count($newData) == 0) {. \7 U+ _; }1 C- S
- return 0;
7 [$ X* {8 R" L1 S0 {/ B( w - }5 i2 ~& j/ l" Y6 m
- return $newData;( V* v# @* k1 p( s' |# M
- }
) E; |- ]' k7 J" l) B - /**# m, w8 `1 Z! u. M) T. ~* N& l4 o
- * 查询指定一条数据
5 y0 \, M1 E/ o; b9 T- Q3 Z - * @param $table
, L# h# ~- T2 O+ Z# ^: x - * @param array $where
& c/ x) _, Y& _ x. b/ k7 y: c - * @return int3 I2 D3 _3 ?3 L3 u3 Q
- */; t7 t- d2 h" d' ]
- public function getOne($table, $where = array()) {
" y4 z( n2 O: ^8 I - if (!empty($where)) {! l7 K. |5 G% g0 L# b
- $data = $this->database->$table->findOne($where);% ~* o+ i% `& ?+ \9 z+ j$ c
- } else {, w0 T5 z" b8 a
- $data = $this->database->$table->findOne();
; f$ l+ [4 h6 r' Z2 N# q/ g: d/ { - }( }2 |: v. `( S5 n
- return $data;2 i, a' C# j, K6 v) F
- }
6 d; O- p- Y8 B - /**
9 e( @3 T6 q3 c, }. S4 K$ H - * 统计个数
/ n1 H5 r2 Y! T - * @param $table
|# T" Q) o9 k% k- `% k - * @param array $where
9 P1 r& M0 {& `- X# b5 g - * @return mixed6 e# T0 n( L' l* F# g/ l. ?* S
- */5 z, Z2 \# L: o4 P }* T
- public function getCount($table, $where = array()) {1 e/ t& U' U/ o; N$ p
- if (!empty($where)) {! D* H5 w# m& Z" g( h+ J C4 Q1 c
- $data = $this->database->$table->find($where)->count();
" z6 D3 E* ?. D8 l - } else {% F$ a( [5 A& R7 p* y- b9 u
- $data = $this->database->$table->find()->count();
/ A+ y) ?3 E) W6 w7 Y- t- n - }8 z, I8 Q7 W; E6 g( q+ s
- return $data;
6 T9 I9 ~, |7 n; {2 @ - }
8 Q# N- D* o& K' T - /**: o% w. _* r! V) V- h0 a( D `# l6 Q
- * 直接执行mongo命令' J, ]3 @" f3 G# j
- * @param $sql) Y3 ?4 X) N+ b( f7 W8 ~( r, T
- * @return array1 j6 p0 W k3 r
- */& g5 Q8 h8 d0 \9 O) l" N9 C
- public function toExcute($sql) {0 h' o9 Z! R( ^( E2 N7 y" z
- $result = $this->database->execute($sql);# N) Z0 C1 {2 ]* m3 b
- return $result;
O# t$ D8 G. f! V - }
& O2 i; J( f& J& T8 _ - /**
# n& g3 R" u( V+ C - * 分组统计个数- x# A; g0 M% q2 O
- * @param $table
& v, O6 @% m! A* b$ k5 w" p - * @param $where6 [# ]- `% {2 T% K. \
- * @param $field3 t4 K; u. E9 \ J, m
- */2 P) o n9 {; u; R% K
- public function groupCount($table, $where, $field) {, ~7 |1 I$ G* r9 J
- $cond = array(
) [& O6 e# q' v, k - array(
) e: U& u8 r* G( R& [. U8 z8 F, r - '$match' => $where,+ }; k' Z6 ~/ c: x1 g0 ^
- ),) |; u3 J2 _0 M Z2 Z P% u
- array(
( p( _; N2 C' n+ M/ O& v - '$group' => array(
% o) N9 W# J2 ` - '_id' => '; z& R. G" e3 G2 F
! J! z5 O/ U! [7 I4 J* }; J8 U- . $field,$ V: {. F' E5 n5 i5 D+ ~5 d
- 'count' => array('$sum' => 1),
* q7 } e" D: g - ),
: B0 K A0 H2 T - ),
# v7 y7 [$ }" f$ f0 K' b! A' y0 M - array(* \1 `! l- s/ }8 Z- O, _8 x* P, v
- '$sort' => array("count" => -1),
0 N" y; E+ m) v( \6 k' ?' L - ), U: ^2 l3 l; U; T" j
- );* r% S3 K8 M, E* J. Z
- $this->database->$table->aggregate($cond);+ G' P/ p* z* C& V& V
- }
: }7 V9 T( ?7 @% `9 T - /**$ J1 ]9 O. ~- [- b
- * 删除数据0 U! Y( C" r+ x" p' ~- w) b7 B7 N
- * @param $table
s ?6 X! r% D. P - * @param $where
1 r2 X4 r0 n m - * @return array|bool7 K: h6 J; \) _1 d
- */
: } i& R! T5 @" i* D4 f" W - public function toDelete($table, $where) { F5 |/ f2 I. t# W G9 o
- $re = $this->database->$table->remove($where);
8 e4 {0 ~! B* x4 ?6 l% U$ {" Y - return $re;; E) W) f* Q4 d9 C
- }
: |* K, D" f0 u/ y7 g - /**
. N6 j8 h5 y% A% S - * 插入数据 L4 Q9 e1 f( S* \* ?
- * @param $table
' R3 j' ]/ T8 t& u. P - * @param $data8 r+ `+ m+ \( d: | l1 I
- * @return array|bool4 G& J2 m. _+ e) ?7 c0 N
- */9 e1 n6 H+ M& T
- public function toInsert($table, $data) {/ X, ]6 t5 P' A+ t. c
- $re = $this->database->$table->insert($data);
3 Z* O! S0 \9 h+ T - return $re;
' s7 i1 v2 } \7 t - }
) u* f8 m5 x, h0 A2 @, B- d$ S - /**2 s0 W4 Z. j* W- w4 Q( M
- * 更新数据2 D6 O* b; z' j
- * @param $table9 n0 f b% k, ?! H( ~( q7 q% m
- * @param $where+ T) T. |/ m5 B; c
- * @param $data$ I! ?3 A; s' s: k2 R- j- f
- * @return bool
6 v9 T% W8 }- H$ l; l' w! D - *// U; B. R& l2 N2 V
- public function toUpdate($table, $where, $data) {
$ u- F: q$ @1 { y+ P5 m - $re = $this->database->$table->update($where, array('$set' => $data));& k3 C# z! ]# S& Y5 w# b
- return $re;
1 @( c9 r9 ?) z9 H& t& Z' l3 T, X - }# G; U4 W" G- Y$ _0 V
- /**
3 M, U; ^) V w7 { - * 获取唯一数据
7 e% I8 [/ ?4 e$ r: [2 ^ - * @param $table4 v0 W& }7 n% C1 e8 t4 {
- * @param $key' T' D! ?) G7 ?) G( P. M* a
- * @return array* W0 c/ C2 j5 Y6 n0 M/ Q
- */) }$ c' G. Q* C# C; C
- public function distinctData($table, $key, $query = array()) {
2 c2 a0 F2 U n) B. P9 R8 D - if (!empty($query)) {/ ~, _; B' X ?+ h2 W
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);' Q2 `+ m7 e2 w1 @: Z" _ w
- } else {6 k5 X {& V4 B. E! l# C& d+ d
- $where = array('distinct' => $table, 'key' => $key);
/ l- H7 ^; ~2 S! o* W# t - }
8 l8 l( M" A4 G; @7 ? - $data = $this->database->command($where);* e6 E/ |8 `8 C2 D- u0 t/ Q
- return $data['values'];+ @! e. p% ] y! d
- }: j7 @% S r& G1 M
- }
9 T' X) k+ U$ V - ?>
复制代码 : j8 n; @6 {# @ m2 ]4 s. }
3 Z0 U8 z ]7 @+ l: @0 z |