|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
6 M: W0 a0 v. u, h6 u. h模式自由。
# i Y$ [! X, q. O支持动态查询。+ f1 ?; g# U; T W3 S, ?) {
支持完全索引,包含内部对象。, j$ D& K A) H
支持查询。
' e2 Y2 w+ [6 C支持复制和故障恢复。
; Q) G! e6 P) c5 O& ]" F) W7 ?5 i使用高效的二进制数据存储,包括大型对象(如视频等)。
1 u# N. O. J6 j# z& x) \自动处理碎片,以支持云计算层次的扩展性
M( Y* x- [! X5 A) V支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
* B( E5 R) d4 J( u文件存储格式为BSON(一种JSON的扩展)9 ]( [! B. [- ^
可通过网络访问 所谓“面向集合”(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. d' e9 _" R Q4 [# \7 I
- /**7 e( S# Z# ]1 |0 f! h1 c4 P5 U
- * PHP操作mongodb数据库操作类
' L' @1 u3 L& R - */" v( I3 X; U/ ^. A H0 H
- class Database {
' V) O/ C, Z% J1 k" F - protected $database = '';
1 V# }6 A5 v: [9 J& v3 ] - protected $mo;5 E3 t1 ~- a5 Q) Q, I
- /**
8 j; R/ h1 [8 | }. M; Q - * 构造方法* M6 `( t0 C3 q( `5 Y/ ^7 w
- */
8 J3 T5 q- P( @' y4 q Z) U - public function __construct() {
+ G% S: J9 l6 _+ V& @; K2 N - $server = DBSERVER;5 v9 K- I* z8 o! F2 @6 ?
- $user = DBUSER;
# \; H2 U; X+ a( g - $password = DBPASS;- e9 P1 f u2 A8 `) h
- $port = DBPORT;
, M- o2 A! l* _$ ?3 t2 w& G - $database = DBNAME;
p/ R7 F+ t, l- S$ ?5 m% D - $mongo = $this->getInstance($server, $user, $password, $port);
! C" ~3 L' Y T: L+ d4 o Z - $this->database = $mongo->$database;
. s% v. p1 C& N - }
, l: F' {2 ~8 q' r - /**
' M+ A2 j% [( B/ |5 `- O - * 数据库单例方法% ?6 A9 l/ W- W' S' _
- * @param $server: Q$ t8 M: b2 F' \
- * @param $user
! ]9 C: p, U7 y, |1 r - * @param $password
& h: Y+ O2 s; d; v - * @param $port& L1 e' Q% q6 ^( F4 e+ R& A
- * @return Mongo' r9 B' R/ T' ]2 a4 N
- */
) `7 x' g2 j* s( ~# n - public function getInstance($server, $user, $password, $port) {# d0 Q3 g: G8 Y# r
- if (isset($this->mo)) {
* S3 \) ^, l" N, L% ?+ q - return $this->mo;; A& C, q' e& `& O( O0 x- f/ N1 T1 V
- } else {1 O6 q8 `' @: [& I! h) T& O
- if (!empty($server)) {3 s# e/ t/ G9 h
- if (!empty($port)) {
* w5 r6 K: [5 f; E8 e8 Q u - if (!empty($user) && !empty($password)) {& s: G# t, z; s/ u& a7 v5 G
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
1 v# `* [1 Q) i1 p, w* T - } else {
: U! x6 H* y9 l J - $this->mo = new Mongo("mongodb://{$server}:{$port}");
! \$ }6 F: N) S/ R - }+ v+ a/ P; H) g2 y' q: X
- } else {) y: {8 m5 c8 J7 l9 |& v6 I
- $this->mo = new Mongo("mongodb://{$server}");
. @ T J0 y) o& g2 `/ I2 q - }
: z; v Y% J- h, n/ Y1 {6 l( v - } else {7 @8 \5 q- X9 Q \ L
- $this->mo = new Mongo();
2 J7 o- \: _/ I4 |% Y( c1 b' M' n - }9 V8 ~' U8 b0 W/ s( E
- return $this->mo;) Z; w3 ? h @: H- C- v, p
- }* f! M% _2 C7 X) r& T
- } {6 G, q2 Q; |# b8 f
- /** r7 \/ `: p% `4 z2 v3 F+ }
- * 查询表中所有数据4 U6 w5 S8 F& ], i. O
- * @param $table4 x4 q7 `! n$ [) t# Q. \
- * @param array $where) h$ ?' M+ u. i. K; O+ V1 w0 E( i4 @
- * @param array $sort
9 }3 q' Y. z+ L6 Q' s. L2 e - * @param string $limit
+ n/ r% T4 L9 R9 \0 w2 y - * @param string $skip- P Y$ ~% y; l& ]7 m5 U# ` d
- * @return array|int) L3 Q1 r% N! m& J$ f
- */
0 Y( N4 Q7 J2 ^ F - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {; G. _: \' X: e# _
- if (!empty($where)) {) s( n1 n# M! P! o0 d
- $data = $this->database->$table->find($where);
9 f+ \# Z5 ]6 R9 p9 H2 b - } else {: R" _6 C: z6 }7 a0 [$ J
- $data = $this->database->$table->find();
5 `5 b! t' Z7 h! v( j% d& @ - }- _; {+ i: d- g' b: ^
- if (!empty($sort)) {
* f* @: M! J* r; { - $data = $data->sort($sort);! I7 N' H8 P# ~, {5 ^7 ?
- }
8 i2 K c& f+ j, C3 w* y - if (!empty($limit)) {4 W1 P+ \) z5 t# F2 L
- $data = $data->limit($limit);+ V1 [% d, a! z1 ^
- }) [, r( i* [7 q7 [
- if (!empty($skip)) {
' r! U" }) N: \/ D, @ - $data = $data->skip($skip);0 `; q" R" |, a8 t z" G
- }! B" ]2 o$ n& `; P
- $newData = array();
! k3 `% I+ w* V' ]" i7 B+ h - while ($data->hasNext()) {. I. T/ G2 f* w8 R; }. ]9 A7 x# e2 j
- $newData[] = $data->getNext();$ O! z- Z/ A3 ?1 j" d7 p
- }% P7 A0 Z5 @8 g
- if (count($newData) == 0) {
6 y' m% D8 N4 j! U% H - return 0;
F) B8 {/ g! W# K2 q) o- X! [8 n - }; Y1 U( {1 F5 [- U/ B7 ?
- return $newData;
; ], g1 g( _" w5 w f5 |/ T - }5 T6 J7 y* n: W" V, @$ m: a, c. [
- /**
$ p3 G6 j1 b- ^; u( Q! Y - * 查询指定一条数据
( m9 @, _# d$ F9 P" y3 m- ~ - * @param $table
' r: L$ P$ \$ V) A - * @param array $where
; Z4 u( ], q0 h/ j" y7 Q - * @return int
) A" ` i5 T, _7 K9 N& T- r - */
+ z9 P7 `# t7 g5 R9 e/ R - public function getOne($table, $where = array()) {" t& O4 L2 O( j& X
- if (!empty($where)) {
" d; O5 U9 H$ C8 u$ g - $data = $this->database->$table->findOne($where);
8 i9 c9 S0 \0 m6 X6 L - } else {
7 M L4 w0 N1 L, _ - $data = $this->database->$table->findOne();. i+ T5 [& I% o; |( k+ M+ D, M2 M8 V/ \' ~
- }
; @4 d- I$ l! L O5 b0 _ - return $data;+ _1 H7 U1 b: u* j, m
- }6 c3 V: F( r/ n- `9 R- m3 i
- /**
: j' G8 B; K8 r1 R7 @. M - * 统计个数' l$ L' L9 ^ C: O3 B
- * @param $table2 I# P- P+ g, }1 R% I
- * @param array $where
9 t0 V) X' M6 C8 k) D; D6 Q( a - * @return mixed: ~1 [3 k! `, I* w3 H
- */3 R% F& s/ j/ T' m, j8 o( }
- public function getCount($table, $where = array()) {) _9 w: I# k% [
- if (!empty($where)) {; ]4 M" S. U S# U" o* n
- $data = $this->database->$table->find($where)->count();% f( V8 Y1 m& \! _) C' }$ z( E$ y
- } else {
$ [ P2 H# ~0 b S* _ - $data = $this->database->$table->find()->count(); T7 T/ Y0 ]$ r
- }8 R9 F! c6 t3 v) {$ M
- return $data;) i8 k( Y7 e- d3 g
- }
0 Q S4 |2 C/ ^" K - /**
0 R) N- W7 |+ r( Y! x c - * 直接执行mongo命令
% ]) ]: P# L, }" w - * @param $sql
3 O* c |1 Y9 u' W8 }0 U - * @return array4 G* P" Z. d* H) c" H- d& A
- */
9 l3 H( \2 p* `% a - public function toExcute($sql) {
! K: ^( W; J. E% A; P4 V" { Q - $result = $this->database->execute($sql);/ X# D7 ` d3 D& `6 U1 M/ O
- return $result;
% K$ a& K+ b" F4 \- [: j5 m - }
5 V, |* U s" b& W+ [" f4 h( C7 o - /**/ E) @9 V1 g0 e' B. P6 b
- * 分组统计个数. K5 K" L. ^+ v9 U) R; t
- * @param $table7 _1 [ I4 [2 t+ n- M: _& S6 y; }' t
- * @param $where
5 T! }) l- [; F7 F - * @param $field; t: ^, l' Q6 z, k+ v
- */
1 p# ~3 a6 G7 X* e - public function groupCount($table, $where, $field) {; s+ w" w4 b. w9 q
- $cond = array(3 z7 _6 Z, Y) J" [" M' ~3 @9 b( I
- array(
+ b1 t. e2 c( _* [, q3 B" ` - '$match' => $where,
4 Y( x8 ~# p6 ]4 u! J - ),
' O- x5 S. k/ i' O) r6 u - array(
/ K: W4 _/ q7 s6 o' h: d - '$group' => array(
) k3 a5 h p: w5 r8 M" J - '_id' => ': {, t5 ~1 @1 p; O( `1 Z4 \- {
- 1 d s$ r: ]6 }( {
- . $field,& c9 t$ ^! R7 a
- 'count' => array('$sum' => 1),
3 b: E2 @5 H1 Z1 w. ]1 x - ),6 j) c8 Z' [& e0 V6 ]# B" a/ y
- ),5 a; b, }' [: c& Y
- array(' r, f: P4 Y# D e- S
- '$sort' => array("count" => -1),
7 c# A& u5 `7 K/ x' \8 S# u - ),; V4 {6 ~ _# N7 W6 i
- );5 v) V8 Z2 Z2 ?; X- k' F
- $this->database->$table->aggregate($cond);" j. j! o" N% `% |$ u Z
- }: @. _! ^' L! D8 C
- /**( P; z5 I' u0 ]
- * 删除数据
; T" p; @4 K/ _5 V, g5 m - * @param $table( ^) f+ q' r1 q, w
- * @param $where
" j4 R% y, O+ @' p6 ?0 ` - * @return array|bool
$ O+ E. q' b, D! K - */& ?0 B1 g8 o! g
- public function toDelete($table, $where) {3 D$ \! l; s) e& w! D9 O
- $re = $this->database->$table->remove($where);8 W$ |2 V; z3 E5 z1 n: t$ `0 }
- return $re;
* ]7 o l' R) G+ e4 p - }2 H/ R3 y' I3 S# w
- /**
& E& g0 ^- D$ Y1 B - * 插入数据
- G/ Y6 u3 i/ O: Q( `* z# } - * @param $table$ D6 c" E+ h* S- G+ Y
- * @param $data8 m0 `2 X4 V( \0 i1 l
- * @return array|bool! j8 P5 }' u5 H) \( P0 C* F4 V; [5 r* |
- */
5 y" B" E8 b! ^& S5 v- D* y' r - public function toInsert($table, $data) {
$ d" m6 [; Y: Y2 d' ?5 d - $re = $this->database->$table->insert($data);8 ^( L) y5 A: I& C
- return $re;7 C/ `6 ~3 q x& p! V5 b& M6 t
- }
3 r* m! o2 j1 K4 E3 F0 [ - /** S8 |+ G6 \+ h! I+ g
- * 更新数据6 ]! T1 d q* ]; q, d4 M
- * @param $table
5 o! h( ?, k4 _. ?* E - * @param $where1 N! d' l5 T2 s3 D! R2 s5 }
- * @param $data& S! H/ p5 t- t$ T: ~4 ]
- * @return bool
$ x$ ^7 b- P, O9 C% [5 Q) f { - */
9 T7 B* X7 M% C m0 b, d - public function toUpdate($table, $where, $data) {9 A8 A1 G3 j- A* |- Y& s9 h
- $re = $this->database->$table->update($where, array('$set' => $data));
6 b( z, I* G+ K$ O4 t' m - return $re;7 Z( g. X. p$ Y6 L: G& o
- }1 ?) ?3 H9 l) Y7 ?& d% u
- /**
1 P8 Q4 p9 c3 S - * 获取唯一数据
" H% H" X4 O# E* W2 T- N - * @param $table
" u8 u- M" T, O - * @param $key9 g p$ z3 W& {6 Q' n y
- * @return array
7 N2 l {3 X, q - */
! i' W) k8 e. z' y - public function distinctData($table, $key, $query = array()) {
( f% g7 }7 O3 E5 _( S - if (!empty($query)) {
. F8 H% o- ~7 X* A) p1 i - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);, B% [) @% r0 S! N
- } else {' }( g7 ~* `8 _2 g
- $where = array('distinct' => $table, 'key' => $key);
8 q8 |! s* B _: Z- d1 Y - }
& J1 w5 H! N% \5 m, J' }7 { - $data = $this->database->command($where);; X8 z) e8 @/ v; b
- return $data['values'];
( |) ^5 r& K/ k: _: q6 X1 ? - }
. r0 t- S }7 Q* F - }/ d! {( ~6 X( L2 U
- ?>
复制代码 / H+ T( G1 j a7 Q A" K5 _
* ?# ^+ _1 |7 j
|