本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
2 p; S$ i5 u1 T2 U4 }4 S" X模式自由。: m+ t- j V: Q# H5 |
支持动态查询。8 y7 A8 Q7 m" ^& o
支持完全索引,包含内部对象。
/ D( @& x0 n! Z( o: R0 |支持查询。, t7 L! ~: N3 f2 r' u& }5 T
支持复制和故障恢复。
0 P8 W% S. N+ j+ Q0 H, H/ Z使用高效的二进制数据存储,包括大型对象(如视频等)。
$ w b( E0 r3 F) f* o' `7 E自动处理碎片,以支持云计算层次的扩展性$ V6 a# j% ~& T6 K
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
2 L$ A+ _: L7 E; p& w; b& K4 b文件存储格式为BSON(一种JSON的扩展)
; ?; p1 _# H+ R# ]6 i3 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) D2 b3 P( U9 T5 |! D
- /**6 ^, S v% U' n* f0 I7 ^2 m
- * PHP操作mongodb数据库操作类# f7 \/ s/ H4 U
- */
( Y9 g. f9 [; @+ p - class Database {: x' e1 T* z0 G' a
- protected $database = '';
9 T+ r4 D: N1 K' d: o - protected $mo;/ P* z# o! F. C0 f
- /**
( @+ ?' w$ C9 ?8 q3 O3 g - * 构造方法
1 G X6 P& Z+ q! | - */
3 e5 f7 q1 s( |8 J# W - public function __construct() {% D0 r2 ]5 i- t) u
- $server = DBSERVER;* l9 G ^4 T/ R* E3 q0 ]! o
- $user = DBUSER;
) f! s4 Z- l/ g1 } - $password = DBPASS;. I* S5 ?, s. g2 N; y
- $port = DBPORT;
3 w0 y3 a1 C; G - $database = DBNAME;/ M0 V1 _' ]- S7 d
- $mongo = $this->getInstance($server, $user, $password, $port);; ^6 Q4 w, T5 i: l
- $this->database = $mongo->$database;) Y; s9 Z+ j, a( _
- }7 y- k4 @7 M; S, z- E- s
- /**. F0 T5 d0 {6 G& `- s' l
- * 数据库单例方法
! }8 {+ M8 m) q6 t* W8 e0 I7 ~ - * @param $server
; [1 i# w/ F: U6 k - * @param $user
6 S) z5 D, ~- E - * @param $password
2 H% d/ `; X, \. T x! |4 e! c - * @param $port
! T9 _5 d: Q6 @! u. d- L; e - * @return Mongo
7 y/ {1 u7 p6 H, D( F: W - */
, X$ ]. y6 f9 l8 a5 X: M% h - public function getInstance($server, $user, $password, $port) {2 n4 U8 v7 _1 U5 H z
- if (isset($this->mo)) {3 M9 F) s) ^0 q/ V/ L) |
- return $this->mo;
) D( s! F8 z% ^- F - } else {6 Y" z- F5 ^ B- w' F
- if (!empty($server)) {
6 }6 y9 D) F6 c$ [1 L7 j i - if (!empty($port)) {
/ n6 Z' s) b& w0 Y9 b( y5 T - if (!empty($user) && !empty($password)) {
) a7 U: f( J" n) r& c! [; l: h - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
+ E1 n0 V/ R2 q; ?" N6 V* [ - } else {1 q8 n& l* J, T
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
6 e0 T3 n' C. K- Q7 ]+ g4 o - }6 C- E1 t; L1 _: b; q
- } else {
. K8 m2 Q+ g$ }# Z% F - $this->mo = new Mongo("mongodb://{$server}");
; z/ U- _: W: O3 I6 ?; k" z# H - }+ _5 \# D+ t4 y& C! ]
- } else {
, z& f: p5 J2 P- ]* h7 x - $this->mo = new Mongo();' Q- u4 R7 D' `% c1 Y( Y( n4 d
- }" c X8 X" u2 |9 N( N) a7 x
- return $this->mo;9 f; R/ ~0 w0 A# T P% J: N# Q
- }
/ m; m$ U/ U' D - }
0 ?, q6 M7 C' f - /**8 [" N' U! J' X
- * 查询表中所有数据$ s+ p* f8 U$ T8 U9 m) X
- * @param $table: m( h8 N4 @/ h3 k' G: j. |) N
- * @param array $where) h; `, w o) ~- T A6 L( h/ p0 S
- * @param array $sort
4 N6 `, J" g$ S, l$ D6 c& q# z - * @param string $limit
6 q. y( B# W1 Z - * @param string $skip
! u7 L) W( S( P/ ?# D' i W M; j! F - * @return array|int1 R$ K+ l5 p2 A/ X
- */, m' M$ V3 m( D0 d8 W+ k7 a
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {" v& Q% o. H% ~) J* o$ D
- if (!empty($where)) {
2 ~6 V* @( K% e9 w4 J1 I+ i$ U - $data = $this->database->$table->find($where);. @& _# m E2 j; j1 I
- } else {
" ]" }: j; e) ` - $data = $this->database->$table->find();/ i& b2 U+ v, C
- }9 U9 D" Z3 A, e+ H/ J" A4 k
- if (!empty($sort)) {
6 w# X! C& v1 e' U3 X& R' [; [6 R9 B, r - $data = $data->sort($sort);
$ O) Y2 u6 P! g N7 M5 C - }4 `+ \' g2 z2 Z& O
- if (!empty($limit)) {
. }6 x/ |4 k* a( Z0 \0 C- ? - $data = $data->limit($limit);2 p c' e3 }0 F' V, ]: h& z
- }
2 Y4 q/ S) M) w% o- _# k% l - if (!empty($skip)) {
! m1 |( G1 o5 _% Z$ X0 F' K5 z/ J - $data = $data->skip($skip);6 X; e( R3 j) g5 C$ v A# ?" }$ G
- }$ S7 U1 G( r, Q6 g b m' @
- $newData = array();
5 I0 w k* \2 r; Z3 M& D5 D - while ($data->hasNext()) {& G1 Q% y+ l; O3 A5 E8 {
- $newData[] = $data->getNext();& K2 F# r+ H5 y$ a. ?& A
- }
6 \. i2 N, E7 J - if (count($newData) == 0) {1 L) T( L( d9 N( F: \& P
- return 0;: y, f; w. I+ m H7 V
- }
- A+ M1 Y. y1 ^9 j, F - return $newData;+ d _% H+ X( R) C/ f9 o
- }
& ?+ t* Z% _8 k# g( _0 u3 I) Q - /**/ k: ]0 I4 i( L! X
- * 查询指定一条数据' R' {+ r# B2 U
- * @param $table. c% V. q$ W- ^8 p& K9 \0 r
- * @param array $where' w9 o' s6 L. X" ^" f2 o7 T
- * @return int
( v7 U7 l% z9 h9 g - */
7 Q+ E O) u: H) c' _, C* R - public function getOne($table, $where = array()) {9 D% U( l+ o9 S. ^( q( Q
- if (!empty($where)) {- D9 M1 M+ ?7 c" V2 ?
- $data = $this->database->$table->findOne($where);
+ L2 M4 i& B- w/ i5 ~ - } else {
: I, y5 i- ]- ?3 @ p* I! ^ - $data = $this->database->$table->findOne();" u* M0 T! Y6 E! j9 _0 l+ {8 A
- }5 [# S8 M( P" p
- return $data;
$ y- h" ?$ m0 ?4 m; S" Y+ |* G - }! G3 \7 ~, u$ U/ R
- /**/ Z& n, y2 K0 {) H: L0 ?) B3 A' @2 }
- * 统计个数
; f& q9 \" i* z% A/ v3 z- {) i; e - * @param $table
$ k9 Q. ~/ {7 z- L: w - * @param array $where) |" B: v1 k! z, p, p- {
- * @return mixed
8 @) G. W! Y! z6 b+ K+ } - */
/ ^3 @3 y! d2 H - public function getCount($table, $where = array()) {
5 S1 c* ~% p- z& { - if (!empty($where)) {/ c1 h0 D( t N6 M# M* X6 ?: t
- $data = $this->database->$table->find($where)->count();* V6 y# A4 l8 k# m! h, J0 U
- } else {
# k/ M' M9 q- m1 Q - $data = $this->database->$table->find()->count();+ J0 v- z) _+ _
- }
7 o6 U' ] y( I# f; G* |! P - return $data;
4 t, O; h& D! Z* Z - }9 O# l- S ^$ r' y" ]
- /**: I* C; b* y8 E' Q
- * 直接执行mongo命令+ D5 G9 t3 U4 A9 L2 X
- * @param $sql2 k$ S5 c* D: y. }5 i3 b4 x
- * @return array0 Y# j( v) e7 Q" I! g! K
- */
& A4 \& V& h$ o- m$ k2 T+ v4 F - public function toExcute($sql) {
. Q. W$ k" O: w @% ]- i# D - $result = $this->database->execute($sql);) E0 ~* w5 C6 n5 D2 G7 d
- return $result;, D& ^1 m8 H( a1 r. }5 s" y4 P4 U
- }
5 Q0 c% Y# V2 J3 a9 S - /**
$ d: W/ g# b4 w& k - * 分组统计个数. [7 h, E' B4 x8 b9 n& Y( ?
- * @param $table6 c9 M# Q, @- i
- * @param $where) A! @$ H- J% {* b1 X3 p
- * @param $field
9 z* K- b; D7 |3 d - */
9 A+ q: [& k# k [+ q - public function groupCount($table, $where, $field) {7 f$ Q' T4 M) C- Q) y" d/ g0 C6 B& D, N
- $cond = array(
( }; b1 P- D3 c: P2 Z6 J - array(
* E/ F4 p0 |$ |2 n8 t; ^5 @) X$ ~ - '$match' => $where,7 D: q4 Z) u- O8 C" p
- ),6 U& o& S+ b9 N4 u+ y7 V' g. x! M
- array(. I! O! ]6 {; u' ?( O# e
- '$group' => array(* l3 g1 u! o9 S0 S* L* \& ~
- '_id' => '
; C* J8 q. S# d# ~! s - 7 Y1 ]) G$ e. v
- . $field,
+ p U5 M5 b! T1 | - 'count' => array('$sum' => 1),
; h G. g h1 H0 e - ),
0 A1 W0 ~- c! K5 z0 j - ),
, m) w: Y+ B% n$ g% q6 j9 Y4 m - array(
( i4 E* {$ k6 V5 d6 W - '$sort' => array("count" => -1),% F6 v4 A" J) {- Q
- ),, |1 ]& O# o( O0 p- @* T! u
- );
( b) z+ j1 ^0 Q' }# d: e - $this->database->$table->aggregate($cond);
- p- R4 Y: z1 T- z; d& e% c - }
" W ^& `! s: D: _ - /**
& F3 K7 Q& q3 o% w& ? - * 删除数据
$ j0 k! u8 o) p7 ^ - * @param $table; s+ p; F4 q, ?" h& f) u
- * @param $where0 q1 U. T0 o u4 y
- * @return array|bool
3 g* n0 C: j. f S - */
8 ?" n& \& d O8 z3 F' m5 I( s) I - public function toDelete($table, $where) {
5 @4 s7 a& @# [1 Y" }% Y - $re = $this->database->$table->remove($where);* l' s$ z% L3 y( ]( P* g i: `
- return $re;
, t& { k: S, }) A3 m" X! Q4 N - }; `5 S3 k" S4 c& l! ^3 I
- /**& X: ?1 D b$ p `, y' h
- * 插入数据
! x2 y' I+ x) d - * @param $table
2 ]: R+ }1 T) I5 G9 T" Y - * @param $data
& M& D) E \9 E - * @return array|bool
! D7 M1 L, e) A, a- g0 [& \ - */
0 K- o' G4 f9 O _ - public function toInsert($table, $data) {* X- L j" o Q
- $re = $this->database->$table->insert($data);
* o" T/ `9 U- r6 x - return $re;
8 h1 d* W% L6 `7 Y# [ - }( G6 y: k0 e. d' H; G: H
- /**
- g& ~3 R, `; [ - * 更新数据
+ O/ V( Z3 w i8 U* y/ c3 O - * @param $table
4 d) D, Z0 Z$ ^: K7 w - * @param $where# L0 b8 ]& ~% i1 W2 V4 a
- * @param $data7 H7 @2 W3 G' D& ]& W0 E8 i
- * @return bool5 b# t/ |/ s! g( X( X5 w" @) K
- */
6 `! d+ X. e! ~2 Y - public function toUpdate($table, $where, $data) {
% R/ y3 ^2 y, T4 T - $re = $this->database->$table->update($where, array('$set' => $data));
: d( W2 [& P/ h. X3 {5 f& ? - return $re;
2 @* n: @. Y! k/ e }; u5 \ m( y - }+ f* y" _! P# ?% W" D, v, ~
- /**
6 l* c( x% B! L/ D5 @4 K* k - * 获取唯一数据
2 K: G0 Z. m" q( j/ L% @( ? - * @param $table
: s) j) u! K4 X" { - * @param $key/ z6 T, B% T2 r
- * @return array
0 E- V1 g$ U. Z% e- {9 K4 o - */
! y8 \6 I5 ~) f6 v! N) C% C& e - public function distinctData($table, $key, $query = array()) {3 m2 `% L! E/ S0 Q3 H
- if (!empty($query)) {2 Z {. e0 q+ c7 V% D& [
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);" I' y7 m0 t2 @' B$ }2 P1 X
- } else {8 e6 P9 M" }; c3 O9 p
- $where = array('distinct' => $table, 'key' => $key);
/ M# y% E8 A# N, t- P' ] - }
* z: v5 n6 Q/ d: z& k' h, ~- { - $data = $this->database->command($where);# C$ j6 ]7 G* o% L) a7 [: c- ^
- return $data['values'];) X( W$ Y5 P& S( `
- }
. r8 O& o9 T x- _" d) w q z - } `0 t$ W+ t" L9 |8 Y
- ?>
复制代码
. f2 \+ J ?, I3 j6 h/ n
. n7 C3 R" X- f6 F3 _ |