|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。. Q+ t3 Y7 k0 f9 Z
模式自由。
$ Q* z, m. i! J支持动态查询。
& r d/ n3 p5 P& \支持完全索引,包含内部对象。8 R# B0 K3 E! Z: D( W
支持查询。; k. E( U, X' h3 s
支持复制和故障恢复。
6 ]& k- I6 j# T" ~2 F使用高效的二进制数据存储,包括大型对象(如视频等)。
; l8 ]3 [2 |% @ \7 A自动处理碎片,以支持云计算层次的扩展性
9 E/ V9 k3 ?3 r2 H* h支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
4 @/ H( M; ^; O: b文件存储格式为BSON(一种JSON的扩展)( x5 a5 j( G3 l6 R, P5 t) K
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php9 n- h) ]) l' Z: O) I H
- /**
5 H- w7 ^. q, O - * PHP操作mongodb数据库操作类( F x Z1 K" u1 l" z
- */$ I- G# V8 d5 {2 V; w
- class Database {4 u7 p+ N f0 i0 g+ A1 n# b' F
- protected $database = '';
( \! U6 W3 s: P+ m - protected $mo;7 i4 p, v6 a9 D$ e8 Z7 w! L
- /**
* u ]) m, o. F5 { - * 构造方法0 f; d: F* ^9 m- u% E. S, Q
- */
9 c0 L4 Q9 X1 h6 G2 P6 n - public function __construct() {( c2 E2 f% _% W' u9 Y7 t5 m$ N. i
- $server = DBSERVER;7 Y n, O9 s- }6 `, c
- $user = DBUSER;
" c8 {! K1 V, S @ - $password = DBPASS;
" A. d' U# P: }" U - $port = DBPORT;
- c+ X3 H% ?2 v& t @" m - $database = DBNAME;
9 D" h a: c" V( p) x - $mongo = $this->getInstance($server, $user, $password, $port);
0 E% M8 y8 U8 ` - $this->database = $mongo->$database;
1 q7 D0 ~$ E1 q: }$ V/ P0 l - }" B r# m8 k* c* g" u
- /**
7 J. ^/ O" b+ @( ~# F) H - * 数据库单例方法
9 r, W, |- D3 i* c3 Y/ o2 Z7 M% P' U; G - * @param $server- M# S) f; h* b5 [* b9 ]. ~
- * @param $user
& i/ y! m# S: i! _5 {9 F - * @param $password5 i$ O5 Q7 b8 b7 g* I
- * @param $port' Z8 \3 Q+ @" a9 W' ?, a6 \) c
- * @return Mongo
3 A* E; M3 R; H9 W7 b - */
( Z* v0 h' h6 W( T) k/ t9 g$ D7 a W - public function getInstance($server, $user, $password, $port) {. e0 E z1 u' H3 K$ r
- if (isset($this->mo)) {: r8 f" Y3 Y' ?
- return $this->mo;$ e: F/ ~: Z+ Y
- } else {
7 o( B% V" t; _5 c+ P - if (!empty($server)) {
5 `! Q f# M8 C/ [/ y; _; I) P - if (!empty($port)) {
) p; S* }6 B* x' e% H0 a - if (!empty($user) && !empty($password)) {
9 m6 R( K O- U7 r! X9 l7 \ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");, h- I# d! d3 b, Y4 T% m
- } else {
, C& v( s2 R6 K - $this->mo = new Mongo("mongodb://{$server}:{$port}");
& Y# l( L, {1 ]7 r' u% f - }
' p4 B: v! X# a* m. c7 y9 X - } else { r: S4 e h+ I; @: o
- $this->mo = new Mongo("mongodb://{$server}");# x& z/ m. H1 O. s& N p/ ]
- }, t, K6 y; y) N" e z0 L) H; r6 A8 F
- } else {
U h% F" l0 _6 n1 S- ? - $this->mo = new Mongo();
9 n4 g0 U& Y4 _+ v8 C- r8 Q/ c) L6 r% a - }
s( L: P) ^! l$ H) ^+ I0 z - return $this->mo;" y7 i+ Z! ?; u9 K% i
- }( R% b* N% K" X
- }* c* K7 h- A5 G( }
- /**' p+ y5 D& g0 K) C$ A
- * 查询表中所有数据+ a6 `: X' S, _5 g
- * @param $table
+ K! R; T0 a6 Q1 H5 n: N - * @param array $where
4 M* r" L5 i8 w3 w R - * @param array $sort
8 y" l2 l& R: _$ z: Q5 a - * @param string $limit0 ?4 F4 M6 ?3 a K
- * @param string $skip M. G- B j$ O; X+ P* t' ?" E: b' D+ D
- * @return array|int
' w' @ W1 e5 o1 k/ H! S$ ]* R2 h - */& ~" x Y, i; S3 }
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {# ^# p8 T/ k6 } S- k8 C
- if (!empty($where)) {- p. h& y9 a5 e
- $data = $this->database->$table->find($where);
- P# K* @2 @; z; f) r - } else {
* N7 R4 u4 G* Q0 v$ J% a+ k4 f - $data = $this->database->$table->find();
/ n5 V( m2 s4 b - }
! c. r. @& T- h- p6 ? - if (!empty($sort)) {
1 _' E" n- i0 G - $data = $data->sort($sort);& q" E9 w7 k! ^
- }
, q) k; [/ ^1 R - if (!empty($limit)) {
7 F' Y& ~$ k# m5 a4 P - $data = $data->limit($limit);# B3 W9 o& Q7 k- y. d1 H9 R
- }+ n6 Q+ e4 M: {: y
- if (!empty($skip)) {
* d' d* E, H* _* K' s$ Y$ |# J - $data = $data->skip($skip);7 b& n5 @1 a! M
- }. `. M6 @" t5 r3 S# S$ {
- $newData = array();* G+ ~6 S& s3 }: _# u3 c; {
- while ($data->hasNext()) {
, {; b& l9 E0 l2 X% C7 p, p - $newData[] = $data->getNext();
Y5 S7 i2 f& \$ I- X0 D5 m+ A! O6 S - }& C- w1 {* x" I& N1 n
- if (count($newData) == 0) {
1 R0 F; T- \! u/ \% Z' d7 C k& V - return 0;
+ B9 {& }* b! A - }' u9 ~+ ]: R2 g
- return $newData;2 R0 B {$ t0 v5 f4 ^ C
- }# r! ?* |" D; U3 s* X2 L0 ^- c
- /**
' P$ H( Y& r! ?) ] - * 查询指定一条数据
! p0 d0 O9 @. Q8 g - * @param $table
0 M6 P* n$ ]7 U- U2 l5 O - * @param array $where
$ s+ I) z( Q6 a3 c - * @return int9 `1 _$ g, D! \& \0 _$ Y) S
- */
5 o" V7 u" ^# w/ G- T - public function getOne($table, $where = array()) {
/ P6 A# r$ y3 K2 u/ X. z) N - if (!empty($where)) {
, Q) x) S& {( ]9 L) g' [ - $data = $this->database->$table->findOne($where);
* i; T: h/ N6 i$ O: M - } else {
, ?3 G) Y$ C( P: l: l8 i - $data = $this->database->$table->findOne();& }4 u s) w8 j
- }
% g3 |) |* F! F6 {6 O9 H T q - return $data;
0 X1 @* R6 t3 i+ v2 s6 P v I3 O - }
! L" j6 i* {9 O7 E: F - /**# I3 h% a! S# y
- * 统计个数4 u7 C5 r. E8 v- m
- * @param $table
* \9 `3 {. H T1 E2 p - * @param array $where
) f( x. h3 r$ x& x; p8 a - * @return mixed
* V, Z: a( {% a" |/ E2 a( z - */5 e y* l8 {% u% Z$ q
- public function getCount($table, $where = array()) {! ^5 J& z3 [' l, o( T% _6 R; l
- if (!empty($where)) {
1 o3 w9 @) j6 }3 a c - $data = $this->database->$table->find($where)->count();# p( e$ }) y; B* r! T; q
- } else {
. ^/ `# @; s6 c" T - $data = $this->database->$table->find()->count();
+ N4 ]; _" q5 A- H - }. m& A3 b7 c' s) A
- return $data;& q2 I2 F( n: u, Z; |( s
- }/ J9 a {" N9 O8 @! \* v4 f
- /**2 S( ^& P0 M% O3 X& Q; F) D3 Y
- * 直接执行mongo命令( L$ C! ?3 U; l" u9 w
- * @param $sql
# D( B! G: r0 d8 j$ }" d( S* C1 h - * @return array6 S5 s/ A2 j+ _$ C2 l5 T7 C
- */
$ t# j" g0 C, I8 t& f - public function toExcute($sql) {
$ I5 k% k0 B |6 P - $result = $this->database->execute($sql);
! m" s# z, U8 S4 d# V* N, d - return $result;
" ~! g" D6 N" [3 Q9 q4 L - }& K8 v/ _; i+ [5 ?. j* Z
- /**/ W. L6 O3 `" m( h; d) m3 w
- * 分组统计个数 H1 N( j" X' q7 N6 L1 X1 _) O/ b
- * @param $table
' u3 u) U" f0 h' v& ]# f- A - * @param $where/ d C6 E9 w7 a m, R2 a) i6 [
- * @param $field% d( i# o# t! t3 u: `; {( {
- */4 D' A* H0 P% [1 q
- public function groupCount($table, $where, $field) {+ J# o; t% O5 M
- $cond = array( Q" c7 U# X9 _) L
- array(
4 `: k* i6 R: y3 @2 G - '$match' => $where,! B8 L s( Q) \: d! ^
- ),
0 T& y6 v x, V3 g3 J - array(" _# c! |& H& ]- M
- '$group' => array(7 H7 r+ w& R$ L" }
- '_id' => '* K: |2 C* y8 N4 Z; V8 \2 n, m1 F
- 7 q8 X4 H) l4 t4 y
- . $field,
& d8 E! A0 _, w% ?; D - 'count' => array('$sum' => 1),) p5 |1 ?2 w. D; j$ e. ]
- ),5 t; P/ X3 l) b8 `, h4 z$ |
- ),# n- z: b, q% n' [
- array(
7 C& {. a0 U! f% C% y: Y - '$sort' => array("count" => -1),
% S/ ~8 d+ p7 o - ),2 r' T) Q+ ~& `/ Y/ p! v( C; `
- );
p( u$ Y9 ]; [2 e% T - $this->database->$table->aggregate($cond);
% c4 r8 q; B% @# Q - }" T% ]/ y' M0 a" ^9 M7 U1 u5 {
- /**8 l3 O& X5 q+ s4 G6 Y2 }
- * 删除数据* }7 S2 r. Z) l' i
- * @param $table
6 p; c2 w+ p5 _ - * @param $where: ]! o3 D7 q; R; l( _, t1 G
- * @return array|bool- y4 M5 S5 x/ @0 Q
- */
9 L6 R3 N+ q, I3 | - public function toDelete($table, $where) {" s. S7 _) \0 u- P; t* q( r
- $re = $this->database->$table->remove($where);5 t! f4 Z0 F$ x
- return $re;8 G& U. K1 B0 c* M$ n$ c& O
- }; A( l1 j: o' I/ h
- /**
4 [2 B. j4 n0 I, x) V- Q8 U: M - * 插入数据
5 E) ]9 w# ?9 H/ D W& f( Z+ ` - * @param $table
4 @. m: P. W% c" e/ n3 ~; Y* w - * @param $data" a+ y$ i/ z p+ \
- * @return array|bool
8 o6 M, m' a) M& s& i; o# _" f% [: R) s, G - */* p V! b: \* J5 o
- public function toInsert($table, $data) {
$ c, s& H) `: u4 p5 x% p - $re = $this->database->$table->insert($data);2 g# F$ `9 F- w
- return $re;$ ^& ^* O, x0 J9 H
- }
3 T2 P( R) d# Q% F8 z - /**8 X& S# a* W5 b M7 p
- * 更新数据3 Z: j$ A# \1 L: z
- * @param $table
/ O+ G' y! o# D0 V - * @param $where
' ], p& ~! _ t- C$ K( q- w - * @param $data; ^- @0 n$ V0 u8 Y& g8 n. ~
- * @return bool
# e$ u' z7 W0 c& ~/ r: f7 p - */8 e# ?. O9 J' ?, I6 W" K
- public function toUpdate($table, $where, $data) {
, _; }* g! U8 s0 V3 e: f: ^4 Z - $re = $this->database->$table->update($where, array('$set' => $data));$ V0 X( x; e7 V. X
- return $re;
6 I6 ~; S* ]$ B; F8 d - }6 U/ V# Q7 J0 ?; s* c
- /**
" x3 w* Z% `8 d& p/ B - * 获取唯一数据
* i; o' B1 p2 \# e6 c# [ - * @param $table
" a6 j4 l2 o' C# h: ~' h - * @param $key5 S2 F& t5 ` X: O9 K% f
- * @return array
4 h8 L1 h$ G Q. N - */
S9 K* I# Y, g# ^) e* V& t - public function distinctData($table, $key, $query = array()) {
; N" L; I* R8 {) |/ ]4 j( g. @+ ~/ F( ] - if (!empty($query)) {( C4 Y, E# T+ c. G0 _8 p
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);, r+ k) x. H4 M; ]; |# ^
- } else {
+ T7 A, v9 p' Z- f# c' z - $where = array('distinct' => $table, 'key' => $key);
6 e# }( h- z' y' P - }8 D7 D! W3 i* f7 i
- $data = $this->database->command($where);
4 k9 R5 B+ r' _ - return $data['values'];
9 W }2 A" \" O - }! a" P0 a7 m4 j! D: u+ e- m9 h/ O7 o
- } y6 h) y- F) i4 b
- ?>
复制代码 ! ^7 Y2 U5 A0 W
: s' b! j: G: x& J! c! Z5 @) G* Y |