|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。6 a' s. S# U, n5 {$ {- d
模式自由。
8 \) J' N9 j7 C& s! r& Z# e5 x% N支持动态查询。
8 o% L# _2 z0 T# e' b3 Z: |8 x支持完全索引,包含内部对象。& v3 o4 d* M/ n9 V( G$ k
支持查询。' I# U1 ^' o! f [
支持复制和故障恢复。
3 Z/ [$ m; w; e! Q使用高效的二进制数据存储,包括大型对象(如视频等)。
+ u1 p9 X& Q; n# F9 q自动处理碎片,以支持云计算层次的扩展性
1 x- x4 o3 e" `& ^. H1 X支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。0 I: [" J: k5 s9 Q6 U4 Q1 h* Z& W
文件存储格式为BSON(一种JSON的扩展)& G0 [. p" V# Z6 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数据库的数据库操作类源码如下,仅供参考。 - <?php5 \( Q$ F# H. ]
- /**% b+ @4 e% h7 u( i6 \+ R) o M0 @
- * PHP操作mongodb数据库操作类
+ ~) d9 e2 i8 n% {& W - */
4 E+ k4 M$ H( b - class Database {
u# S' l% N. j - protected $database = '';) }) X/ u$ x: S& _- s" [2 b
- protected $mo;2 n/ L7 @4 _3 P% ?# v" V( A6 V: D
- /**
4 c4 W9 i7 d# D5 |* }/ a - * 构造方法# v7 K+ H5 D, S/ T# L
- */; |. i: X4 q- k% |/ d# v- l
- public function __construct() {
y8 [! V+ |, p, i& | - $server = DBSERVER;6 [% ~2 [8 h I2 ~7 x
- $user = DBUSER;
1 m$ k% V0 Y' v. o1 | - $password = DBPASS;- l! A d1 X3 M% Z) q
- $port = DBPORT;
( @, G/ V" D% \1 W" h - $database = DBNAME;) n2 C& q4 F5 B
- $mongo = $this->getInstance($server, $user, $password, $port);4 k7 Z3 ^& ], v3 k
- $this->database = $mongo->$database; \" s B( \3 M$ ?6 s) m, Q2 A
- }7 t- Q# L( W0 @5 D: {
- /**2 g/ H8 _" o) c: o+ W
- * 数据库单例方法
& G1 |' a9 |4 y0 z6 i - * @param $server9 @- \$ C' V. d; X6 j
- * @param $user- A; q/ V$ S' { p
- * @param $password
8 C& R5 g# P7 \3 ~6 y# a G8 m, H- Y - * @param $port! h" R# j! [3 K1 G
- * @return Mongo9 ^6 o. Z W$ N1 g+ L. M
- */
+ ]$ @+ K% G s* }. k5 r - public function getInstance($server, $user, $password, $port) {# ]" q3 i# {9 p2 H2 d* D$ d" u9 W
- if (isset($this->mo)) { N. h# _, K$ [) J: s' {
- return $this->mo;
- o0 F+ i# _( g- v6 O/ O$ p- c - } else {
3 q9 K+ C% R4 `: {7 C T+ p0 c - if (!empty($server)) {
* I+ n7 t. \6 J& ~; G - if (!empty($port)) {/ k3 `! ~5 q- P+ I6 w
- if (!empty($user) && !empty($password)) {- O" W% ?: |! Y" H5 J2 Y& Z, }. G
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
' d+ c' L4 h! }& [1 Z* F6 ^$ b - } else {2 m1 q3 E$ Z: s' y
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
) |* N* k- I* S! h - }
# ?; U) Y t4 Z8 g2 ^; I! T5 E - } else {
W/ F4 o2 M3 s) `4 h8 j& t3 S K - $this->mo = new Mongo("mongodb://{$server}");
7 s: c3 S2 R' Z6 m - }; x o6 Z# K- A6 a# |6 c$ b
- } else {
5 d! S$ L3 |4 c J: B: N - $this->mo = new Mongo();5 v) {. y: ?8 R' M2 b' C
- }7 _6 K2 f, P, D! @- W0 ]2 i5 ^
- return $this->mo;8 F3 _& m4 Y& U& P/ C5 U9 L( ?$ ]
- }
8 P% p3 \3 {- \1 E - }, M' H, r; I, x1 p6 Y" j: N. W/ v3 N. f
- /**" ^8 ]' j4 `* o( T5 Y
- * 查询表中所有数据8 @4 }! V" K/ I% u8 n, G
- * @param $table
+ V) ]( m7 I6 U) W1 R/ \& q - * @param array $where
: ~4 J8 w# S4 e1 ]: |" G - * @param array $sort
?: A8 n2 r4 p) q - * @param string $limit0 k) I' Y7 W% Y5 ~$ R
- * @param string $skip8 D+ k1 u( N7 g2 {: } L5 w
- * @return array|int
6 @! {' ~& a" b/ d4 m - */" d0 E8 P) O, a- N3 e
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
6 r" i8 a0 |) o) { - if (!empty($where)) {* R9 D; f' ?" h7 ^
- $data = $this->database->$table->find($where);
6 i$ v' o1 L' M- y& S `' o - } else {
/ @: A" y0 F) S6 x) t3 T - $data = $this->database->$table->find();
+ E, p- p, t. Y3 [$ U - }# _3 l9 ~9 d7 ]' @6 ^& X
- if (!empty($sort)) {
+ h- @! d# g6 N5 b* j5 t - $data = $data->sort($sort);
0 K! d0 n- T- N+ r* b# Y - }1 W8 } R( H0 N5 R
- if (!empty($limit)) {9 s% T; D2 [. P D9 { P, i/ U
- $data = $data->limit($limit);
% X! H$ p- p2 }' a' h% H - } u' B7 }% L. E3 s1 z1 R
- if (!empty($skip)) {
2 X+ J! }0 c" z9 U& M: H - $data = $data->skip($skip);, g! w# ^+ y ]) G F5 o
- }
. y6 ?; h* X/ y: |2 R - $newData = array();+ \! Y- T8 f; K) g
- while ($data->hasNext()) {
& }' W5 w8 I0 t1 G' ^" { - $newData[] = $data->getNext();, W2 ?. W, x; s! |/ t& C
- }
2 u F% `" f) E0 q4 G - if (count($newData) == 0) {
7 W* h6 m8 T8 a7 L* N+ J6 r n - return 0;
4 w* u( n( _: U N: J; ] - }
" Q9 v1 Z. f4 V" j - return $newData;8 N4 E0 |( @1 i7 F T7 ~
- }0 W- `' i' f+ v3 r
- /**
7 y. p4 Y0 `8 Z0 A- P1 w - * 查询指定一条数据) k1 `, D3 p$ j3 ?2 V0 {' p
- * @param $table
/ A) E& [3 X; ~, b - * @param array $where9 p0 z$ Z. M4 @, N
- * @return int% A [& L+ r1 F% u4 r; _" y/ Q! J
- */
- \+ W$ u, Z- } - public function getOne($table, $where = array()) {" d8 T ]4 Y& w( v
- if (!empty($where)) {, X6 A4 K7 ~, F8 V/ }) D) e8 S, }
- $data = $this->database->$table->findOne($where);
/ J4 o' c2 T: R3 L8 f - } else {7 r' k" y; _! s i
- $data = $this->database->$table->findOne();
, [+ h0 l9 U$ I3 c) x" F - }( X, k m$ ] Y! T9 b" ?. k. r! _
- return $data;
- b" C4 C% N6 X: b4 j* Z/ C" z- U - }* J& M4 e0 z: Z
- /**
6 Y; ]+ n$ R2 Y0 U& N - * 统计个数
4 L: D, I9 K' r$ _/ G5 _, d$ k& ~ - * @param $table
% u& c2 |! r1 W/ `$ h* ]6 } - * @param array $where+ ?. \6 Q' q5 Z2 F& X
- * @return mixed- A I" j2 v2 N% t. d- U9 z2 i' L
- */
4 F5 }' ?! w; d) O0 ]1 _6 {0 W - public function getCount($table, $where = array()) { R; D& u3 [; Z0 g7 _2 A I. j8 [
- if (!empty($where)) {
! B3 M% x+ V" c+ s - $data = $this->database->$table->find($where)->count();
L' A* }# e s0 S/ Y - } else { w, u( T2 f" P5 `' C; G
- $data = $this->database->$table->find()->count();; b G0 u9 F! ]. g1 j5 C
- }1 s m9 X7 e! R! `# [5 D% d
- return $data;$ \$ x6 ~) I4 c8 M
- }
6 r1 X3 h) ]0 Q. | v- I! m4 @: |4 O - /**" W0 Q8 H3 v# m( |+ B
- * 直接执行mongo命令8 ?0 |; I" r7 u
- * @param $sql0 G) |) Z4 A) A+ i! R, ]& j
- * @return array+ n F1 h% J8 a$ M" X* _. g& H
- */
: X! Z q; c5 x# X - public function toExcute($sql) {& f7 n4 E) Y1 H* o a* G8 G
- $result = $this->database->execute($sql);+ T4 |+ i5 E# n$ b
- return $result;9 }- w( X/ G- L5 N
- }6 ]; t0 P) ~: w9 Z6 ?( u
- /**
! G& `3 r& Q9 Z+ t" {, ^& K M - * 分组统计个数) t& f& ~5 X- M
- * @param $table ?( ]! U1 X3 U/ G1 x
- * @param $where
, Y9 t+ p7 |4 `# L; J( f! P2 S- O# [8 X - * @param $field
" F8 W( O& g4 f8 H, a4 l. P - */
( \3 r5 G& s9 c/ h8 c - public function groupCount($table, $where, $field) {
}+ {/ W k# e$ g. \+ k' M - $cond = array(
2 M6 A8 F" u0 F$ M: t - array(
x' s% ?& N( F" ]% ?; } - '$match' => $where,- d8 f$ a7 ?- |1 w- H7 m
- ),% U. C7 B3 R% P8 u. Y
- array(3 _0 |* h I: }
- '$group' => array(
9 \2 L9 Z6 J8 Z# U8 b - '_id' => '$ a+ N+ X9 f" A# k- M4 |
- 7 Z& C" a$ Y. E
- . $field,6 e( V; W: x8 G1 J& h
- 'count' => array('$sum' => 1),7 p3 |, o; f1 W
- ),
% @2 l$ q% f) ? - ),
/ g w0 x" k/ u; y, ~8 U) C - array(
; h: r8 R- `) G4 e' _ - '$sort' => array("count" => -1),
: Y; ]* F5 i) p4 N8 z - ),
) h/ i! k9 D R' I) f - );; R j7 ?0 ^, S, S% @
- $this->database->$table->aggregate($cond);
2 e4 Z/ L V3 q% A7 q7 x# @ - }9 \2 S' Z* P p$ r9 u3 |
- /**
6 p* a4 w& P0 F) q& e I1 k$ N - * 删除数据7 R/ G6 ? d2 h( E. \
- * @param $table
% }& D2 w) L+ ?" t, c$ H- e - * @param $where
( g# C' ?; V0 N - * @return array|bool
% r; B/ L( I8 b% i H9 I5 z7 h - */
* r9 n. @! v8 p9 N q - public function toDelete($table, $where) {
. C- i$ W B: u; D0 b8 j' V0 k - $re = $this->database->$table->remove($where);
& _3 E0 J( p3 B: s/ u - return $re;. `0 C" o" q9 n
- }
/ D0 e) d0 K& [" A) Z+ M {" W- `& _ - /**" M8 b. m% D: g/ @9 l
- * 插入数据
! Z; I- |5 n' ] - * @param $table
- r1 f! H' q6 p) Q3 J+ u/ R - * @param $data
8 _! m! k! g! H - * @return array|bool2 h" U$ g( h# S) @
- */
8 N8 F. R |1 v8 e) A8 F7 q7 B - public function toInsert($table, $data) {
; x% @3 E! o4 E3 D# J - $re = $this->database->$table->insert($data);
, f6 l, T9 w9 v) S+ R" G: w! m, E - return $re;! L4 D# T9 k( X, `4 K
- }5 g1 a# _" @+ J4 y* |0 e) {
- /**
3 b5 L$ C1 Q7 J8 r4 [4 e - * 更新数据! V* m0 q& ]1 i1 K
- * @param $table L- j; Z2 \$ n- `6 B$ F" Y$ b
- * @param $where) r8 t% C/ y/ l" q3 ?6 ]
- * @param $data. ^. Z2 W N; ~3 ]7 a
- * @return bool9 Z6 y1 K3 y6 s) O( x+ i! L5 r
- */% `% E, O6 `; g- x6 j9 U
- public function toUpdate($table, $where, $data) {
; {$ O4 }. e4 j- C - $re = $this->database->$table->update($where, array('$set' => $data));
9 |2 g& E% M. j! u) o* k: o - return $re;
- R9 K3 Q2 B: P! E - }
( c( y9 p4 z- f+ q I, }1 Q6 E - /**
4 \: z3 [9 ?7 i( \1 S - * 获取唯一数据
5 }# s. Q. s; Z# e6 _0 U - * @param $table. i% z. N2 k9 n" |0 t6 j" [
- * @param $key
3 M& q# o$ @, l* W! W - * @return array7 |0 ^% t: L9 N& C3 Y2 M
- */
: \( C$ H/ l* X% x$ N - public function distinctData($table, $key, $query = array()) {
0 B- P4 v5 i+ ^) r - if (!empty($query)) {4 b+ Y* p9 {& x# h. R
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);; T' U6 m* |" U4 q; m$ ]8 Z0 E
- } else {: Y5 z( ^9 Y) P& U5 r) s
- $where = array('distinct' => $table, 'key' => $key);3 c( B% U/ H2 K4 T0 N# m" Z5 o
- }% |% ~6 K0 z8 M8 a( \# V# y$ T
- $data = $this->database->command($where);+ @4 I9 h; H/ `6 f w7 W
- return $data['values'];7 h' L" N( W/ |. g) b
- }
+ {2 n4 x* [; B8 P1 b+ m4 v' K' W3 { - }
+ {5 S/ D8 t/ j% A3 \ - ?>
复制代码
1 o. U8 a! T4 k. h l6 u, W& s
0 N8 \. R2 J- p% a3 r1 H# D: a7 ~/ } |