|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
* x1 b4 F% Y; l" i1 {模式自由。' l! G2 @/ F! q: ^' U
支持动态查询。
* r, u# F- e# s3 A3 _; @$ u! n I支持完全索引,包含内部对象。
; d9 t5 {. s8 p% {3 R( s2 Y0 [支持查询。9 w$ z% Z5 q7 h, I
支持复制和故障恢复。: v: ^/ J Z c4 J# K2 ?
使用高效的二进制数据存储,包括大型对象(如视频等)。
5 {' p0 f, p( P1 o# {. ^1 D0 j自动处理碎片,以支持云计算层次的扩展性4 X" F/ A; |, Z( u4 F s' h8 I+ @! D
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。+ Y- w$ Y \, e# h# a; ^
文件存储格式为BSON(一种JSON的扩展), S, L# D* E9 A. M
可通过网络访问 所谓“面向集合”(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
8 e! L" q; B1 ^8 z/ X2 s: Y - /**
& l1 U3 x& ?6 z+ v' N' P9 @ - * PHP操作mongodb数据库操作类4 j4 [6 B% H5 Y
- */
: L6 \7 |) m. H. p - class Database {
6 F' f( W1 i9 q! c+ v$ q - protected $database = '';7 u) i& d6 W+ k, e
- protected $mo;
3 S( A/ `- T+ a! @3 ^) }: K) Z - /**5 E. T! v$ C! ]% \+ d
- * 构造方法5 @- s1 @& o6 S5 P6 e) c
- */) S2 L W: o" Z
- public function __construct() {2 J( v$ r( V) Q! M2 p6 Y( `6 X" v
- $server = DBSERVER;. h R3 D0 J7 y" V# b! y' ]& g! ^
- $user = DBUSER;. g9 G' f/ g1 O8 D7 `: ]2 B0 |
- $password = DBPASS;/ w4 Y7 A4 M; P1 ^
- $port = DBPORT;9 L3 A2 _% V5 w5 n, h* I
- $database = DBNAME;, T [6 T' `0 ^! |- \
- $mongo = $this->getInstance($server, $user, $password, $port);0 T1 X! y: p3 i) l& \, i1 B
- $this->database = $mongo->$database;
6 e# L2 i% a) T, f7 `8 h - }3 T: w% F. I* O& @% @8 q
- /**% z S- D8 m6 s1 w" y6 w& y5 f
- * 数据库单例方法1 N/ O# D' ^8 F# ]* V' p2 G- x
- * @param $server2 A; l' q( ]9 H! _
- * @param $user
& R: F& a( V7 q+ Q0 F - * @param $password9 X1 M- a; v; k
- * @param $port
" J9 y q. g! v5 q* f - * @return Mongo4 s9 u/ |" n, s/ S3 P
- */
# H0 ^: T, i4 S7 p - public function getInstance($server, $user, $password, $port) {6 ?( ?9 I6 C/ e5 |7 A* E
- if (isset($this->mo)) {
5 e; [( v$ F9 q0 S: m - return $this->mo;
6 A. E) t4 l2 [8 y9 H - } else {
# q" L, x& k5 o" X, J* { g* P - if (!empty($server)) {+ h" g% ^( `% B% ]2 u X& p
- if (!empty($port)) {
' n+ i$ k: X) g! O* s3 x - if (!empty($user) && !empty($password)) {
% s# L: V% G; h, z - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");% `6 R$ B" F/ r2 @
- } else { G4 u" j1 ]( s8 [' G
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
4 Q* m/ p7 q+ _+ a+ N/ w* \7 m7 K - }
% q" E: P4 D/ a& L - } else {+ C6 J; N, d0 Y& A4 K
- $this->mo = new Mongo("mongodb://{$server}");
% m) _. R- i- y3 C1 ? - }
& l3 R& H. J2 B - } else {$ ~5 L: b) ^4 L }6 `
- $this->mo = new Mongo();( ~3 A* H* {1 V" k6 W9 @( e8 Z0 y1 q
- }
& n& b' }; p S4 ?0 z! ? - return $this->mo;
$ X. k% K/ Y& x8 a - }! R+ x. e6 {/ ?* ^3 j" x; u1 H, D
- }$ `. g0 }' y; P- }! E. H
- /**, q9 a7 |. h! A1 Q/ m6 q c
- * 查询表中所有数据' t# l6 f- D4 n8 Q p( m) U
- * @param $table: l4 F3 B1 f3 h
- * @param array $where9 ]5 j( J6 M) t0 c* s/ f
- * @param array $sort
& P) c2 X- m2 r v$ o - * @param string $limit/ T n4 J. c$ k3 N
- * @param string $skip# b: s# T. l: @& c! ^1 D
- * @return array|int, u9 w" C$ |7 u
- */
6 _. U3 o' F) _+ ~# ? - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
3 X! n' @1 H' g, q q. ` - if (!empty($where)) {
2 }# \/ A9 T. j+ u" _' U5 _8 ? - $data = $this->database->$table->find($where);8 x( L) v8 z2 y/ u
- } else {4 k3 ~, Y" Q4 r+ B% T r
- $data = $this->database->$table->find();
# v! m& T% W* \$ A+ ?1 A$ c7 S% I* x - }
9 B( x; U9 b6 q( O8 R; Q - if (!empty($sort)) {+ D& ^2 q0 k# O9 X5 X
- $data = $data->sort($sort);- d9 ^/ H, c0 u( t1 O4 t4 ^
- }
1 f+ q; J: S6 x2 j) k - if (!empty($limit)) {
3 h# j9 J9 M: Z' H) g8 n - $data = $data->limit($limit);
4 T2 }) E: s* ~$ W) t - }
/ L* G' z5 o. J4 R - if (!empty($skip)) {5 k' Y! I. J# \+ K8 T" @: ]
- $data = $data->skip($skip);
0 e# X, i1 ?- J* _, i - }
/ ^' y! a0 \4 G- K - $newData = array();% K3 K! D* C7 f6 J" m0 X1 x
- while ($data->hasNext()) {% W& G( ^8 `7 f. Q
- $newData[] = $data->getNext();- s0 J2 F9 _% H
- }
8 P( e# s" B: j% c1 s - if (count($newData) == 0) {$ `# ?( B3 d1 e6 q8 k9 Q
- return 0;5 R4 N* r7 J+ I2 f6 G
- }
1 ~9 q( B" @6 X% r" [: { - return $newData;
* Q7 Q; {2 ^# \- }4 ^4 t - }
& p K# G. }) R9 ~& L - /**
5 E& B' u3 c3 d/ a, G+ @9 u4 J - * 查询指定一条数据
) {( k8 F# H0 l! t - * @param $table
1 P- l |8 ?1 r3 ?# |% l8 K# s' Q% q# { - * @param array $where+ v; j+ z2 F1 W* f" d
- * @return int9 Z( U l# q& Q! Y4 n5 P
- */
0 ^: D1 R+ `* x1 n5 `5 X - public function getOne($table, $where = array()) {# h. r$ o0 q6 B- ]/ u: `
- if (!empty($where)) {" o6 @, ^$ U4 `0 a& w& ?# O
- $data = $this->database->$table->findOne($where);. G/ o0 S+ z" s: R5 Z
- } else {2 {* ]* o' ~, ^( M
- $data = $this->database->$table->findOne();
+ n( N# \6 z) D$ E# H, s& V - }
0 H8 m8 ~# }- O9 b0 G - return $data;
3 t" _; ?; K& |6 i - }" q3 x3 g: g" O+ m8 g3 n ^
- /**5 a+ x6 D- u; n! M) b* y
- * 统计个数
$ q6 F% ^5 n" P* t, R5 H: v - * @param $table
]3 R, u2 u. d* }) J- d - * @param array $where
$ m, n: N! N( ^$ U# d7 r0 M% ` - * @return mixed4 P) o# i% O R8 m2 o! E
- */! i1 N) ~' z$ F9 e
- public function getCount($table, $where = array()) {
& }6 g0 C8 \* @: q9 h. i! W; Y! G - if (!empty($where)) {/ _! {0 Z7 Y9 y6 D R! p) A0 ]7 P, O
- $data = $this->database->$table->find($where)->count();
: f0 ~$ d. V# L& l - } else {' \% Y" z8 b5 P6 e4 A
- $data = $this->database->$table->find()->count();; @2 R) X; C+ D2 P, n
- }
1 Y# B9 w; g0 ]$ f4 D - return $data;
5 Q5 r& V% q) H% `* n - }
/ `! ^* s' y; {' m& ]$ w, y! O0 M - /**" E+ w2 z5 D- t# Q" ]
- * 直接执行mongo命令
# s) v' ]; @0 L [' q; {* J - * @param $sql
* n2 D7 V* {& d - * @return array1 ?7 i% E$ k& j$ x
- */
* A8 f1 C3 \, o: Q$ M" b( E - public function toExcute($sql) {- s! Z+ w: Z7 {% I
- $result = $this->database->execute($sql);( t9 u4 K/ d! x
- return $result;
9 s, ~) C w7 v* e - }
! T [* e \: x6 f. p - /**
2 S$ L& M2 ^3 [- v, `- D+ R - * 分组统计个数
2 M6 @7 R& ?: o+ ? a/ C2 n - * @param $table
: a: T) ^, _+ t: U# \9 f - * @param $where
3 E% L1 E' \% Z. g, \# u* J+ E - * @param $field
$ `8 {: U* ?6 N9 X# {! { - */! T3 J1 N/ O% @* ^1 C7 j
- public function groupCount($table, $where, $field) {
( E/ z$ O8 ?" b! \1 y) X9 u - $cond = array(
% i% v( j% r5 Q- T - array(2 Q/ N. K3 C. w9 R, t; g6 ]3 a) M
- '$match' => $where,# b+ z' f: U; T* V6 W& z# J3 ^/ s
- ),
. q- k! p: x, M0 @9 y4 x! O5 b - array(
. Q3 w- }' |6 K6 s8 b - '$group' => array(
) z, h0 C |2 t5 n - '_id' => '6 |$ D" ]/ r' B
; C/ z. p* m& {2 m3 ^, v4 ]- . $field,% @- {0 o; H5 m' |
- 'count' => array('$sum' => 1),
% e% e2 |2 H V2 i5 A" h - ),4 G- N( M2 j& j" O) }- X5 @4 ^8 H9 G
- ),/ A/ j8 I( W1 `( L
- array(+ y4 U5 @* S9 L6 A. y- ]: d0 {
- '$sort' => array("count" => -1),$ s7 z! {. r$ x
- ),) x% g4 i/ B! [; ~
- );+ S. y; v2 c" Y* V- L4 T# |
- $this->database->$table->aggregate($cond);- l. ?5 Y' H' r D) {* a
- }
I: Z- s: V/ T6 k* _ - /**
/ I% ~* y/ ~9 ] \: I- } - * 删除数据
; ?* T/ y1 m5 ~; Q; o% `# W - * @param $table$ p5 R) l y/ ?5 w4 Y' z
- * @param $where+ x0 u# l9 Y( Y5 g3 ^" h9 h
- * @return array|bool
% d1 F+ b8 X" L9 m5 x& F - */4 V! f) M% D" M: f ^, v
- public function toDelete($table, $where) {! u' @1 z: f* H2 C5 f
- $re = $this->database->$table->remove($where);8 w% k- o: Q! b! D, f4 y* k2 G e3 w$ h
- return $re;5 y0 z" ]' m' f4 ]# V+ }$ Q
- }
; v2 B/ L/ L; }5 h; [' V% X - /**
" W( f8 L- W9 {( z+ x0 D) J9 S - * 插入数据+ }6 S) d% D/ ~
- * @param $table# F4 O- n# f% @2 M3 V
- * @param $data
; d$ t: c9 |4 w5 H9 D - * @return array|bool
, v' l: o: }6 g& g" o0 s - */
2 x* I- n t1 J. l5 R* W# u) ] - public function toInsert($table, $data) {
! \4 Y3 S7 ?* h0 `3 W" F3 C - $re = $this->database->$table->insert($data);
+ }- c+ O$ Q2 ~8 c+ g0 `% r5 c - return $re;
# R- T$ m! N$ l. F/ o" v - }6 G# r) Z- p; r9 r( N* k9 ^! D
- /**
" g; J P. x5 y: F7 p4 T9 f - * 更新数据! ]" b7 @; W- M$ ~" b! B
- * @param $table
6 m% H# E& ]9 T* N - * @param $where3 F3 }; m2 a, Q5 J: e' d
- * @param $data8 z9 z! C- h% T7 }
- * @return bool2 S5 s# e O: E6 x$ n
- */
/ T4 ~1 j) f9 W# x4 y% O* Y) a - public function toUpdate($table, $where, $data) {
5 w6 ?2 X9 e' x0 r$ l# [ - $re = $this->database->$table->update($where, array('$set' => $data));
: x" R: p7 V6 F7 [; { P - return $re;/ d; U3 Z! q' q$ E6 r2 j
- }
" K' g; r$ c# b, f8 ~: [+ h# l - /**5 G+ U* ]5 a8 R
- * 获取唯一数据2 S- x0 p3 i6 H; h. S5 ^0 D& z; M
- * @param $table
+ ~. ~7 H; W4 @- n! J2 ?; s - * @param $key' R+ r" G, N) o. V
- * @return array3 T8 h8 q2 c4 |" }4 ]# x
- */6 i: r( y" P; N: r
- public function distinctData($table, $key, $query = array()) {
1 n3 c5 O. k( Y& n, j) [ - if (!empty($query)) {' k# B( Q0 \' p4 s9 T( C% {
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);1 l6 @7 I6 V+ D! w' _
- } else {0 o# H4 u$ y: ]( [7 Q1 p9 P
- $where = array('distinct' => $table, 'key' => $key);
6 G1 F, B4 q0 y- H1 C9 M" n - }4 r D- m& Q* ~7 q/ [ x
- $data = $this->database->command($where);
+ ~" j4 w' E8 E- Z0 y, u - return $data['values'];+ ?4 {; I% F# F8 H
- }! z" G5 P; X% N- u( m* B8 T3 _
- }) V4 ?* G# \6 E4 a4 d
- ?>
复制代码 ' x: i4 j. a- c
- z6 ]: p3 o0 U+ ~ |