|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 L/ e& Z. l# R
模式自由。
0 \% u g6 T2 l# c5 @- j支持动态查询。2 E: L( r' t$ i' f
支持完全索引,包含内部对象。
! \+ m/ m. R4 }1 ] R6 H& R支持查询。
6 J$ F! U' P& O) d; Q; F, B- S3 f4 p支持复制和故障恢复。: a6 x" c7 ^! X( k! x5 O# F
使用高效的二进制数据存储,包括大型对象(如视频等)。/ X) W- `8 V/ S4 l! s
自动处理碎片,以支持云计算层次的扩展性
% [, u d* ~1 [ P# l j4 o支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
0 P/ h+ N4 u% _5 M- w- |文件存储格式为BSON(一种JSON的扩展)
) A* a, I8 f1 _1 v可通过网络访问 所谓“面向集合”(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& G U* t2 r/ {1 G0 e6 L
- /**+ ^" T+ p+ J2 H. L1 _# g+ F
- * PHP操作mongodb数据库操作类
$ p0 X) ]- T# z, X. g - */
a/ x& ]/ U4 [0 u - class Database {
; `& O1 N- u" n$ R7 a1 t0 G+ h - protected $database = '';
6 Y6 B5 R9 l" P; I! [. R& n - protected $mo;. u# {/ q$ o4 s
- /**# E( Z2 E, S1 h% p% w
- * 构造方法
" k/ g0 H7 U i; y9 K6 b+ @5 r* [ - */
0 U$ N( J/ r- v& q$ J - public function __construct() {
& }: [$ D# ~) g2 t( p' z - $server = DBSERVER;/ ~- G; J1 P1 F1 _/ T2 b4 X/ ]( w
- $user = DBUSER;
3 I7 J* K2 Z* x- | - $password = DBPASS;3 O1 L5 C. Q; ^; f4 T. m
- $port = DBPORT;
8 Q; g1 A# Y9 Z; |" A - $database = DBNAME;
- h. f1 l! J: f. @ - $mongo = $this->getInstance($server, $user, $password, $port);
8 V& K0 M5 U) u7 M3 i7 U. E - $this->database = $mongo->$database;
; [$ {6 V, d' f - }7 ^$ b$ F6 B) c. I, H2 K) b$ \
- /*** C1 F4 V/ `' I) K0 W% j9 O
- * 数据库单例方法9 H+ n/ q7 |6 J0 Y! L' G' a) H
- * @param $server
2 B( o( _8 \' d - * @param $user
& a6 B" ?6 _3 {0 _/ r - * @param $password% `* s( i2 H; N# E
- * @param $port
* k. ^9 \) B- v# B, x5 l6 M - * @return Mongo; W$ C7 v; X: R. I- x$ @
- */% f- X: \4 |2 ?& l# F) S% d0 F
- public function getInstance($server, $user, $password, $port) {
7 q1 ^ v1 r! I9 u0 J - if (isset($this->mo)) {* U9 K6 `# f& m& e8 A- `
- return $this->mo;
8 Y3 U/ ]3 f+ o) S0 x \/ h - } else {
! \2 }# a4 S: d - if (!empty($server)) {8 j- @9 i: v8 a7 a' z8 f
- if (!empty($port)) {
8 B0 b( T3 l, b; Z% a6 m+ t - if (!empty($user) && !empty($password)) {# u x1 }) B4 [8 l5 h3 J: U
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
# b+ g1 f$ g. V U& N2 G# x; a, M& O - } else {
9 e' u7 H2 }0 F, c1 o+ c - $this->mo = new Mongo("mongodb://{$server}:{$port}");) C: s8 @0 ?+ v- _+ m
- }; [, t. `& L. {* l! {# q& X
- } else {5 j) S+ s; Z, g" ?' j& Q
- $this->mo = new Mongo("mongodb://{$server}");0 ]6 z% L( v8 [. ^0 p/ q) n" i
- }
: C9 s/ k7 C- [# V* C M; ?6 ^ - } else {
3 m. Q/ i) O, B" x V7 P - $this->mo = new Mongo();
9 v0 W6 z& t9 g6 H: N0 r - }
* u V6 i4 \ k/ [5 \# Q: D - return $this->mo;
6 n# a4 s2 \; v) a; t k - }
9 q( R' k* W1 k7 w. w - }
% d( d( [8 _3 J9 S+ t a; X* u: p6 g7 ? - /**
% G$ ] u3 f, p8 ^# p7 n - * 查询表中所有数据, e2 @* N* X# A$ t' e
- * @param $table
" S* v- k3 x7 h/ C3 p - * @param array $where2 R' e2 l# r6 K! c- `( U8 z" `* p2 g
- * @param array $sort5 f- |, d( V- S
- * @param string $limit
1 n, ]2 y- _0 S8 Y - * @param string $skip
* U2 G# }9 X2 ]0 K- {! t - * @return array|int4 `9 z0 _* Q4 D
- */5 w" L3 b. f) p3 J+ ?" Y; b6 j
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
v5 B% j) q: S4 R# C - if (!empty($where)) {
. @% e1 u* i- S1 S) T+ g - $data = $this->database->$table->find($where);7 P7 e. x" j8 ?! d2 v
- } else {1 \/ R1 U* E1 q/ U8 s' [
- $data = $this->database->$table->find();1 `* G6 x& Y' k! _
- }, H5 d' H( X5 ]
- if (!empty($sort)) {* y& v" }9 c- B* u" l5 r
- $data = $data->sort($sort);; ~# s3 @4 y4 c z
- }/ ?1 I' ]# g: \' E7 K
- if (!empty($limit)) {# Q: F! e. o1 s+ t, D
- $data = $data->limit($limit);: u$ Q" G/ N W9 j
- }4 R# X; m6 Q% f6 \2 m
- if (!empty($skip)) {
2 o. I# I' V9 _$ n/ n3 f( b% E) { - $data = $data->skip($skip);+ O" y* i: c# h# B
- }3 v% g* t; [8 p) I. F7 ^
- $newData = array(); R8 M& z# N! Y; c: l
- while ($data->hasNext()) {
* D7 I3 ]8 r4 s3 M; t5 v8 \, A+ x! e+ C - $newData[] = $data->getNext();0 o/ N& a3 i; T& k: G+ M8 D( t9 ^
- }7 |- j8 _4 E0 H! t5 w
- if (count($newData) == 0) {8 y1 F3 O! s8 j% q. ]
- return 0;9 I, M- _" I6 k; r M0 ]
- }
8 F1 n% T* e4 H5 u' G0 Z8 h - return $newData;
6 ]. i: h% W8 m) ?/ x: @ - }; s& R; ] n: X* c' o+ p0 d
- /**
9 Y6 a+ E% C% c, o - * 查询指定一条数据2 L# W1 `# E( I3 ~3 W% s/ i' ?
- * @param $table2 G# W) F1 K" r
- * @param array $where
0 U8 ^' B0 E2 Y+ O2 b" c - * @return int/ \" y; N5 F) n% |# |) O
- */. ^1 u, i( H6 p6 T" C# S1 A; z7 I5 {/ P
- public function getOne($table, $where = array()) {
- X$ u$ d$ a1 ? - if (!empty($where)) {" _1 h( q: k' _& o# S
- $data = $this->database->$table->findOne($where);
( j1 [3 B2 E" ~5 c5 q' t0 B; T3 R - } else {
2 y! j+ C& ^) K5 V) U' T - $data = $this->database->$table->findOne();/ M. S5 |9 _7 l, ~# j- i
- }' n% I, d. o8 a1 d! p0 D4 a& k# m
- return $data;( ^. Z4 J5 |( g6 z* F5 f
- }' u$ y/ M3 P" N/ f- ?7 @3 C: y
- /**
8 s5 s+ ~6 [4 m3 ~ - * 统计个数2 P, d" H1 k) N; H
- * @param $table) l3 t) m. S2 v
- * @param array $where6 R7 r7 @1 ^; c' O- C9 |& s
- * @return mixed
! b2 F) r% q; K9 s - */: u+ P6 P; T+ j! F3 n( H$ t" w' a
- public function getCount($table, $where = array()) {5 J8 e5 N6 C( }& D* J) z
- if (!empty($where)) {
8 L2 h. a! M- T1 }& k - $data = $this->database->$table->find($where)->count();
! G7 ?7 {* F, u$ a# d9 m6 }$ A9 ~ - } else {4 G! p) a" ~% p( q- L
- $data = $this->database->$table->find()->count();* q0 a9 e2 M4 a p6 M: S/ c& [
- }) e* o- u) _2 U& g( o& S! O3 Y" y
- return $data;
) L9 N5 O5 h- o# X; j" P ^3 G: F - }, p, P7 ~3 K* M8 K: y- U" d+ y
- /**/ ?) ^2 |0 t) O5 R
- * 直接执行mongo命令
9 {3 T" V; s4 W( E/ t3 @ - * @param $sql% l0 a- z3 q' v( I, l9 ~5 |2 m( M
- * @return array# @3 n! L1 O4 G7 j5 }6 J8 M
- */6 K4 f) z, @. m5 ~2 m& U+ W v
- public function toExcute($sql) {
9 J' t" l& X# }6 y' X. I - $result = $this->database->execute($sql);
# f- m. Z8 O& l2 ? - return $result;
( u9 B6 q+ F- h) z- D% n - }
0 u8 S" F; X0 A) ~8 V - /**
4 V; s/ L5 G y$ P* o- s - * 分组统计个数. {, ] g3 _& ^8 G6 Q0 e5 C
- * @param $table
( Y. {& k# P3 p6 w5 W T1 {7 _ - * @param $where
% _( a' u) I( O. J& T( a2 `9 n" x, N - * @param $field
: ?( J8 q/ i$ `( N, Y - */. p1 Q7 y% m% O2 f
- public function groupCount($table, $where, $field) {
$ ]. I/ y) ?- d - $cond = array(
) S$ o: `/ u7 j) ]" W - array(
8 M! H* i' g1 D3 `8 S, \. c% d' W - '$match' => $where,% e d& D3 V* _5 ?( O# M5 K
- ),3 P* ~5 }8 D4 |& O
- array(1 h8 O0 l; u+ }7 ?% A) Z t
- '$group' => array(
) @: ]. D% h- B$ y" N. }' r$ X* e% i - '_id' => '9 X- ^/ r/ n2 [/ Q! S: x& j K1 ?3 t
( T# W' b6 O' h% H7 V- . $field,# B i: p m. d$ e( M
- 'count' => array('$sum' => 1),* d, B; x! r4 ^6 ]
- ),
' I, |8 t+ [+ x/ C6 } - ),9 D" M6 ]: b/ [7 U* v8 D+ o: {
- array(0 W3 i, x! G- d# T+ Z8 C4 t" ~$ y& H9 s
- '$sort' => array("count" => -1)," ~" m# J6 Y4 M' `1 X; {6 o
- )," R0 i& H& _" h! _$ Q2 a, l
- );
% O ?; N! q$ r - $this->database->$table->aggregate($cond);
7 j$ R" ?7 f, k2 m: g - }
1 N9 T% y$ [6 l4 B L - /**5 g0 z/ m' d- V3 g2 M$ f) N; q% [
- * 删除数据
, ~4 \$ m0 f6 r1 v* u. |8 h - * @param $table! D& t! R! K8 v, R8 l2 g
- * @param $where
9 @( L9 v. O* n- ~; ^( a% ^ - * @return array|bool6 K/ |( ]$ h/ K( B' J, R1 l
- */1 S! t! S- X: |" c$ B$ F' p
- public function toDelete($table, $where) {4 z$ ]; T7 n/ w& w& r
- $re = $this->database->$table->remove($where);8 M' z. O/ P' z6 s7 X4 ]+ o
- return $re;
$ W6 w4 _# X1 A: w( ^ - }
0 {- G- Q* }. N6 O: A* W* r - /**
: y5 k( c* `3 U5 I ?( I$ h, n - * 插入数据% N% i R- M0 V
- * @param $table
' E* t) n; ]0 o$ c - * @param $data
& D$ q! Z$ G& N# p0 @ - * @return array|bool
o& |" B$ z7 l: s - */
9 E7 h& G% @# H% g& u - public function toInsert($table, $data) {
7 H5 e& Z2 y+ {& u& x3 X5 G - $re = $this->database->$table->insert($data);
0 j1 z% P; P: l: h0 B" R3 I - return $re;% k' [5 `) _9 h" w
- }
b2 b9 ^4 n- b- T - /**# O) ^1 z% ~9 y& @2 ?
- * 更新数据$ C8 a3 Z4 O! y' Y1 r7 q
- * @param $table
0 ?8 H- w/ C! ~3 Z8 P- o g - * @param $where& o% ~: z0 p( C- \% I$ m& s
- * @param $data
N7 P+ U9 b6 p; a5 I - * @return bool
3 @8 X$ I) v% P: \. | - */% V J: H W. i, N! i+ X% N f
- public function toUpdate($table, $where, $data) {* O- I0 |: j) c) a% L" V% R
- $re = $this->database->$table->update($where, array('$set' => $data));& W' f- b; `1 A& P! J7 ]2 w
- return $re;
% g$ R4 X! ]9 K - }
& e! h* N2 V$ m# o - /**( ?$ n( l% A( V( q
- * 获取唯一数据
* ]4 K& b% d6 A) V - * @param $table
$ r3 Q5 h7 s1 Q$ ~! N& y - * @param $key
* @& P; E; k4 }, z% J - * @return array5 L* ^/ s; v# X/ a
- */" @0 h5 e6 Q) V s
- public function distinctData($table, $key, $query = array()) {% Q$ C3 n/ y" c4 U: k
- if (!empty($query)) {3 `! Q. ?; h& U% p$ S7 m9 u3 Z
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);$ c# |+ u" Y8 ~$ O$ }" s/ @+ x
- } else {* x7 ?. H* r1 i; @6 {: t5 r" P9 I
- $where = array('distinct' => $table, 'key' => $key);- M/ t x! r3 A& ?+ E9 R
- }$ E2 C) Z; R) t7 I& z
- $data = $this->database->command($where);
; f4 t+ Q) ` X4 Q1 m7 g4 Q - return $data['values']; j6 s$ l' G+ j
- }
* B! R5 ~ D/ }) d! ?/ m5 k - }
0 a/ u+ L4 y! E6 I! v% r( W3 Q - ?>
复制代码 ' O/ a; k# r( _, ^; u4 L$ s" F5 Q7 E* y
* Q# M5 ^) I- r& c8 ^4 ~: c4 }$ m |