|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。1 Q v4 I3 Z' ]2 Y( K
模式自由。
, x2 g @8 E* a支持动态查询。
7 N6 Z0 u* u9 j" @: q支持完全索引,包含内部对象。
0 ^2 P4 C5 G6 Z: e, d4 a! |$ {( A支持查询。
5 r4 u' I* Q" ^5 L& E支持复制和故障恢复。
/ K0 G$ J5 c2 s& Q4 o0 D/ v使用高效的二进制数据存储,包括大型对象(如视频等)。
) y/ T) [; J; t" z, T6 M4 F8 c自动处理碎片,以支持云计算层次的扩展性. N' ~" H$ F( A6 M1 M
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
, C% G3 Z2 B8 F( k5 ]4 X3 o文件存储格式为BSON(一种JSON的扩展)
7 `, X6 g; }, d8 M ?8 x, 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 s: S$ x& d* s
- /**
" U" H& y# |/ p+ i) H8 D& r - * PHP操作mongodb数据库操作类
% c/ N5 E! d3 N+ g/ _5 t: ]' t - */2 B! y6 K; l2 L( y6 ?
- class Database {
. O! ]+ q0 j% P7 G2 t u2 ? - protected $database = '';( K! p) M2 u% z4 A/ N
- protected $mo;! g9 F" ~1 N3 t$ V' f
- /**( M2 D/ o" R5 A. T# f# D2 \5 @
- * 构造方法 |& q* O8 ]7 J3 k( c
- */
1 R4 c) x5 V0 y; x$ a2 B - public function __construct() {
/ C$ F! K& G5 m( R$ M8 |* \ - $server = DBSERVER;, `* `/ Y9 x7 `7 v9 _+ Q
- $user = DBUSER;
* N. ]% `3 H$ p - $password = DBPASS;
- E1 B: ] F/ u& S) W9 h: j - $port = DBPORT;7 w6 k4 J7 f" e; x
- $database = DBNAME;
, G7 H9 g! ^7 z( V- B - $mongo = $this->getInstance($server, $user, $password, $port);% w1 k% P3 N- i" Z* y! }
- $this->database = $mongo->$database;
+ c% C) E0 j: h. D7 B: [+ W3 { - }; t( I2 {+ n# g+ T7 }% y/ D
- /**
^7 a, E! R9 o - * 数据库单例方法
U( c5 a; D) A( D - * @param $server
( Z; L) ?+ c- R - * @param $user
- X2 \! U$ Z7 x% w: J: j - * @param $password# K! Y; t6 w6 _4 D6 S1 K
- * @param $port
5 V3 a2 b# w- a* X5 [ - * @return Mongo
6 X& Q5 H1 R( m2 A - */. M P8 {! Q; p/ ~+ p$ F
- public function getInstance($server, $user, $password, $port) {1 W! R# j5 Q4 }* n( _
- if (isset($this->mo)) {
. {* W7 O, t" | - return $this->mo;
1 R6 l5 Y( Y; G5 U+ @ - } else {. U# `: V1 u: }7 p* \( L
- if (!empty($server)) {2 t9 y7 {9 l) O# ` l* C
- if (!empty($port)) {
0 A+ v# `2 V1 ~6 g5 x* \3 e - if (!empty($user) && !empty($password)) {8 R% F+ t7 B& e, g! ?3 ?+ s
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");4 l5 ]: K" q. a$ @# Y0 t. {
- } else {
% q: C- j& i, i* e8 E; t - $this->mo = new Mongo("mongodb://{$server}:{$port}");7 H; _& R' |- v$ Z% k7 e! a/ @
- }
B+ ^; Q, |2 q' m, y; e - } else {' z4 i( X7 [5 T, B2 N7 }; F9 d
- $this->mo = new Mongo("mongodb://{$server}");: V9 d' S1 E) F5 w& k. b) r
- }
! Y& L) O7 c. F: a - } else {) f. k. A' J- x2 ?, o, o9 i% m
- $this->mo = new Mongo();
) F$ _' [% C$ R* _5 ? - }; H. g& l% [, l% a# ]
- return $this->mo;* v8 u* E3 R% k
- }
( h# F' ]& ^0 r/ W - }
, W# X0 c9 o, X/ M2 w% ` - /**' I6 x% D- k- B) N9 J, z: ~/ X9 G
- * 查询表中所有数据
" p) n! Y, m# e9 m: |5 q2 G - * @param $table
) U/ Y4 `1 U% h - * @param array $where' d1 B3 _# ^/ Y2 t+ M
- * @param array $sort6 s8 g! ]8 M$ @
- * @param string $limit# `+ C! j8 c4 P% I5 K
- * @param string $skip1 d' [, g' |, r; f7 g1 L3 O( K
- * @return array|int4 f# f7 x: f0 M! \3 o
- */ z% O0 W2 f% L- v2 j% }- e
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {! ~6 f) @3 A' ~% z
- if (!empty($where)) {. k- }4 b) ` j3 P# r) r# K k
- $data = $this->database->$table->find($where);# N, v' [/ ^ S# I5 G* P+ D. B+ W
- } else {7 E2 E: v. U# ]- O
- $data = $this->database->$table->find();
& `7 @5 g' u3 n. H - }3 I; I o) f$ D0 \
- if (!empty($sort)) {
0 e; g6 V/ s% h5 T, m3 w L - $data = $data->sort($sort);/ a# [9 F! |. O* n* A" I3 c% D
- } K! q; o! H+ G, j: m& [% t- G
- if (!empty($limit)) {6 F$ I" v/ `& n' w
- $data = $data->limit($limit);/ j# ^! ]' z) q, c. J
- }
; A B3 }, S' d# ? - if (!empty($skip)) {; t# A: k3 N& v9 `9 V
- $data = $data->skip($skip);
& J8 p! w- o. s* l6 f* P: V9 o& S - }
2 S5 I( v2 ]: P4 z! B" j& @9 k) R; Q - $newData = array();
5 U1 ` \2 M k; T - while ($data->hasNext()) {
* N& M2 o/ P2 Z3 g - $newData[] = $data->getNext();7 u6 t5 h( d* \: r, N2 [6 T
- }
% t% B8 S5 n$ g" a - if (count($newData) == 0) {$ [" n6 ?# n, g) ^* [
- return 0;6 o- D0 D; [8 v3 @( j+ B
- }& [. t* ]- F5 u X( m
- return $newData;
4 C, {" e3 w' {. j8 X8 v, X/ ` - }
% G' Q/ J) `+ q - /**- l& a& u" U0 q3 Z5 r, K* B
- * 查询指定一条数据
' \+ S: m7 r5 u8 ?1 n - * @param $table
! X' |$ i! p$ P/ v) S - * @param array $where& u1 h$ E% Z) i5 n
- * @return int7 q+ A+ q8 `: M/ L+ C
- */
; G8 A8 f; G F, x6 \: t! Y3 T - public function getOne($table, $where = array()) {0 ^! g5 J1 B5 i+ R$ T
- if (!empty($where)) {) w" f+ O" l! ]- B7 ]. B
- $data = $this->database->$table->findOne($where);5 }) a0 o0 D+ M: @3 Q' a; r
- } else {* S& I8 c# ~$ [( Y# P- h
- $data = $this->database->$table->findOne();
2 R$ s# P" {3 J$ B - }% s0 @. m9 l, E8 p
- return $data; K6 ` K/ d x6 z' K4 H; n
- }
/ H5 c. {. t# q! h - /**
+ n' ^: R3 o' Z - * 统计个数
7 x( p0 y2 C% k4 X! `: ? - * @param $table
' j6 t) z3 b) o, B6 I7 n - * @param array $where5 A0 u& ?& G' F/ H& P: m; e
- * @return mixed
5 {, D& @- |' k( k+ _" o+ U$ a/ I7 ]1 [/ ~ - */" s( H' X$ z4 T8 }6 \. H& N: T- F t
- public function getCount($table, $where = array()) {
6 V7 n* {0 [6 L! W8 G+ k - if (!empty($where)) {( \3 ~0 j- y/ u" W* n& Q- U% F' z! C1 O$ u
- $data = $this->database->$table->find($where)->count();
4 M! ?2 j# q8 q9 n0 z - } else {+ \9 u9 A: x/ q8 H( n% ^1 t1 w
- $data = $this->database->$table->find()->count();
( s4 @" B; Y# }# y - }, e; g- d; Y/ d& ~- z
- return $data;
! m5 c! E3 r% t% r. R - }
n s6 n: M% s3 W% K- ?3 _ - /**( p5 l0 S4 b& H- J
- * 直接执行mongo命令/ r3 g' e9 w! |* i# ^
- * @param $sql
+ t& w( t3 X, {: X% Z/ j N; J+ A! R - * @return array
4 I! p# N7 ^# K& z5 \0 O2 F0 O - */
$ \: ] ]: m6 E0 c: e - public function toExcute($sql) {
8 t2 h$ _+ P, i! l& O4 B- R! N( A/ U - $result = $this->database->execute($sql);4 @0 A, H2 y8 H
- return $result;
& b) B" j5 X, o8 d - }/ }& E" j# k% O6 }4 S* f
- /**3 P' v( Q: @- k. p) o2 H' n1 T
- * 分组统计个数% y( Y2 X1 T" a% D( S& q; f
- * @param $table
0 C; Y# y& G) h! \' N( } - * @param $where
% J' a8 s" g/ O* A5 q/ B - * @param $field
( R0 T9 b" V0 c+ a! O/ U - */$ o8 p- K) P F* R# e) n
- public function groupCount($table, $where, $field) {
% ^( k+ L- I; @6 a. T3 }; x: s' }3 T - $cond = array(
! j" L+ {7 M0 e0 p4 d - array(, u7 M; m! y% ]5 K' C
- '$match' => $where,
& L& r0 P) D; J$ e - ),, D, e2 c) I4 [
- array(
: `1 T& b$ y, J0 F8 w$ T. _6 B - '$group' => array(- ?& \! I4 K$ Z p/ y
- '_id' => '6 I |' O B/ C& Z# z$ ?$ E
- : x# {4 t6 ~# f3 e f( ?
- . $field,
; S& [. Q) T- A - 'count' => array('$sum' => 1),
$ t% T6 U7 B/ ?8 v: K2 [8 t - ),
1 y) X' F! g4 T - ),4 e- v& k' Z# A5 @" v: m' N, Z1 O
- array(
' T9 K2 q- ]% D# h; m" a* F' t - '$sort' => array("count" => -1),
, ]3 ]0 G: r6 F" L. V9 `* C - ),
: s; q' I' `$ F+ E* n3 W - );; W2 Q+ P4 Y F
- $this->database->$table->aggregate($cond);$ Q% O3 t( j) F( y6 R
- }4 z% ?4 q; K6 i2 i2 E- D! i3 Z' j
- /**
5 s) M: t0 e$ R6 l I" L1 F/ c - * 删除数据
% X/ g- \' C/ w' M4 H+ t - * @param $table2 ^* l3 |9 O3 s$ {
- * @param $where$ w) U) G% U: x% o$ N, G
- * @return array|bool8 h- P, O. Z9 n+ `- S5 A5 B; M
- */
; |) q9 K1 }) J3 ~( X% ]( T/ v5 Y - public function toDelete($table, $where) {
p A) U! X4 z3 h2 t - $re = $this->database->$table->remove($where);
. U& ?+ X7 N; F: }: z1 k - return $re;
; L$ ?6 w( o2 f2 W, y6 u+ O - }8 z+ X% g( U+ h
- /**
/ q6 G+ {9 p9 z+ K* A( Y - * 插入数据5 R* e8 a5 }. ^6 C! A1 d
- * @param $table
6 N" @- z: O v. P - * @param $data
: R' Q9 O* S3 W K" } - * @return array|bool
, I( J- p3 O4 d" i( d - */) ^/ ^) P) t# o) A! O u
- public function toInsert($table, $data) {
, r5 Z4 {; o1 c) m - $re = $this->database->$table->insert($data);0 u) A! ?! e5 t' }
- return $re;
9 X9 W3 [: b1 h6 X8 E - }
0 N5 G0 ^& M6 W1 \ - /**
, x+ G4 x/ e1 B/ x2 u - * 更新数据
' }* }9 y3 G, \, u$ C3 S" l - * @param $table: Q4 N4 v. R! }" H) b9 d
- * @param $where& q7 J3 M/ u& y9 M+ j
- * @param $data
) Q" B3 b% }' j - * @return bool
5 ?5 E. i& v- I+ b, N. ]. U" s - */
6 O U9 T+ [2 r8 c3 y% E - public function toUpdate($table, $where, $data) {+ t I, c1 C8 a- b
- $re = $this->database->$table->update($where, array('$set' => $data));
4 B9 u" P! F' z2 p - return $re;' Q T( k7 F& l( ~: k
- }
2 d" y# R+ |0 i7 i& S) y0 e+ x - /**4 w: \- A( t+ |
- * 获取唯一数据. w4 c: F4 I# w' ]* U& J/ Z
- * @param $table+ R2 a8 {- S" H- w5 s5 }
- * @param $key
& B7 ?: y W' _( a$ ^6 y$ n9 S* y - * @return array
. Z/ U1 Z4 t9 X c$ _ - */
, a' P9 @; H* `/ P/ N - public function distinctData($table, $key, $query = array()) {* R6 `3 N( y! r) E0 l f
- if (!empty($query)) {
; V% g# {5 N. l$ C# ~ - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);" N5 G3 F3 j; \: P g- {
- } else {
l! |6 M7 `; }1 j/ s8 o - $where = array('distinct' => $table, 'key' => $key);
! f+ x2 j2 `7 F/ q K+ N - }# X; X/ Z1 v! l- M! d# w
- $data = $this->database->command($where);
( _: B/ R1 q) Q$ \ - return $data['values'];0 v7 b; N! q6 a' }. }/ p. Q
- }
8 P n5 ^( e' a - }5 ~! x @: b, J% h& n
- ?>
复制代码
: G' b: e# M0 \1 c8 ^4 e$ r/ W' n6 v! A! T9 r; X
|