|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
8 a0 \+ _* |0 j7 H模式自由。; L |% @& U1 e+ ]. Q
支持动态查询。( D) ` _' n; ^" O, s
支持完全索引,包含内部对象。
. `4 U2 M8 ]! I9 l1 M支持查询。
/ q9 O. O, l g5 c支持复制和故障恢复。7 E# X0 `& f0 L; X: S4 H# o
使用高效的二进制数据存储,包括大型对象(如视频等)。! H5 x5 N7 z8 ?/ k8 H
自动处理碎片,以支持云计算层次的扩展性
) B) N, c8 a9 Y" e b支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。5 t5 J5 M3 e+ z, p
文件存储格式为BSON(一种JSON的扩展)$ U5 n q. z' F( Y/ O
可通过网络访问 所谓“面向集合”(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 Z; w3 P/ ^" a! p" v4 V
- /**3 j1 s& t7 f% v* p! X
- * PHP操作mongodb数据库操作类4 a2 N Y! d3 t' u
- */
2 d, \6 }0 n& Z1 N/ w - class Database {
/ Q& {0 p# h: Q% J1 ]' V& O3 T- v - protected $database = '';
2 ? B: a$ i7 i1 x# _ - protected $mo;
# ^9 O1 Z# @% B+ @4 _* t2 A - /**# J$ D2 e* q3 j p9 B' o
- * 构造方法
8 G6 y( l$ j( |: E( ^5 ? - */% ^* @3 T- M. n
- public function __construct() {
5 ^# ^/ d# n( c* q% G5 L% b- m5 h6 n - $server = DBSERVER;# R# O0 J* _2 c% W4 k* u: f
- $user = DBUSER;* B2 Y/ P4 F( w+ u B: M
- $password = DBPASS;
3 }# g+ l; A+ q6 C - $port = DBPORT;$ E5 U* F3 P( D6 v: U5 p
- $database = DBNAME;% C# V' l& A$ A4 x
- $mongo = $this->getInstance($server, $user, $password, $port);
: H/ Y" p8 r3 }; d - $this->database = $mongo->$database;& K' h5 K' D B6 V3 u
- }
' n0 \ ^: n& x) ] - /**7 ^% w9 C% A- W' t( a
- * 数据库单例方法$ Q+ ~! o& U) y# c- y
- * @param $server
; l( v) V% R* i: W - * @param $user
/ `" D, M. n" b; K2 p - * @param $password3 O! i% b( V8 B" T. ^# }, ^% L4 J% o
- * @param $port% t9 s" p4 l2 n
- * @return Mongo
5 u* D3 m6 I; U* k8 }9 x6 f$ e - */
# Y6 T. t/ }" n5 H7 Z, `: { - public function getInstance($server, $user, $password, $port) {
5 K3 W' p$ c7 {; ^- N: t3 q - if (isset($this->mo)) {* }" z% J' K0 Q2 J
- return $this->mo;
9 _; R+ F$ Y' u6 U' Z - } else {' l8 W1 `/ o$ _3 a; T
- if (!empty($server)) {6 ~3 l* R$ [: e3 A, h0 y
- if (!empty($port)) {, h: \# L& m' K, |' J, _! T; O
- if (!empty($user) && !empty($password)) {
8 G, t2 f9 t8 d h& K# \/ ]0 y - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
- i* q) b% W2 M: r# d, E2 Y$ ^ - } else { J4 H5 t! I- x3 z
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
% T% {5 Q1 V" Y* b - }) ^* @" X' t# D: e
- } else {
. ?% r9 Q, o" D/ y8 }2 u - $this->mo = new Mongo("mongodb://{$server}");' i9 ~: `) g. O# ~2 o1 A
- }
/ P; u) J" c+ A: y1 |/ r: ? - } else {
# L. X/ L5 D( |) g$ ^; i - $this->mo = new Mongo();1 L, ]; D8 ~) e% m2 `$ s& E/ Z
- }% l1 G7 N5 i' Z
- return $this->mo;
7 r# O3 ~" T' ^3 i/ ] - }
0 U6 E4 k. k" w* i7 @2 o6 Q8 l" Z - }
0 O9 k' i6 V$ w - /**
/ A5 E8 D: U$ S( t - * 查询表中所有数据0 U' E& ]; Z+ }; u! V
- * @param $table
/ \: [2 ]& T- Z# E( b - * @param array $where7 N( x0 i1 ?; p9 P f
- * @param array $sort
0 b: R$ a3 b, r. Z - * @param string $limit
" X6 H/ y2 n3 t5 e5 N0 N7 _ - * @param string $skip* x4 L$ C+ M( w! a
- * @return array|int/ Z( s, Z& j* r. L* Y9 V5 l
- */- m3 V. y7 ]2 x6 Q7 ^7 O
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
9 q3 ^" i# X" d/ v- d - if (!empty($where)) {( c5 c2 A. k( \5 F, e
- $data = $this->database->$table->find($where);0 ~+ ]+ h+ [4 k/ P) h
- } else {
1 I- @# _2 C; N - $data = $this->database->$table->find();
( Q2 c3 }8 X# c% p) K( {3 i$ F( T - }% A! q2 I' x z' h" \
- if (!empty($sort)) {
0 O. l2 O/ [* W3 [ - $data = $data->sort($sort);
6 X9 D6 W. B5 r* \ - }
0 [+ E* ?/ r8 A& l9 `# H - if (!empty($limit)) {, _. I1 v! w* E; T
- $data = $data->limit($limit);
; l0 r5 W: e3 q3 \& [ - }
0 n* |1 \" C6 @ - if (!empty($skip)) {) s+ _. D2 ~, _* {' j; U
- $data = $data->skip($skip);
- i) E; }" z. Q - }
0 M K" J) A$ ]; Q% ?( w* Z - $newData = array();
9 Q$ P& m9 C: J4 v8 ~( w* O/ o* @ - while ($data->hasNext()) {
, [0 O* S1 v, @" B- {+ E f - $newData[] = $data->getNext();3 e$ q: w# ~) q0 O' F0 o7 u
- }
* _1 F" j: n+ l/ { i! |+ n3 f - if (count($newData) == 0) {
: s+ O6 y, c. J% I5 P! A - return 0;
$ k. i' P# t$ t0 y - }
6 ^' T; L0 q0 e, I' }/ x$ ? - return $newData;5 X u0 q8 c5 f$ Z2 E
- }1 y P! Z( ~% J
- /**: q% z7 y7 D. s: ]! T9 I5 r4 Z" w4 u
- * 查询指定一条数据
: o+ ?& V0 ]: U% U( [ - * @param $table
$ @0 R7 i S9 Z, k. r$ M - * @param array $where
- u6 ?& c# |% t - * @return int$ X! C3 {" V% m
- */8 S1 [& A& v* O1 f
- public function getOne($table, $where = array()) {/ f Z* R& E5 P- D6 P' f
- if (!empty($where)) {) Q" S4 A: k" d$ m/ Z I
- $data = $this->database->$table->findOne($where);/ S. ?1 [2 q# j2 T* p
- } else {
6 { h8 z* S j3 v. X7 z - $data = $this->database->$table->findOne();% w$ K3 D1 O- ^- P0 X }6 x* _
- }
- C9 M! Y1 K m; Y3 A1 c7 u - return $data;
8 w d! P: j$ r1 _ - }* o4 e3 p7 J, G/ L/ P+ m
- /**
, c, v# ^2 A: D) @ f, J4 w3 { - * 统计个数% h! G$ o( k# c* u
- * @param $table6 P- }7 a' ?! h/ V0 B" ?' c' J
- * @param array $where2 |9 P2 O* _! n& _( t* Z& Z) q' n6 L
- * @return mixed' u: a5 j f. T, X% x7 h. V
- */
9 `; H5 ?* h5 @# N! B F- D4 a- u - public function getCount($table, $where = array()) {6 W' N2 S+ y' q9 e$ ^5 c2 J3 ~+ }. \
- if (!empty($where)) {6 d& J2 e, s0 R- Z5 p9 b
- $data = $this->database->$table->find($where)->count();
6 I. }: x; g# X) K - } else {0 p; @3 z: E" u6 r9 n
- $data = $this->database->$table->find()->count();
4 g# B6 K9 G+ m0 K8 [ D& p5 u - }' T+ ~4 s# M, {5 C v
- return $data;5 l" P9 {/ W. W- m# p
- }
$ c& r7 ]' ?) w$ w, A( b - /**0 h' C% W% x4 o- s
- * 直接执行mongo命令; B. p( w9 m: F: N/ @2 d) _1 w9 `+ Z. i
- * @param $sql
5 s8 t* l( k Q - * @return array: T$ G- Z+ W$ ~8 `3 F9 l
- */2 v1 Z6 [) q$ j5 c. ]' f
- public function toExcute($sql) {1 m! x) `# m, q9 L# ?, W/ ^" t
- $result = $this->database->execute($sql);1 t `3 _2 |2 D: W8 ]
- return $result;
9 S% @+ `* Y4 P# J' s - }( L6 k8 ^' a9 N) y9 a4 M6 N
- /**
* s3 ~4 H% u( }7 c E6 N - * 分组统计个数
/ n% L% M7 Z; z9 v! ?) x) d( r - * @param $table
/ F* w- r" t- _* w/ @ - * @param $where
]7 R0 a& p6 { - * @param $field: c4 _6 _0 q; c. _
- */
( q" V4 u- _2 u - public function groupCount($table, $where, $field) {( g9 |' f* }5 g
- $cond = array(
5 p8 y2 I2 p4 J- Y6 ], H - array(/ B& T2 Y# T1 q! D$ Y/ s2 z4 t
- '$match' => $where,+ t( {9 C0 y. F, S+ u; _- K7 J# F4 z
- ),2 D1 v$ _6 y8 z' @0 J
- array(
$ p1 N* h1 N1 y5 g - '$group' => array(! X, w: ]2 U z3 o
- '_id' => '
: w: p$ Q* [) } - , h& G! t( N, X$ v3 l
- . $field,4 Q9 J9 s8 M; Z- d; o
- 'count' => array('$sum' => 1),( A U. W4 f @7 \7 {* m& Z$ y) i9 u
- ),# F" [+ h7 P/ p: j1 O
- ),- L2 \. ^" X; B# E! m1 `# }
- array( v9 @1 o2 C% @$ c
- '$sort' => array("count" => -1),1 b8 g: g1 w* e, ~/ b# E5 y J
- ),
4 v3 s7 f6 P! h' [4 w9 u% m - );3 ]0 w; q6 h" |( }, a$ z- N- D
- $this->database->$table->aggregate($cond);* ]/ J, h# b( D
- }, E! z9 X3 i& H( V8 j
- /**
3 w9 L3 g- K& \- a - * 删除数据2 ^# _5 Z. g' C. _/ B
- * @param $table
" r$ {7 B* P$ ^3 G - * @param $where+ g: q5 [' {7 x' _9 U) F+ S+ ~7 l
- * @return array|bool
]- {, V: ]3 k- G4 h, H. Q - */$ T7 S% J8 F" r' {" } S
- public function toDelete($table, $where) {: L b& G9 N4 i, x% k* h5 ]
- $re = $this->database->$table->remove($where);% y8 X6 m! U) q. s# `' @" I
- return $re;
4 Q" @+ ?/ @0 M$ W+ S# L1 ?9 Z5 [ - }
3 K6 @1 K4 @$ N5 `7 j - /**8 V) ^5 }. h; x: l- e2 [ y
- * 插入数据
4 @- F; d7 Q6 D/ j& U2 A4 K - * @param $table5 Q( n5 @; \1 b7 A) _2 p5 ^
- * @param $data
{& ~3 ?& p0 J! b8 s4 ^* p/ O - * @return array|bool
6 j! i/ ^1 s" r4 \( ` - */9 ^7 _; L. y, y/ J6 B) }# q8 z0 o
- public function toInsert($table, $data) {+ M; _, b" S; Q! [ d8 ~& [1 u
- $re = $this->database->$table->insert($data);
6 [7 V: f: f! l0 V3 { B4 C - return $re;, P. d4 T9 v3 R$ R; v5 V- @
- }+ I: h) G$ z, l7 h( T3 [
- /**
. h G' Y1 `! |+ G1 [$ t# k8 o' s - * 更新数据: e) A" V7 S6 T% T0 I
- * @param $table* ?" i0 q, ~6 c1 {% v3 q
- * @param $where; R3 N, h$ h# y$ i9 u+ i
- * @param $data0 L- d! K7 x% O+ p) B1 u
- * @return bool4 F0 g) H& V8 T* f/ H% p% | |1 ~
- */
! ~; E! v' k* i, B9 { H! i - public function toUpdate($table, $where, $data) {
0 V$ I7 C+ V K - $re = $this->database->$table->update($where, array('$set' => $data));9 |4 W( R; g5 B
- return $re;
5 j( {+ p/ B6 ^2 p% Y0 Q; O5 i6 ` - }
2 A6 Z) `- M+ Y- x4 E4 { - /**) g2 Q7 @* C8 y
- * 获取唯一数据
, K: Z Q5 T: D - * @param $table
1 T* r, A% |6 Y- x" Z - * @param $key
* |+ Z, g3 ^7 k% E2 m: k- H - * @return array7 \- N" i; O4 [4 U
- */
' E' Q e, R" E$ j/ f5 l( y* F - public function distinctData($table, $key, $query = array()) {
: H( h9 Z, p N( D/ U" E9 J ~ - if (!empty($query)) {
3 z. z7 f# G( ^/ ]9 f" s - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
# y: n k& j7 o5 Z/ _: C7 J; A( | - } else { m' ~0 N& l8 W# u1 _- f- L6 V
- $where = array('distinct' => $table, 'key' => $key);& D& s/ i! j8 a9 d$ N
- }6 U8 U, I0 l* M: b2 L( I
- $data = $this->database->command($where);
- N8 W6 C3 o' b% I - return $data['values'];
6 V+ u1 w: r/ F0 |7 S' x. a - }
4 N7 Q+ C4 w8 }2 G - }) L& `: T8 P' j4 ?- L) |
- ?>
复制代码
' V% E& z7 Z. j4 k% \+ V& _$ Y6 p; O6 {
|