本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。( k- C0 ~, Y$ Q/ g) n) t
模式自由。- M+ c1 G* ^( {1 p& `* b1 b
支持动态查询。& @8 X( x' J& Y% q( u; t
支持完全索引,包含内部对象。
2 b9 g5 s" o0 q5 O( v* w( y支持查询。8 L0 Z, q, m" @& ^4 u& ]9 D
支持复制和故障恢复。
3 J+ w a. L; I" m使用高效的二进制数据存储,包括大型对象(如视频等)。
4 H, n( q! {, F' y自动处理碎片,以支持云计算层次的扩展性
& q6 W+ ?& h j" v* G0 G支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。- g0 c& m- }, a
文件存储格式为BSON(一种JSON的扩展)& B6 c3 ]: w& @( p
可通过网络访问 所谓“面向集合”(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. {* S" p: b2 F
- /**
( ^5 a& {/ V4 }8 M - * PHP操作mongodb数据库操作类4 L" M, o" K e+ _2 L- x
- */0 z/ T" F# e+ c) o2 l9 t# U4 w
- class Database {: q- D! ]3 e' w! Z9 V A
- protected $database = '';
I& r. u9 C( B Q, O3 { - protected $mo;* y. A" t C" W- }
- /**: N" g1 p) a9 D3 ]+ p' E
- * 构造方法
3 g% f; o- e4 v* Q& U - */
A* }1 y8 z1 ~4 w - public function __construct() {' Y; h, A2 h" ~
- $server = DBSERVER;6 v+ m: j: M3 f7 X! {' K
- $user = DBUSER;$ S. B: y! d: o- E& o0 o: `
- $password = DBPASS;
# P+ S. O) Y2 K) g3 p$ S7 r4 ]2 ]; j# | - $port = DBPORT;
" [" X7 J- u6 `" i3 W, m9 }( T - $database = DBNAME;
/ e/ O v q0 w# ?6 _0 Q/ l# M6 d - $mongo = $this->getInstance($server, $user, $password, $port);
- y) o7 G" ^4 d& V3 O) z - $this->database = $mongo->$database;' N0 u/ v7 N8 y. \
- }
! s7 O9 k/ h3 k0 U) q - /**, _: n; r' K! A' n
- * 数据库单例方法/ }" y8 U$ u/ W' o3 b
- * @param $server! H0 b5 u, N3 |" u: @4 o( l
- * @param $user# j% V# M1 |' ^% ?
- * @param $password
9 n7 ?5 e @: n9 L - * @param $port g9 \* C7 S2 X- ^2 Y7 o
- * @return Mongo
- n6 M3 Q; {+ Z1 t8 H7 p* z0 i& i - */
( r+ f/ f9 W) a6 M- R8 S" D( } - public function getInstance($server, $user, $password, $port) {+ r- k" K! g$ e' v9 a5 @" p a
- if (isset($this->mo)) {
6 m* |; k$ ]& \" o& D' ?( Q9 e - return $this->mo;
( L% F$ r L; \$ x( K& t! E - } else {7 H$ t5 b) p7 h3 H4 s. G2 Y
- if (!empty($server)) {
1 K9 `. h+ W9 g: `6 q - if (!empty($port)) {# k7 t! \8 i2 w' l* P
- if (!empty($user) && !empty($password)) {2 \" k* T# _6 T7 t0 E4 \1 n. n
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");, i* i6 F4 u# _5 {4 Y) Y6 f
- } else {/ m4 E* t+ X- r, u7 \7 _- S1 S% f
- $this->mo = new Mongo("mongodb://{$server}:{$port}");2 @2 b" l& j( z. H8 p) x% a A: z
- }& \3 v7 y ~0 n. H/ D3 p
- } else {
" v* p; k# s8 S; G% h5 t - $this->mo = new Mongo("mongodb://{$server}");
2 E x" f6 J% |$ G; c, F - }( K, X1 U7 U. i0 Y8 X" z
- } else {
- s# D# \. h% v: W) |/ i - $this->mo = new Mongo();
+ E4 y1 u& K) K- | - }, _5 ]9 l- \. d/ }; |
- return $this->mo;1 ?) B: c" {6 e
- }9 t. g0 c4 p& ~4 w+ A3 s! Q
- }6 e9 o) Z' g" n q. y0 S, _
- /**
* G4 x; e/ F, j - * 查询表中所有数据( p* v; \' l% p% ?+ z% H2 t, m
- * @param $table2 y% k% I6 i! f7 Y
- * @param array $where
( W& X, C! `& J - * @param array $sort
! d) {5 w4 W$ q( E7 r6 | - * @param string $limit: V5 |( M1 m; V5 ^+ s/ f7 G8 t! ^
- * @param string $skip
4 [* V2 t( l h) q - * @return array|int
" A& o6 Y: e! L% b% l6 V8 T6 [; S - */
2 f) K1 A, `- ]# L; ^2 ^6 T$ { - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {+ h. T. T& ^5 c" e7 V3 d
- if (!empty($where)) {
S% ?+ J2 b$ g - $data = $this->database->$table->find($where);
! |7 e' Q5 C; t& t1 T - } else {
- `3 J9 t$ o- r( [ - $data = $this->database->$table->find();
7 k- S. ?' r- \9 j! }( } - }
/ ~9 y: g7 ?8 m* m7 Y: T - if (!empty($sort)) {
8 ]+ l# R" G* {$ A - $data = $data->sort($sort);
) r1 t5 K( |, \) G. ?3 \" y2 M - }
$ r) ]8 {' L+ s7 `5 S$ ?* z9 t - if (!empty($limit)) {1 T5 ?' T: L- v3 Z0 H3 H
- $data = $data->limit($limit);
" {/ z! K$ \! b# R4 c - }
) H7 @% g6 }& M+ J4 q/ e - if (!empty($skip)) {
" H0 t' O# y/ q8 X" r' U7 ? - $data = $data->skip($skip);
( |6 H4 r% R0 L' [/ z- g - }
0 t$ U+ V9 a, J - $newData = array();6 x0 u- g$ p* w7 k( b
- while ($data->hasNext()) {9 J* d |0 l0 [, ]; ?& W
- $newData[] = $data->getNext();
y/ f8 V* f, i* b+ w - }
' O' Y: \4 u2 |& {' [' l6 H# N - if (count($newData) == 0) {
9 c, ?6 B. c: s0 [0 ?- X - return 0;. L1 f \% s2 h$ V* Z) @7 g
- }9 u9 _3 v) b5 d* W
- return $newData;
$ Q( c! {: R- A/ A) x2 t$ Q - }
2 u/ M2 w0 c' j' d3 ~# Z2 R - /**6 }& @% ~) j7 R+ W% {! v
- * 查询指定一条数据
; d; s" R4 S, z( R - * @param $table# V# ?. o; M6 `$ l8 o; X4 S
- * @param array $where( { d' x$ n" A& j$ F
- * @return int7 m5 B5 E2 W' s7 N
- */& A* V+ w; \1 l. j. G2 r
- public function getOne($table, $where = array()) {& J! f: Y5 O; S: _$ I; o* x
- if (!empty($where)) {
0 X6 Y+ t: {4 L - $data = $this->database->$table->findOne($where);
) j' w6 c3 e% q. ^5 ]* w+ ^' { - } else {" F6 I+ L' k4 e' r1 b3 T- S% v
- $data = $this->database->$table->findOne();8 V2 V& m( t; X
- }
# [& g/ ~, P8 f: c - return $data;+ ^2 ~! G" y% O
- }! m/ X0 Z9 H1 U! I7 R. v+ Q
- /**
+ ]% s8 I$ ^/ r1 b* D" S, Z - * 统计个数
* p. F$ }1 D# _" Y6 v - * @param $table5 y" d( h- m' Y, x1 w
- * @param array $where
, W s2 e7 G/ q! X; G; J9 @ - * @return mixed
# t- K3 ]& T( A( p - */, }; v% S9 q5 D# f: L$ W
- public function getCount($table, $where = array()) {
' }& A, T% E9 N2 v - if (!empty($where)) {! F6 p/ y& Z3 m
- $data = $this->database->$table->find($where)->count();
; X: H) \% l7 F0 \ - } else {
- q+ S8 h- B! k6 I8 y! f- A1 E - $data = $this->database->$table->find()->count();7 d+ w7 H# I8 b& y) x3 c
- }! d8 V+ t, L r) a G8 s" q9 ]. J
- return $data;
: Z% t0 h2 z; @0 } - }
0 [, {( Z# Q/ C/ e, Y: r t7 C - /**4 X8 m: G: s* ^6 z, y) C
- * 直接执行mongo命令
+ p# `- {' B4 Y7 m - * @param $sql ]* g X0 u8 Y" t' Z
- * @return array
a% S) n$ Y. ?! x$ D6 B* q - */
' |1 M7 [; y( [0 X6 v* Q - public function toExcute($sql) {7 E: ^& F F" w; z8 S
- $result = $this->database->execute($sql);2 R. n' w- U9 G3 M' n
- return $result;# j4 h1 I3 i2 G0 ~% P: B6 \
- }$ V: V+ E; x# W: J% S" Q& k6 |
- /**9 u7 E, [, x4 _! x! h5 m/ v' j! J
- * 分组统计个数7 d9 C4 W& p5 z0 U" f
- * @param $table$ S3 R D7 N$ J
- * @param $where
' r" Q0 Q) e' l# Q( H& z - * @param $field$ i6 r2 r3 P6 f3 r
- */
4 a2 E0 y) V3 V - public function groupCount($table, $where, $field) {
: {1 h9 _7 U X9 H% b. H2 N2 Q9 i" b - $cond = array(: a% l3 \/ m) X' M( k0 d5 e+ X
- array(# j9 e5 o' S1 h9 o0 R, h P7 y
- '$match' => $where," U8 e8 K( [+ V# n# {1 u
- ),
+ U; o$ l8 q; K2 g- P/ A - array(' x$ D( {6 n* N' }# F- L
- '$group' => array(
+ n& h: R# @/ e0 k4 s0 n - '_id' => '
# E4 i, o7 d- n: T+ u* h/ i/ l
6 d+ [6 p7 U, k1 r9 `: Z" U- . $field,1 ]5 V* b' o2 {5 H- y9 ^
- 'count' => array('$sum' => 1),
( w# x; a- O$ x7 J! a7 A& P - ),+ h. g! m9 k/ o
- ),6 U9 j+ B. }* b% {
- array(
" E* o1 ]$ H. z8 O/ K8 ?6 F o - '$sort' => array("count" => -1)," \) Y, L0 [9 g9 q: h
- ),6 ?& |; U+ ]& F- K3 J/ Y& [
- );
2 f( }0 u9 i6 T4 _ - $this->database->$table->aggregate($cond);* c, w! H* j# Y& G% b7 }
- }
6 D E+ ?3 B0 x% r8 L9 E - /**
5 z {& C) s, D/ v: r8 G4 Q - * 删除数据
7 X0 w7 s7 x! a2 U( n/ m - * @param $table4 V/ S4 C. J& c5 C, f- E0 H: H
- * @param $where0 i' W8 t. T" B6 J" f1 d7 b3 j9 z
- * @return array|bool1 f: q* s% D E1 `
- */2 s9 ?- S# O8 @) C
- public function toDelete($table, $where) {
6 b2 B, C# h1 W - $re = $this->database->$table->remove($where);2 M0 o5 e) ?* ?5 H p& C) Y
- return $re;
' m$ z) a9 q+ k) A* Y3 H - }
3 j$ [ p( w. N% n* F - /**0 }# R* |) c3 v3 c9 u
- * 插入数据6 C: t! J& t5 j$ B
- * @param $table) W [3 ?6 F4 o) r- W
- * @param $data
' S1 F! K6 S- N, D; P$ i - * @return array|bool
* L' j- p' w4 }- ^4 q - */
* |+ x% \: p1 F0 ~0 e0 y' P - public function toInsert($table, $data) {8 ?, B5 f' C, A
- $re = $this->database->$table->insert($data);
) y! c1 C6 E, }: _% {, {3 L- B - return $re;0 y s6 E, j6 o* m, ?) ]/ N: I# |* D- O
- }
2 x. N; i! `4 p& K - /**
9 d* g7 j' G4 b) r# w: L k; @ - * 更新数据8 i( `& D: A* a/ W
- * @param $table9 k! l" g$ b3 r2 v6 l
- * @param $where
$ g2 X: q) v8 Q - * @param $data L F( w# w j; i- y {
- * @return bool
* F' G+ n8 Q/ @. q - */" W% V% r9 ^% C4 g! A' _$ ^
- public function toUpdate($table, $where, $data) {2 k5 X8 X& \! ^$ w
- $re = $this->database->$table->update($where, array('$set' => $data));, k# n/ E" E1 c
- return $re;
3 v8 O, ?. r6 e* |* F, Q8 B/ a# A - }
! o7 K" n) v* z5 |/ h8 D5 A - /**0 @! o6 F! E- T0 g# L4 G. [- c
- * 获取唯一数据. W$ N/ f0 \9 }7 k& F$ t5 |! n2 v3 k
- * @param $table8 c! g+ {8 G9 B! @
- * @param $key# o! ^1 V* i0 t5 s1 S- u8 d) H) n
- * @return array/ l5 a: j7 J+ X
- */
K7 g. V: D' @- ]) T3 r5 R - public function distinctData($table, $key, $query = array()) {1 g6 s V1 Y/ i4 b
- if (!empty($query)) {
/ L8 N1 H) ^9 z7 D4 p# z - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
- o$ H! l- {% s/ i& @ - } else {
' _0 [, F7 F# z - $where = array('distinct' => $table, 'key' => $key);. E/ W: @4 a6 }6 m* ?
- }
& E* x: g+ Y. W, f2 U" F* T9 [ - $data = $this->database->command($where);2 h1 v9 Q5 u& L0 a: _% P
- return $data['values'];
9 j3 Q: j/ d% g9 N+ i - }
4 C( I4 w8 g1 X& ` - }; E: O6 q# J, o( _1 T
- ?>
复制代码 4 t+ l7 A I& M# C+ k
+ a" Q/ m. k' g7 v8 D# C |