|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。4 |3 Z+ U M6 s+ G% \
模式自由。& v, R+ f3 G E V+ a4 E
支持动态查询。5 h& Q j5 R- ^- T, X, D
支持完全索引,包含内部对象。8 o. K5 y* O, j4 B
支持查询。1 {5 ]3 `. n x7 x
支持复制和故障恢复。
) x9 m+ Q3 T) k# L使用高效的二进制数据存储,包括大型对象(如视频等)。
1 Z4 k" L/ G7 ]1 [) J2 o自动处理碎片,以支持云计算层次的扩展性
2 h, b0 ^9 Q8 ^. S l支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
6 @/ H- C! V; M, c- F文件存储格式为BSON(一种JSON的扩展)
" j/ U- G$ \6 k; 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数据库的数据库操作类源码如下,仅供参考。 - <?php, g3 Z+ a- z# ^3 E2 ^1 Y2 z2 H
- /**' U; |# K9 b6 K& U; F/ f" G
- * PHP操作mongodb数据库操作类. V: w* L* g B4 ?+ X
- */& l8 C0 E0 {+ G. [+ T
- class Database {
- d' K) |( y1 j7 l2 a& b - protected $database = '';
8 T4 ~8 O: F3 q% h5 x+ I" q - protected $mo;
6 C6 E' e8 p3 P7 T! \% a# S - /**
& f* l, y6 f6 V9 r0 }& {% Y - * 构造方法
4 [( K' @ h8 V8 J - */
) S0 H* k2 q8 E3 s" g' E - public function __construct() {1 ?4 \) Z) t" b2 T5 k
- $server = DBSERVER;: K& z' A. t; `8 ?3 U) {3 } r
- $user = DBUSER;
6 ^5 ]4 G& O' q: q @ l - $password = DBPASS;) t7 q% _$ n, |% N1 g
- $port = DBPORT;' {9 p: t' G @ h( ~! K
- $database = DBNAME;
& l% C- M' i. Z( f - $mongo = $this->getInstance($server, $user, $password, $port);0 S" t2 c7 S. n" b8 X
- $this->database = $mongo->$database;6 G5 v: G$ Z& P( R
- }
( M* `8 R3 i5 s2 ]8 l6 Z7 ]+ K- Y: y - /**7 j/ ]6 J: `, A$ e1 H Z1 T* g8 k9 C
- * 数据库单例方法
/ d1 Y' O* F8 i$ G; x' t$ [/ U8 V - * @param $server
6 {* x' D- [8 H+ L - * @param $user/ V. }' I+ M' V2 x! x
- * @param $password
7 z6 ?9 J# n( V! b2 O! h) T- U8 X& _6 p - * @param $port8 M# B3 i5 g0 d9 z
- * @return Mongo4 A2 b6 G: f( l6 U( {: H: c# v
- */; R6 z9 l) p; W0 T2 x3 n
- public function getInstance($server, $user, $password, $port) {
6 V; G" `7 ~' P& ~3 Q - if (isset($this->mo)) {
: b4 i" ]1 R1 ]* j - return $this->mo;& Q/ j( z% l* B
- } else {2 K( P, R* W( ]! B2 V# A
- if (!empty($server)) {) }( k" B c) j) C$ V
- if (!empty($port)) {$ ]! K9 d; @$ |6 a+ G; _& _
- if (!empty($user) && !empty($password)) {, D" f4 ^* v9 P$ r
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
- g! N1 h- T- B1 ?) b' g - } else {
: x8 V _5 v0 _7 h7 q7 } - $this->mo = new Mongo("mongodb://{$server}:{$port}"); \" ~2 w2 z* x2 g0 Q
- }; F- d3 P; `! X1 J: u' w: h
- } else {
7 U: k% A4 X1 b- u5 O - $this->mo = new Mongo("mongodb://{$server}");- x- A4 o% E3 P/ N8 b
- }' t- X5 n" a( N$ {8 x% H: S- I% T
- } else {1 J4 K$ f! p' O7 G. a Z
- $this->mo = new Mongo();
, D `/ m; l# @ q& Q. @' O - }! R8 a" N' L! @3 ~& W' l D6 y
- return $this->mo;% \8 u+ g6 G5 E
- }
/ a0 ^, E- v0 t x) F% h9 Q8 T - }! X( s N- k5 m, R) Y+ j) D% J
- /**- b5 j/ B9 W; y
- * 查询表中所有数据" Q+ i* l) c- X& ~$ ^1 y ?
- * @param $table
2 N$ h( F* d# |% U - * @param array $where/ T3 x2 n$ l9 l% [
- * @param array $sort
7 f W" d6 k; ?9 H, a. m - * @param string $limit
1 ^& c! j% |4 y6 { - * @param string $skip
* _, V0 R! F- o - * @return array|int5 e |+ |1 g6 s, F: l
- */
$ H% o/ ?9 i y- c/ o - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {' l# g3 E3 a4 x" e! i
- if (!empty($where)) {
, |# S7 ^. I# Q0 Z8 |; S8 R - $data = $this->database->$table->find($where);1 z* G( R) Y4 J5 k5 E9 S0 ?$ |4 @/ v
- } else {' y' A1 F% k0 F: _
- $data = $this->database->$table->find();3 v" R* {* G1 Z; y+ E
- }, A! m; A0 P7 F. p
- if (!empty($sort)) {- Q( d' n# ]: k8 [
- $data = $data->sort($sort);! w8 C' |+ q' G, ?/ X
- }
- p( l" |/ K; I - if (!empty($limit)) {; j" F k; X1 W4 {! f( j
- $data = $data->limit($limit);
3 \: `# [! ~& w) Z/ a! ` - }
+ r2 H/ n5 N/ X1 y+ P4 |& j; O/ ` - if (!empty($skip)) {( B- x5 X' ]3 b0 Y% F
- $data = $data->skip($skip);
7 L5 z$ ?! I, v. _! W7 s' L+ a - }
# D6 x, Z" w* W; |7 E6 k* f; Y3 d - $newData = array();
% D, z, _$ d; x - while ($data->hasNext()) {
; `$ K K& H* r" `# v+ l) y - $newData[] = $data->getNext();* v" [% @& B+ R' _
- }
" ^* H3 M8 b3 f/ A" ^$ A* J& v _" B - if (count($newData) == 0) {
8 k* z% t8 ~: x: v- {2 A5 | - return 0;7 W, p9 v4 S+ ~4 b
- }
# ]: y0 K3 u% Y/ y - return $newData;0 h9 n4 O% v% f! L6 U
- }
5 u) g l7 F$ l' K - /**" p% A8 y% z* J3 G, W( _
- * 查询指定一条数据' J7 ~" B+ q. k. b/ g" O
- * @param $table% @3 r5 g0 \1 u6 C: Y# b
- * @param array $where
# U) u& F1 }9 t% Q! E- \4 Q - * @return int `+ R7 F* Y, C. L& s% _ X
- */, s% w4 V- s5 \- s+ r W; x: P
- public function getOne($table, $where = array()) {3 L1 U$ F1 P( s% A4 M
- if (!empty($where)) {. N" {+ K* q- Q/ A* h* j2 k" m
- $data = $this->database->$table->findOne($where);
; F# K, K2 ~% g* g9 } - } else {, x6 U( X7 D9 g( B1 N
- $data = $this->database->$table->findOne();9 P+ Z4 V" Y! A1 ]3 G9 w" |! g
- }& z& `; }. M4 X4 n$ H+ u0 m
- return $data;
% t& [; _/ j+ d" d: f4 g, ` - }, f1 @% x' U2 \ ^9 E$ u
- /**9 m* h& e* ~- h: [3 e* t9 ?
- * 统计个数
) |' |- n, N* } - * @param $table+ M/ t7 N3 i: N/ d" B* q, P6 [
- * @param array $where
* c$ w% Q: g# a8 I9 O) ]1 K - * @return mixed% N2 Y7 y5 Q8 n x, b
- */
5 i" q. C& O7 D* O7 f - public function getCount($table, $where = array()) {0 Z& s4 }; @0 z9 u$ e5 o
- if (!empty($where)) {9 ?) x/ t: H& F( Q' H
- $data = $this->database->$table->find($where)->count();: p% x; A" k }& Q1 Y' }$ K& g5 ?
- } else {
N g9 Y4 q" j& R. j - $data = $this->database->$table->find()->count();
. M5 A$ Y9 {1 R9 H - }* y9 A4 |7 z: ]6 a- I! q; C
- return $data;
4 n/ N, g% O1 L2 B5 G - }
2 ]7 ]8 Y4 U0 l4 L' J: Y/ ?% z: C - /** Y7 e, f- X2 |8 K, _2 J
- * 直接执行mongo命令( G& T3 I7 t/ S' u r5 K
- * @param $sql
$ M+ i- e/ d) X) }, s2 ^ - * @return array* k" v& G& U+ D9 ~' I- v" d( i. r/ r
- */* R' x8 K/ E. Y8 u! E
- public function toExcute($sql) {* N: V- B. H; V/ B/ d! G% \4 y
- $result = $this->database->execute($sql); c9 B. M- H0 c+ ~" o( r# X9 X
- return $result;9 c: R( @& ~* A3 p1 ?5 u
- }5 O* M! F. O& F- F- |
- /**3 I+ \: j v0 y) m. \
- * 分组统计个数0 B% Q: \# n7 U; q6 n5 N, C
- * @param $table( m1 M' q3 v, y' A% ~
- * @param $where- B- ~. e* r6 B+ g1 ?& C
- * @param $field
8 B0 H" g1 f/ j) p: s2 d* a( R; T - */$ w/ p& _6 |- e1 I
- public function groupCount($table, $where, $field) {
# @/ B7 @4 S: B+ e - $cond = array(
8 Q0 q3 f" C N- Y7 [( g - array(
0 ?# C& ^; E$ F9 ^$ K2 {9 a - '$match' => $where, m3 c5 R' e3 G/ R" g" b' J
- ),# P8 s. k6 U6 s- K
- array(
# G) [* P7 J. ]/ j8 R& \; S - '$group' => array(
* ]) h; O3 J" @& |1 e$ n! m+ v" ]3 t - '_id' => '
8 Q' ?/ w! x8 L$ R+ W H* V - 9 t: T/ `4 m6 O/ O, W$ w7 Z7 H
- . $field,
" q+ w. r6 }- J; | z/ Z - 'count' => array('$sum' => 1),
% R1 i6 M) G) z! _3 H- K2 u - ),
* J4 [0 l6 H2 j( y - ),% l8 A8 \8 A& }+ v' W
- array(
9 D' ?0 _' m8 F$ V - '$sort' => array("count" => -1)," ]4 K y0 R3 l" i. ]
- ),
0 e* F8 [0 p' c. X - );
L6 D# M# ?+ V1 f - $this->database->$table->aggregate($cond);
8 X0 p7 l& j, J! E$ Y8 e; z - }
6 T5 M3 O4 `+ I8 c: `/ c: p - /**
0 H$ n3 w/ |+ f. L" O: z0 z - * 删除数据
5 N& C6 b" R) q8 `* P! k - * @param $table
# x, ` O9 y: u& a6 P - * @param $where
* k, S% v# ]" Y8 h - * @return array|bool% r$ _; y- R! j/ J' s6 H% p4 x% p
- */* A c) ?' \6 q5 B0 I
- public function toDelete($table, $where) {8 q7 s/ t5 \: K' S
- $re = $this->database->$table->remove($where);+ W( |3 }, g b/ Q- O
- return $re;
) z5 V/ S& @) f4 W6 o! C - }2 X# Q1 N' c, q% r3 O# H
- /**: a" K. U8 D/ h6 G! [4 z ?8 Q7 c
- * 插入数据
; F1 O/ U3 g) E! U - * @param $table2 {7 o/ w! E1 O5 P2 ?: L* t
- * @param $data
4 \. k! }" {) X5 t+ X2 c - * @return array|bool5 w$ Z! A5 D* R% a
- */" s R" K; d$ u- ?" \' E6 i
- public function toInsert($table, $data) {
& {2 J1 a, `/ W- A& [" { - $re = $this->database->$table->insert($data);
1 k, i4 k) V4 n/ S0 R, z - return $re; M* x! }- E* j6 d
- }% c- j" D+ D. Z( s
- /**
. e, ^2 i2 ?" e$ v5 p - * 更新数据
0 y7 h8 A' P8 R/ g7 H% F# d* Z2 C8 W8 o! U - * @param $table; ]: S7 `9 ?/ q# g
- * @param $where
: N- L! f/ H/ n: T! F2 K' x - * @param $data( }! {# J! i4 Q# P# G
- * @return bool" E5 a8 @: }* e" B2 {4 b9 Y1 f" X
- */
0 ]% a# [' t8 e4 F9 U - public function toUpdate($table, $where, $data) {
) Q0 g/ g z/ n4 h9 w, Y+ l: f - $re = $this->database->$table->update($where, array('$set' => $data));% J% V+ Y# p2 b. T
- return $re;
# R3 X8 A4 m/ H# z6 h9 S# G - }
9 }9 F+ S+ i# a! i3 L! ] - /**
8 a5 f7 |2 b# ]2 C$ q - * 获取唯一数据- z) z! s5 E1 Y b/ \2 t
- * @param $table
4 q3 m3 L" }$ J& q( K7 j - * @param $key
9 X$ F: h* W) c7 Z - * @return array
[/ H, N2 T! l" _2 B" l - */7 W6 Z* j0 L0 h: b
- public function distinctData($table, $key, $query = array()) {
# ]! v9 V. \- V* ~ - if (!empty($query)) {
: p" Y+ |4 J0 o) [( x B J$ W& D9 s - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);9 z3 E9 S0 Y/ d7 g
- } else {
* W2 K$ c- M3 u' @6 O - $where = array('distinct' => $table, 'key' => $key);
9 p5 C0 [/ N7 E: g1 R+ D - }' h, s t$ a4 s9 ?: N
- $data = $this->database->command($where);
/ d' T+ ~* {+ J1 G& G" F - return $data['values'];( T0 c, H' N5 W
- }: \! G' }: P" k, v. p3 Y2 n
- }
5 n* |% H( n' E; t7 V; C* U - ?>
复制代码
' `( v3 b# D4 Y2 y1 t" ?" z" N% o4 e6 K' Q
|