本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。% {5 d1 `* f$ y! e8 B! L x
模式自由。- d8 p% i) o1 K) V2 U
支持动态查询。/ G( [5 A0 ?4 F
支持完全索引,包含内部对象。! p: }" X5 w8 L' D6 Q0 L9 A
支持查询。0 y7 e$ u* R* ]% L8 u/ s
支持复制和故障恢复。6 A8 k! y6 r5 O( }6 H1 R
使用高效的二进制数据存储,包括大型对象(如视频等)。' Z6 X- s7 H9 j7 Z
自动处理碎片,以支持云计算层次的扩展性
% ^0 z5 o1 ~ d7 C# q. k5 N) m支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ j$ F- e% o$ L( V7 Q/ V文件存储格式为BSON(一种JSON的扩展)1 t; q7 H g( n* v: d6 D: q
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php8 }" D6 R, G% U4 C' i
- /**
+ M0 W) h1 v! Z. K$ x6 H - * PHP操作mongodb数据库操作类
' D t' n7 I: C# V - */
! L8 z: l X. Z3 \& L1 H6 ^ c5 a - class Database {
+ w+ ?! h3 G9 D1 `% |" k! { - protected $database = '';6 L" K G/ f$ ^2 p4 {
- protected $mo;2 w% O! s. W" U, G. J( B' C
- /**( j9 u4 n; M0 B
- * 构造方法% N& ~( A0 ~' P. s) a
- */
/ p( O# d5 Z8 `( a, W8 S - public function __construct() {
" b$ ^5 V- @$ ` @2 o% R, N2 ? - $server = DBSERVER;
9 x, D* P' O8 s7 D; i' c - $user = DBUSER;3 y3 O2 S5 ?. J5 c; Q- ~- B
- $password = DBPASS;
! K' i+ n! Z* B i5 }/ o5 ` - $port = DBPORT;% u9 F/ }& U9 r7 i0 H9 G
- $database = DBNAME;: V/ i9 X& ?: S1 j8 q% y9 Q
- $mongo = $this->getInstance($server, $user, $password, $port);2 H. r. Z- m' ]! E( X- ? v* `
- $this->database = $mongo->$database;
: ^. v9 b2 ~' `) g# r9 f - }" N+ u+ d/ s }" j f( L
- /**
5 z( o# I, ~% x* E; u - * 数据库单例方法
7 N0 a# e. H5 d6 r% X2 n - * @param $server
. j: N9 f/ n. h+ a$ g- R - * @param $user) b7 L7 A9 w. I5 |/ A
- * @param $password
6 K& V+ `. G) a8 Q - * @param $port
! h3 s! b5 I6 L8 R2 o - * @return Mongo4 j. ~1 m7 o- |) l; J
- */; Z- B6 h/ [! {' ~& s6 y
- public function getInstance($server, $user, $password, $port) {8 N, h! Z7 D9 L) ?
- if (isset($this->mo)) {
/ z9 E8 A4 ^. k" p4 ~' t - return $this->mo;
) T: a* m3 S$ D% x2 o- w - } else {
m% G2 H; Q1 \5 d; H; _7 N: v - if (!empty($server)) {2 f' k- B- t: g
- if (!empty($port)) {
+ Q% q3 Y: c w - if (!empty($user) && !empty($password)) {
! E' @5 ^: U* v9 v4 V - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");; H& G) s( F6 p; T y3 d
- } else {
+ f9 f( q' W' X9 [9 Z# B - $this->mo = new Mongo("mongodb://{$server}:{$port}");# x6 A: p& @- i$ F: A; M: P
- }
2 i0 [" E0 S( l: l m - } else {
6 w; O- M# S ^! g' a+ [5 y2 J - $this->mo = new Mongo("mongodb://{$server}");$ p/ e8 k5 {) G( ]8 b2 d
- }' x. k0 [+ W) E4 |: c6 k$ X( O
- } else {1 T+ R. C2 g7 H8 d0 v# S* s1 w: F
- $this->mo = new Mongo();: ~' M$ g- j4 ~) d6 W
- }
9 F/ L0 V0 Z( X0 ]. b% b% I& Y - return $this->mo;
, i5 r% a) w- K. A- m - }: r C" d; m# ^- M5 }
- }
" t* V5 I0 G* l: |1 A - /**4 j% U- Z% V& Q% w4 s9 a, l* d; k' `
- * 查询表中所有数据; U' v( L- W' y9 A6 N b3 B4 }
- * @param $table( x, F' }- L. ?' Q0 r) T
- * @param array $where/ n Z) i: \- \9 m
- * @param array $sort
" w8 ]2 ^4 a5 a" F; I) S! {; c - * @param string $limit+ p8 j* E8 C; k# C; Z2 }5 \1 e
- * @param string $skip* P8 U) L; \0 C H L) f3 a& _ A
- * @return array|int: Q: M* ^3 c2 _( I! b5 b& s% v
- */
3 n/ _1 S: ?4 F% }+ R6 s! }* H( Q - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {. m7 ?& P2 L. B8 j( {# i( O
- if (!empty($where)) {# Z* g9 X$ t4 U
- $data = $this->database->$table->find($where);
. e- g0 Y8 W9 W* h9 ?' N' y - } else {' \/ A( a: V# E. _2 w4 r
- $data = $this->database->$table->find();" B- ^# u r- f$ W, K
- }
( K1 f7 V2 n0 g9 _: D9 t' W9 g% I. C) D - if (!empty($sort)) {
3 \1 m4 I O0 Z4 z* e9 f - $data = $data->sort($sort);, Z# e' ~0 t! u0 n B4 r
- }
7 Q; Y( B: S2 D, }0 C! x: _ - if (!empty($limit)) {
; C. B; S2 f4 e/ u* P9 U - $data = $data->limit($limit);
5 C; `, T3 Y, z( V1 D2 R: W' d - }9 A+ y% |8 o2 p. r$ P
- if (!empty($skip)) {& ~& l! }) ^0 a7 [# `
- $data = $data->skip($skip);
* M- z+ A# H$ p' z. b8 X3 a' P" ] - }4 {( Y4 W$ s, ?. P: e/ r" x& p9 V5 `
- $newData = array();* I" w( M3 t+ x5 N7 z0 X1 A
- while ($data->hasNext()) {
a: B2 C4 r( O3 v - $newData[] = $data->getNext();
5 Z& S. p5 |* G+ f/ j - }8 ]$ C0 ?, V2 k6 R' B7 m) |4 {, u
- if (count($newData) == 0) {1 D( h2 ~) T1 z' [
- return 0;* B) ^5 r! g' {4 ]' @
- }
) L5 p2 Z( G# O3 h% ^) U: b - return $newData;
0 B8 Z' ^0 g- ?* w6 P; C - }* M% j4 E& L/ a r4 ]* T
- /**
3 p4 X2 `; w+ u2 u+ i% i/ ~ - * 查询指定一条数据
+ f# [* ^) b% ?4 P - * @param $table. N, E! R% n- v w6 c% N
- * @param array $where
; G6 @# J" x, Q% e/ `/ m - * @return int$ H6 [. U' u4 O7 m& Y8 b
- */- c2 B! x3 A- d
- public function getOne($table, $where = array()) {
0 }8 x7 J. V% R5 ]5 F4 R - if (!empty($where)) {: H [# S3 f# i9 V
- $data = $this->database->$table->findOne($where);
5 ]. H; u3 k5 `% Q! q - } else {
% ]! c1 R! s- j" u - $data = $this->database->$table->findOne();
% H& W) P! i f# r! ~ m9 m - }
+ O2 }* Q8 {$ I) V5 c# ^4 F2 y - return $data;
- c- Q( v, F2 w( f/ S, a8 y0 z/ M - }+ c$ ]3 H- j- ]
- /**, [9 v& f# Z. f v/ p( F
- * 统计个数
1 h- E+ i6 F+ l, k0 W, @6 Q - * @param $table
7 `1 G( B/ }; T3 \ - * @param array $where
, m, Z. C9 \ Y |; w - * @return mixed
# m0 Y5 o) {+ q* A9 e - */; [$ {' T5 P$ Y# ^% v) q
- public function getCount($table, $where = array()) {5 l/ n5 S. a& t9 M
- if (!empty($where)) {" f% s9 s3 Q; S
- $data = $this->database->$table->find($where)->count();
$ A2 I R0 b% r; {5 U& |" Z - } else {' \6 l) k$ s+ M3 S0 \
- $data = $this->database->$table->find()->count(); @0 O% C9 C3 Y+ a
- }1 t n, P& J$ Q# P
- return $data;8 A3 y D" t9 [
- }# g- S8 P3 {0 O$ m4 \: Y
- /**
+ m/ }/ U0 B9 M: o) q3 a# L - * 直接执行mongo命令1 U2 j- x. X- e( @$ E3 O
- * @param $sql
9 U. m+ ~# \! F, } - * @return array& v6 z$ b! z" L7 E$ x, L( c6 y
- */
9 a/ c1 y- g8 k* i) ^# ` - public function toExcute($sql) {
; ?2 ?. a0 @: v+ s - $result = $this->database->execute($sql);
q8 z+ F7 W1 p - return $result; ?1 ] w. V8 L0 r, ?4 S2 g) A+ ?
- }
' g% V6 ?1 n2 E) x2 l - /**
5 h$ k! l' g- d, t; Y - * 分组统计个数0 z9 V |& m4 E, a( L/ N" Z F3 N
- * @param $table
- q/ J5 ~+ j" d }. z& s6 M6 n8 X - * @param $where" X7 |3 e6 ]- _2 d6 J# g7 f* D9 G, Y9 T
- * @param $field _% v. O, b7 o" U+ X9 @9 ~
- */
9 v3 r" D+ a- G$ q* y+ v- Y" Z - public function groupCount($table, $where, $field) {
9 U h4 y. |. z: F3 k' A6 w( l D - $cond = array(4 T! i; u4 J' p2 X
- array(
1 A. e* x& L% h6 g$ V m - '$match' => $where,0 U, |5 Q0 Z7 ]* ?# c. M
- ),
: E/ U' B& Q' j4 Q& O5 m1 b7 d' { - array(
$ u: j/ G0 Y3 x# K - '$group' => array(
1 ?9 W% J: g# c- F: b - '_id' => '- P/ V5 Q# } O; A% R- `
- 7 o$ S7 D# f: |; b& w
- . $field,4 ^, m) P3 b5 j) q6 L( Q
- 'count' => array('$sum' => 1),6 [! j; R! k, x {4 O2 @
- ),
2 }( r9 ]( [7 f, M6 V: Z0 z. Z0 y& ` - ),
8 g' @/ L1 S1 y' r. P' h - array(8 c) Y; E- a6 _+ a9 T
- '$sort' => array("count" => -1),
9 v. s" D' ^6 S6 J - ),
5 T& D4 Y9 M) p/ d$ O7 p - );
' _0 K+ ~ x6 s ] - $this->database->$table->aggregate($cond);% `) a h+ D, _
- }
# `1 b* @2 ] l& K- d b - /**- _& }9 B! n( t( o, v% @
- * 删除数据0 w& x) I$ s& ^+ t2 [. L5 L% w
- * @param $table8 _' }; V1 T" s1 L7 G0 O( e7 e
- * @param $where. P5 c; z" j Y% ?2 `: h# K
- * @return array|bool
+ L4 d9 Z, T1 m- s0 }" W - */9 v7 J$ R- Q2 u& y6 a, o3 j3 I
- public function toDelete($table, $where) {+ a$ `+ b9 v- d1 m* D! e
- $re = $this->database->$table->remove($where);
, @1 I* X7 y5 s% _8 J - return $re;- A# o3 a% V: m0 d
- }
/ w* Q5 A0 @' X2 o1 _2 U - /**2 E" P3 N3 `2 J8 E
- * 插入数据
- y5 N& Y5 V8 A8 t7 t+ l1 I, F& O - * @param $table- E+ @( ]! j$ ~4 ]4 O/ ?
- * @param $data
; j" ^9 z. K+ \2 ?2 d$ j, A1 C - * @return array|bool8 N9 F& q% `- A# ]- o h# n
- */
0 B# ?" x7 o; |" R1 Q5 `' g* f' v" P4 s - public function toInsert($table, $data) {
- ?3 h, {+ ^! t1 |$ T7 E' A o - $re = $this->database->$table->insert($data);
9 o" t# E8 ^2 r0 K' W, r c - return $re;
7 [! l V$ \+ k9 y/ | - }! _" Q& n2 j9 W# N
- /**
2 p: B K! s+ v - * 更新数据
: R- z: T# `- X$ \1 y" b2 E - * @param $table8 J0 I; K, }1 i( W; Z8 y y# q
- * @param $where
6 u1 E x$ o7 E# Z0 T |: |* e0 A7 D - * @param $data
% A9 [+ v- A4 ?/ Z' x _" k - * @return bool5 v4 T% F. Y1 m- l
- */
. I7 j* y" Y# Q% u0 m: c$ ^ - public function toUpdate($table, $where, $data) {
! B# `8 c, D2 q! ? - $re = $this->database->$table->update($where, array('$set' => $data));2 `" z5 s+ k& Y. {8 [' T* n
- return $re;
1 a9 G) a9 j1 \% N- T- I* j - }
0 S0 b+ _7 y; u- U5 W* r - /**
% q" z: ?. N' z7 N - * 获取唯一数据6 n, s, T" Z0 q
- * @param $table
# o0 r H& ~# D$ y; ^& M# ]# a7 V& F - * @param $key' m. `" S9 N {' o
- * @return array
1 K7 s* q- U1 u0 U6 F0 E - */
' v4 t& A: d/ c - public function distinctData($table, $key, $query = array()) {
# Z7 w5 t A/ U8 K - if (!empty($query)) {9 E' z# s% b. b" W
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);$ f/ \' t2 e* q
- } else {4 l- N8 ?3 m# ?$ P
- $where = array('distinct' => $table, 'key' => $key);
& W5 I+ X" P, S- y - }
! K$ p& c' V. Z - $data = $this->database->command($where);; Z6 G+ x! ?! j7 D8 D( ~$ T
- return $data['values'];& \! {& O S9 p f8 E! d7 E, I2 h: ?
- }
0 `! ?) z/ L {7 W - }
; O! u% D- f8 r2 R3 e2 W* o& C7 } - ?>
复制代码 + G1 I n+ }2 p
: Y0 m% W- W8 U' R6 \, H5 _
|