|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
' `& d# }4 O) f9 ~1 @) c% U8 {模式自由。
! \8 U6 T. x3 T支持动态查询。
' E0 O+ U; u3 A支持完全索引,包含内部对象。3 v' N. G9 L+ G
支持查询。, V# q2 j7 R6 p5 _/ `0 M# E
支持复制和故障恢复。
; v# z- g0 h3 U& ~+ R* x: D! e( P使用高效的二进制数据存储,包括大型对象(如视频等)。( u& k1 u- K: Y, O+ S5 f
自动处理碎片,以支持云计算层次的扩展性# ?$ s w/ E+ b; @' ?9 |5 {1 G
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ a( u; \, \4 A$ Q$ J, I- A文件存储格式为BSON(一种JSON的扩展)* @" s0 S# Z) ^& I6 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数据库的数据库操作类源码如下,仅供参考。 - <?php2 c" h- a+ ?, }" E9 i8 X2 U% ^9 V( P
- /** j7 s5 X9 q8 e3 F: q5 V
- * PHP操作mongodb数据库操作类
, s3 i0 R. V. K: F/ r' d A$ j; N - */+ F+ D) I8 G" C( e8 ^% P1 r
- class Database {
/ c# g% M7 Y7 f" b D - protected $database = '';
% Q0 ^ _$ ]! @8 c - protected $mo;1 d9 z i. z' J; ^; ] q' M
- /**
) I1 K: g8 D- O$ O2 C! u$ S - * 构造方法2 ]& d# N9 \' Z& o5 M0 t4 |$ v3 P
- */
' U1 M" q: W0 ?7 |* R3 S# r- P; n5 p - public function __construct() {
, W$ A, T. h7 j0 P - $server = DBSERVER;
' X7 p* \6 N; `# d - $user = DBUSER;' z4 i2 z* k0 E$ \% M
- $password = DBPASS;- r. {5 w B" O" M% U( W4 }' ]
- $port = DBPORT;
9 R& Z; W+ p/ w$ z1 ^( a& N! U9 Y - $database = DBNAME;
4 W+ G' M: Y+ }) U - $mongo = $this->getInstance($server, $user, $password, $port);- b% w, E! T" N/ [( Y: u
- $this->database = $mongo->$database;0 }4 ?$ c" x. G8 Z: w0 t8 b
- }9 N4 h7 M- ?- i' F
- /**
: f* h+ k: l a - * 数据库单例方法
; u# U. I5 t( J3 c ]% o; I! ~$ V - * @param $server2 C W" r) i4 e. x5 D8 Q% |5 R5 x$ f
- * @param $user
, g$ u: [1 s3 q8 V% O - * @param $password
6 i ]9 }& n, Q' ] - * @param $port
* Q1 d# x3 R- u2 }1 Q" T& c9 B/ X - * @return Mongo
9 I8 Y5 D: s3 s) E+ f - */
3 V* n5 [, ^9 r# F - public function getInstance($server, $user, $password, $port) {
1 V, F3 C" _7 i( C - if (isset($this->mo)) {
# G9 O! D3 V( z& t- d' A - return $this->mo;
# M+ L- V# S6 r: ?8 t7 J6 P - } else {; v* J% c2 x' S9 `6 @" N" H0 x
- if (!empty($server)) {9 G9 X" k0 i+ _( Z: D7 Z: l, B; j
- if (!empty($port)) {
: L, d" v* j0 i - if (!empty($user) && !empty($password)) {
# h0 Y6 f" y# H9 f' T# V6 w" t% K& s' O! D - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
0 y: M% c4 M$ ]# E& w0 N - } else {
- n3 n/ E- \% E - $this->mo = new Mongo("mongodb://{$server}:{$port}");- d% Z/ p( U5 Z% ?* W; Z8 c
- }
: u8 }0 ^8 p7 W; O - } else {
# C- O9 i, S0 H a! P" y - $this->mo = new Mongo("mongodb://{$server}");3 e9 a! e0 y- |
- }9 R- T! R% i* Q- k
- } else {1 b5 L$ ^7 m% `6 U4 F5 n) c
- $this->mo = new Mongo();1 K! p# b% k1 \7 F7 p! v$ l
- }
/ J& d6 n8 q* ]$ Q) o& ` K. D4 m - return $this->mo;! j; g; L8 P5 l" @
- }
! K8 `0 m, X$ y - }8 f8 M+ T" Z: Y9 q" _
- /**
0 K1 U# g; n0 t. k - * 查询表中所有数据
5 h+ I, N9 L0 \0 v5 _$ l - * @param $table( j, O0 F) S# d. |" c0 D% M
- * @param array $where
$ A" X2 _$ A1 m- k6 z# y! N, u - * @param array $sort; f8 ^9 U' s. a: w! l. z. F' R( w
- * @param string $limit& S& R! _1 S. u2 o" B5 U9 _
- * @param string $skip# H; j3 \' X2 ?# [
- * @return array|int; ?* D3 K$ U- T# c0 m( K4 ^4 |
- */
; x* Q7 U, E2 I3 v+ Z6 X: e - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
" I, ?/ d* I6 P - if (!empty($where)) {! w: c; B8 G4 d
- $data = $this->database->$table->find($where);5 b( [ p. {! N( P/ I
- } else {6 y% w, H5 h* D
- $data = $this->database->$table->find();
. m8 P6 \: c! \1 z Z. ~ - }
7 R$ A0 P7 H4 e/ M. w+ L - if (!empty($sort)) {/ E# J5 X- e0 Y
- $data = $data->sort($sort);) a4 L" O1 h. j; @# E+ {2 D X
- }9 [6 ?4 t$ |6 N" y
- if (!empty($limit)) {
' ?8 O* q! Y) B7 o( d - $data = $data->limit($limit);
4 w+ x5 H' `" Y* M - }# k# {, O7 g3 [7 |1 _
- if (!empty($skip)) {6 Y+ ^3 g+ ?7 p8 m+ Q
- $data = $data->skip($skip);) Q E% F" m: C/ I. m8 a9 e' e
- }% E& u! m# k2 T
- $newData = array();
" T2 Y. N+ d9 ~: ?- E9 w7 h - while ($data->hasNext()) {
9 n3 b& O9 d- G& T) ] - $newData[] = $data->getNext();
6 `4 S, o& j! m4 b0 }. b. d - }' u( a$ }- ]( z3 e/ h1 z7 J
- if (count($newData) == 0) {
; Y0 @ I! h/ o# l - return 0;
" N7 I* u0 k" t - }
! r* L( q9 J# l& j - return $newData;9 t, n: h" s5 t% M9 Y
- }0 F6 C+ J/ ~# M h k5 X" k* ~% }4 D2 T
- /**
: c9 v* V$ l9 T$ c - * 查询指定一条数据
$ t3 @9 j7 @& K5 ^ - * @param $table5 k* Y6 G: F4 A) U7 |( \) n
- * @param array $where
% t$ y+ ?$ r+ z, ~4 f# U0 l - * @return int6 q3 F' T2 v% Q& d& s
- */& u- J6 Q. j- Y3 f
- public function getOne($table, $where = array()) {6 L5 j. T# `1 N. G
- if (!empty($where)) {
0 w# U2 s$ H6 J1 o y( P9 G - $data = $this->database->$table->findOne($where);; N2 b2 g, N9 P" m, G1 d2 s1 Z
- } else { I4 \! y1 e2 `0 u
- $data = $this->database->$table->findOne();2 V z+ G% r& {9 M9 I) ^
- }
0 M+ N# [9 R- }6 F) j - return $data;
7 W. [5 n k4 q - }
9 J" r8 q2 x; E" R4 h) l( F - /**5 }: k+ f1 z7 N p! d# D/ |
- * 统计个数/ W! o3 ^# y' y: N: P- t- z
- * @param $table; I9 H" d) u0 m" p
- * @param array $where( a. f4 }" e5 F: U( e
- * @return mixed$ M9 y) g7 W3 X9 H3 z
- */
7 V5 R# @! o5 Z4 P1 ?: O - public function getCount($table, $where = array()) {
6 C1 `8 l+ I6 W+ }1 c' S( ]1 { - if (!empty($where)) {
7 X4 B5 B: n8 O/ p$ C - $data = $this->database->$table->find($where)->count();
! x1 N' _ P6 r; L4 D - } else {
y6 n4 R" d) L: p7 y) r" ^/ W% h - $data = $this->database->$table->find()->count();
4 l: N* v( E2 ~' d8 F - }
' I9 N" S- D* X- T) I+ q* \4 ^ - return $data;; A4 I0 K5 q& e
- }
* x) _* F& u9 q' ] - /**# Q2 r" A" p9 J! F7 R5 ~
- * 直接执行mongo命令7 U$ ]( B, y0 I b( _
- * @param $sql2 r; X1 m' S- d9 m" X5 r1 u+ s- L
- * @return array( T0 R5 }1 h' |7 G. n
- */
: F v3 U! s; f5 M - public function toExcute($sql) {' L( ~- c2 ?0 o+ Z+ W
- $result = $this->database->execute($sql);# r8 O& j1 X, U. I$ x1 u
- return $result;; u" T j- a$ v
- }
9 l* j& ~+ F* @, L. t# m - /**7 t' T, | t& [! W* e4 u7 |
- * 分组统计个数
. v E% H5 A* ^# y/ C w- j - * @param $table
+ \" e' _- k0 G. u' c' H - * @param $where
* T* Q$ B: ?7 I+ B# a1 Y - * @param $field4 w% L4 P" [" s6 Q- a3 O1 \
- */
! l6 k, [: v8 K& A( f3 X - public function groupCount($table, $where, $field) {
- v( O. a q6 h - $cond = array(! N) A) r6 H, {5 Z! R, U2 S$ d# ~
- array(0 ^# ?, G2 z- k6 ^. K
- '$match' => $where,+ P( U& ^; W4 }% ^* i3 F& \
- )," K5 r5 [$ T }. K, _. Q
- array(9 x: J+ o) x8 v' Q: a( e, L
- '$group' => array(
$ B. y6 q9 ^0 C: I7 u - '_id' => '; T. Z) c5 V$ G* c, ]
- ; i# H2 L( h2 T. `; ~9 [' a: J2 N
- . $field," t) V% ]" o6 c2 C9 q' b s7 b* |
- 'count' => array('$sum' => 1),' y; R# j5 Z4 x8 }0 A
- ),
A z9 {+ E9 X: \ - ), M i }. A. n8 e& r/ K
- array(
# `' [7 y. c! K# B/ E1 R - '$sort' => array("count" => -1),
1 p8 n4 Y* ]4 J8 L' F) N' | - ),
+ J ~' L( h4 E# V. b - );1 d5 L' @/ l" C0 {# z2 `$ O# p2 o
- $this->database->$table->aggregate($cond);" M" w d% Y9 ?0 N3 [) x1 |. o
- }
( d. e5 G; X0 G r$ J" d - /**6 N" D" m8 ~7 m" C. F) H, e
- * 删除数据% }+ k N! r$ l8 o
- * @param $table( X9 A9 w' g) ?$ V2 A% G) \
- * @param $where
: `8 X( x2 h: N; {4 N5 ^" V: c - * @return array|bool
+ t/ T1 Z, @0 h( R/ S* [ - */
7 d" d% W: r$ X% f; L9 x7 d - public function toDelete($table, $where) {2 u- C6 b% {; j) W; V' I
- $re = $this->database->$table->remove($where);: k& s4 W# _' S f$ N8 q/ v
- return $re;3 g6 U+ U1 v1 g( R) q4 a4 v, m5 T
- }
% o3 t& E7 q0 E8 F" [1 i# y - /**
Q+ X4 p0 `4 _! J: V8 H - * 插入数据* H$ D2 A& _* w/ e9 [, I0 v( x
- * @param $table# n2 Y6 q2 N# R* F
- * @param $data' F7 f2 C3 E$ z& U1 ?# v. V
- * @return array|bool
: A# [3 h e6 w) `( y - */# m$ ^0 B$ n5 a5 V7 G/ Y& ]
- public function toInsert($table, $data) {
: E z( z/ U. ^" C/ d - $re = $this->database->$table->insert($data);3 y& O; ?" e' Z% z1 C
- return $re;% d2 d' F7 e0 G, F$ [* p f
- }6 q4 _9 d" ^, v) Z! G
- /**7 T0 |4 ~4 g u( ^% ^
- * 更新数据
5 N8 w* C, G( j! i9 I4 A$ p - * @param $table
% m# t8 d) P; p - * @param $where. W2 B4 T2 k6 L6 A4 S
- * @param $data* v: `( A$ D* ^1 r9 B; ^; T
- * @return bool
8 N( Q0 P' [8 y- R - */
0 C0 g# f N! ?0 d3 C - public function toUpdate($table, $where, $data) {; j. A: x' `1 U k ?! T) j' ?& ]
- $re = $this->database->$table->update($where, array('$set' => $data));
# f/ v, E. b9 e$ S - return $re;; N; l" X# b7 l
- }* }( ]+ N* G5 I. Q( n0 g _7 l( w
- /**; v) ?9 F5 q8 h3 h- |! c& m
- * 获取唯一数据& m. s3 [& X* m
- * @param $table4 {, M, B% t3 v W
- * @param $key1 p0 w* D- f' [* ]* R& M
- * @return array( e" d+ s6 ~; X" o
- */" G- n1 S# g5 }6 b$ [) N# [7 o
- public function distinctData($table, $key, $query = array()) {
7 `4 j4 [( ]& b0 c - if (!empty($query)) {
& N2 ^& L- N& J; U5 C+ z, K - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);" ?! q! B+ b/ J
- } else {
: V+ `& w8 ?5 C2 m& f8 E1 z4 W - $where = array('distinct' => $table, 'key' => $key);! E& X6 ?' H+ B; F0 V1 W+ G0 U
- }" k. L& K I! E( \* r; ~
- $data = $this->database->command($where);& ^! i' | H4 B5 m$ j
- return $data['values'];" V( V% Y* I. B, W, w. { Y
- }
4 E0 ?3 D" i$ h+ ] - }
! f, _: v1 y3 T" @$ W4 @: @8 h - ?>
复制代码
1 n% H3 l; A3 S+ r8 ]' x
% D l0 s# A& Y# h' O @ |