|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
Z9 h5 k3 m( ]8 z5 O' G模式自由。- W; y" f5 z: ?3 x. v) V
支持动态查询。0 V. _. k( H4 w
支持完全索引,包含内部对象。
# s) x# r- U3 H4 L: I) J! N+ f支持查询。
0 a+ K1 W. s7 |+ c( ~; f/ t支持复制和故障恢复。
7 e' D# H$ o5 X. G9 L& z使用高效的二进制数据存储,包括大型对象(如视频等)。6 j+ Q, r2 O \ a" D
自动处理碎片,以支持云计算层次的扩展性
9 Q. V# e* b/ V, }% d支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。* W$ r- j( C* Y
文件存储格式为BSON(一种JSON的扩展)7 Y- Y2 p% w1 a
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php1 N. k: i& a9 t# D/ Y* a% M
- /**
: C5 { y z: S0 p+ W - * PHP操作mongodb数据库操作类
9 G8 P: p9 c: y1 O/ Y$ X - */0 k% _ X* V8 q
- class Database {( ?( [8 P1 d" k' R, ?
- protected $database = '';1 }+ V7 \5 p/ I3 z+ c* W2 u* |
- protected $mo;+ L" ?* x5 ]3 Q; i! C
- /**
) t6 P1 @/ u- L- T5 y - * 构造方法
4 j. ~, X) z8 r9 h* w& P - */
/ \1 D% C* s2 L( u* |6 ~ - public function __construct() {
B7 N/ S0 e" V9 v# s0 x - $server = DBSERVER;
5 J' y# n! e; E% |- _' x - $user = DBUSER;; H, J* w( b* R |& z. e
- $password = DBPASS;
9 o. Z. L/ j0 h0 x - $port = DBPORT;
( N9 p* A# E3 N, n6 r1 C - $database = DBNAME;
- d. x' o! j$ c2 z8 \; A, w. C8 H - $mongo = $this->getInstance($server, $user, $password, $port);
6 @/ t" \* E6 K - $this->database = $mongo->$database;3 b' u0 k: z1 j/ G. E0 W- K: a b
- }
" V4 ~* Y4 \$ m7 P* L - /**
# Z7 m5 G% Q' o- [ - * 数据库单例方法5 {8 r% k& K* R0 Q
- * @param $server
: R" }( i# x4 ?% ^ - * @param $user7 V* V1 [5 {4 {- k
- * @param $password z3 T+ l; d4 h" Q
- * @param $port# B5 L: U, v$ G5 Y( F; [# e, Q3 J5 d
- * @return Mongo
+ x4 ]# K2 s6 @' m' e g - */! G4 E% P" X. F4 ]3 u& i5 \
- public function getInstance($server, $user, $password, $port) {, O1 B& Z2 r+ ~4 H9 c
- if (isset($this->mo)) {
5 F& B8 V' D( s6 b$ G- i. ? - return $this->mo;
6 v* O% S% y4 v9 \' W! G - } else {" F/ ^% E J; o3 o5 J0 ]
- if (!empty($server)) {
" _: ]% s2 G! I+ [, N0 ^. P - if (!empty($port)) {( [8 ~# K; {4 ?" I) ?4 f6 m! o
- if (!empty($user) && !empty($password)) {" M: j9 i [ k7 H, K% s! y' D: F
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");$ u9 W$ ^! |7 Q: |( K B% N6 q
- } else {
4 y3 C: v3 h: v% z& d0 v - $this->mo = new Mongo("mongodb://{$server}:{$port}");
9 A% Y4 E- R& i; n N0 ]1 y - }/ k2 V% ]0 [1 n$ V+ L' s
- } else {3 a0 b0 ?+ K) [6 Q
- $this->mo = new Mongo("mongodb://{$server}");3 Z/ c( ?* R2 @& y' p- e- O$ p4 o
- }
" w. i8 a% m6 S+ {- w - } else {, @& U. v# i* x/ i
- $this->mo = new Mongo();8 g# d- \" C; j; P5 W% c, z0 R" d: n
- }
' E' E! i8 L0 C* e - return $this->mo;
! h% u3 @% V) X6 V: l s - }4 B: R! n! r& A+ z
- }( I6 U& `- U% B! T3 l! q& f
- /**2 |( \7 q. K2 }% N1 ~' x: H& h! }
- * 查询表中所有数据! I) T" C+ ?" G/ ^6 o% D5 G' B
- * @param $table. ^6 ^. x! m+ a" h1 d
- * @param array $where1 S$ |7 y- N }% l U
- * @param array $sort. F. b/ G7 t# M! I
- * @param string $limit' r, p t8 ]! @- D7 q, \' }5 s
- * @param string $skip
, q+ `& [) Y" X7 i1 ~/ F2 t: X - * @return array|int
- m- D, x7 @4 w1 ?& v3 Y. A - */! |7 Z! i9 b2 j
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
3 L: _; `+ [2 X+ w: c/ ~) y; `! I - if (!empty($where)) {
- |) S) F0 N# A# t. U, p; E& P$ ?3 s - $data = $this->database->$table->find($where);
1 M; ~' C7 A, g+ x; @. h - } else {4 ]; m% `/ R' [
- $data = $this->database->$table->find();
6 x6 v* j% D" G$ l4 u9 _( N - }
+ ]5 ]- e7 _: G6 I9 @" q - if (!empty($sort)) {
: q) h/ k) M3 ~/ f0 j7 h; v- s5 M8 ^ - $data = $data->sort($sort);
, h0 L+ G4 c: W* o- G - }
2 _: f* @9 G$ b - if (!empty($limit)) {
c/ j _5 @( F% s. v8 ?; | - $data = $data->limit($limit);
3 \' y, T6 G) Z4 W) H$ v3 Y w - }
3 _) P- Y6 q& ]0 L - if (!empty($skip)) {& o3 _; ? ^, U. j
- $data = $data->skip($skip);& i- m% F8 M: N$ `" A5 H
- }* ~* z( ?- }- h/ w2 }4 |
- $newData = array();, s; L0 m$ G6 a- u6 q0 ~* W3 y0 ?: P
- while ($data->hasNext()) {! h; |) O6 _/ I
- $newData[] = $data->getNext();
( ~5 l3 s2 K, M! B6 b - }
; M6 P8 Q0 W- U' K9 t - if (count($newData) == 0) {
6 j! O% _- W2 q' Q - return 0;
4 M% G( J3 g, x! A - }7 K* Q: D, W" V, b* o( }
- return $newData; z3 O5 s; V* J/ \; p
- }
( N9 [( |, P/ V; j3 K7 m - /**
& V2 c! n4 ^+ g& @: c - * 查询指定一条数据
. a. }2 B$ v5 Y - * @param $table+ |% e) E8 q, I) _
- * @param array $where
* a' V5 ?) A( M - * @return int4 N0 T! H, A7 T4 z# u: Q; u( Z
- */! z& x W* }" y, w8 H
- public function getOne($table, $where = array()) {! N* q! y8 G8 t3 V! S( B
- if (!empty($where)) {
6 g. e$ I" S% ?! t - $data = $this->database->$table->findOne($where);6 G2 c3 Y, \" }
- } else {
; B0 b( C1 G: y- ^ - $data = $this->database->$table->findOne();
! P+ n6 c" r3 l7 |6 m; Y9 n - }& A$ h$ @( A9 }& A/ W+ U
- return $data;
# H4 @0 t/ w6 ` h* F* d O - }
& N5 J E ^, [7 |3 S, C - /**3 R6 M. w* F; E
- * 统计个数' [, A: L' n8 m. ~* y9 \, k( U; L
- * @param $table1 ~+ ?: d2 R8 q/ v" C, ]* Q
- * @param array $where( q$ m6 [( h Q) e
- * @return mixed
4 P& C+ {/ U- W* d* y+ [4 b - */( r( k1 ] S: N, f
- public function getCount($table, $where = array()) {# {. ?; ]" k6 E R; Z. f
- if (!empty($where)) {# ~: ~& S- a/ _- S# O" S
- $data = $this->database->$table->find($where)->count();# F9 ^2 ]. j8 O
- } else {! O1 ` y, V, |# u4 d
- $data = $this->database->$table->find()->count();5 v( d- e8 w# R# B) F) B! w
- }
9 r2 s8 v0 m; c: v3 ]1 H$ e - return $data;: C5 c& E) c6 ]" ?. Q9 w7 g% S0 Q* R6 P
- }8 g; N+ ]2 P0 X# Z1 { i; v4 W
- /**: u" Z! D, I ] ^5 W2 Q
- * 直接执行mongo命令
7 H, m0 \* F5 Q4 ~& c - * @param $sql
) `$ S" h9 p4 L/ g4 J4 w - * @return array! L8 J1 k* S+ m3 Z& {3 p, i
- */2 e: O* p! v- K4 U
- public function toExcute($sql) {( n4 |. |3 q. [9 w
- $result = $this->database->execute($sql);- E2 b+ t5 z8 V, x( ]
- return $result;. h% h7 X, D( D _$ ] _& I0 I# \# N
- }& u/ r3 C1 f; t
- /**
4 X( d2 c( S+ d, P/ D: k( r! C: I; Z - * 分组统计个数1 Z7 m3 f: b) ~7 L# c8 {" b# \
- * @param $table
* R; F" E7 x( B - * @param $where
! t/ {8 t! k) z9 y$ R* N, B' y - * @param $field
6 q q1 Q6 ]% Z9 z5 H - */
( |1 E4 q2 t4 [, s, q: i - public function groupCount($table, $where, $field) {% p& O& N, |* E' J1 Y7 e* x( X
- $cond = array(6 f9 A; ^5 R; S1 L9 S7 W
- array(5 o( T+ {8 ]3 K/ ~5 U& g, y
- '$match' => $where,
6 a! N- f1 J2 d# e5 C4 T - ),4 k1 Q. u! t( o
- array(
, g8 `' c( r; k2 M - '$group' => array(/ }8 i8 v# Z. G& `
- '_id' => '
" w w0 Q7 [8 Q9 B8 y/ f- l4 q - * _1 _- d% R. n/ L6 w
- . $field," o' U9 I6 I: _6 F6 {; `9 ^1 o+ L
- 'count' => array('$sum' => 1),
* Q" a4 [6 \" |) l- a - ),+ B# j$ [; j) g3 p- v
- ),0 X5 u/ K0 Y" L8 Z6 b- V
- array(& ~" o' b7 A7 Z9 p
- '$sort' => array("count" => -1),8 C, o" ?% i0 M8 G4 {
- ),
( z7 \" y8 W2 S4 c. ~ - );
4 P' i+ |, @1 ^. y - $this->database->$table->aggregate($cond);3 j. e9 I1 j& `
- }
+ B1 s2 ^" s8 H/ \ - /**
& h! j8 T$ m& h - * 删除数据
+ c: }% ?3 \$ k" e( P - * @param $table
& Y+ J, r; r' ]4 X% C - * @param $where
2 u$ \! r) ^0 k3 d - * @return array|bool
# h9 _* I; W: f: m2 U& W - */
4 }8 ]' L9 R& ~ | - public function toDelete($table, $where) {
3 @& l, g. r4 c! c - $re = $this->database->$table->remove($where);1 v+ v: s5 r I, w; T
- return $re;
4 W) Y1 V8 Y2 o- s6 U. n: u - }5 Z) h# k% L) ~. a c6 w2 o& ~8 Q
- /**
( W- w7 o* @8 \+ p; q& Q - * 插入数据7 h$ t( B( W% q( l
- * @param $table
9 j& I7 r$ `) ~0 | - * @param $data
) U% X) a: v' e - * @return array|bool: n4 V' }# ?5 v5 A# }
- */* }& K1 s% A7 D- E6 o3 r- b
- public function toInsert($table, $data) {
) b7 T6 b4 H& B( E - $re = $this->database->$table->insert($data);
0 O( r! `! q9 t" y8 w/ e - return $re;
5 ^. A4 V" t3 D, X v" F2 } - }
& t1 G* S+ x2 T: M; Z1 o - /*** b! h0 q6 ~+ B, l& Y6 @, n
- * 更新数据/ B5 \) J5 E) Y" [
- * @param $table
, P. v$ ?2 w" T1 P T - * @param $where
$ c3 ]9 a ]$ Q* V; W3 Y h. ^( T - * @param $data/ x; w3 y* C+ `8 t5 v2 l: n- v X' \
- * @return bool
7 j8 k! |, I9 P1 S - */, \: T( w: E; w7 [' O0 P* {* t
- public function toUpdate($table, $where, $data) {9 m/ Z" k( \( F, }0 o7 t+ X
- $re = $this->database->$table->update($where, array('$set' => $data));
- n; J+ Z! P) F. N0 w - return $re;3 k8 C" v* b; T& ^' t8 J6 _1 `/ z
- }% V8 X. K* I! {6 m2 U
- /**
2 N; ~! C- [) S4 i, U& n" c - * 获取唯一数据0 F; L. ]" |0 |3 f& ?
- * @param $table; k# I& Z5 K, H9 | w
- * @param $key
' }; W8 v0 c3 m- X9 \! |- W - * @return array
* Q3 j! X9 t; Y- G - */+ @4 h9 U+ r' ~# Q" l f
- public function distinctData($table, $key, $query = array()) {
; L( [: s# P( u6 u; G4 z - if (!empty($query)) {" [+ H# W/ M4 n. v6 n- h
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);4 G2 h& |' C' _) _
- } else {2 S$ k" Y e- f/ F) b3 T- J$ R# U
- $where = array('distinct' => $table, 'key' => $key);
# h3 M: }5 y/ E/ r }6 ]7 H9 W - }
7 t6 p( k! j8 L% ^7 r8 _0 K4 _ - $data = $this->database->command($where);) n/ Q; q- v7 I# s! | U8 B
- return $data['values'];
: d9 P2 A5 W7 i2 X( `& k$ } - }5 o0 {! |& T4 i3 w `8 u
- }2 U# V% E* P g5 I* Z( q
- ?>
复制代码
6 s/ l8 b* s9 e4 c& E8 H, p$ r3 } B8 U" n/ o
|