|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
$ q/ X* t, m0 S% ]" ]+ F模式自由。3 N! B1 f& G2 o x" i3 g6 z
支持动态查询。
: B! v$ W" w3 v3 `( A1 U% t支持完全索引,包含内部对象。
: f* Z8 g1 `# R$ L3 d: F" V支持查询。6 f- q+ d9 k! S, }' [# R7 o. P
支持复制和故障恢复。 c5 Z. M: t# O( N% z: y
使用高效的二进制数据存储,包括大型对象(如视频等)。
5 p5 g& P/ u f @% [自动处理碎片,以支持云计算层次的扩展性
7 `8 j: O, W( H5 r支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。3 n" o I3 T4 [/ r! D
文件存储格式为BSON(一种JSON的扩展)
' v4 A2 _4 w' }8 q2 N- S可通过网络访问 所谓“面向集合”(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
: t8 d6 s! c {& t* w( i, {* G - /**9 T) ^5 x2 U3 L
- * PHP操作mongodb数据库操作类2 d' ]9 Q5 j! h. l& m
- */. V1 q) m8 F: y
- class Database {2 s. R/ `/ u' s" b a' b& b0 i: {
- protected $database = '';+ w% w" k: L$ n' F6 c
- protected $mo;* R+ E; G/ h( ]- m
- /**
, T. `" B! ~2 x* r# p - * 构造方法
9 ]7 I. J- w8 F& r7 d2 g, Z( X6 j. W - */
0 {5 _/ o z9 X/ ]+ R* d0 V - public function __construct() {
, o6 s1 C- ]% i% g+ O, s- H( b9 @ - $server = DBSERVER;) N, n. G2 o$ z8 T' y& E
- $user = DBUSER;
5 J0 s( b$ v% z6 l9 [$ k - $password = DBPASS;
% L2 E3 _# A$ p7 _# t( e - $port = DBPORT;
9 T/ ]+ q/ m" d - $database = DBNAME;: m+ N5 K q4 v' J% X0 g% D5 W
- $mongo = $this->getInstance($server, $user, $password, $port);9 w' N4 u( m8 _4 D5 j5 ^
- $this->database = $mongo->$database;
b7 V: b7 R4 u2 u' Y+ |2 D8 ] - }2 p c; k- n% ^) k/ Z6 P. u! X
- /**: w% J% U" d8 A( }' c* b2 r
- * 数据库单例方法0 x' V9 K4 v+ t4 h z% r$ C
- * @param $server. d! M4 X5 ]- @7 [7 @: {9 r8 O
- * @param $user
. [' k1 g: Z7 [ M# w* l* v1 m* U - * @param $password; \/ w2 C* P: M
- * @param $port `$ f8 E/ F1 C \7 O3 V* `
- * @return Mongo9 t3 g6 o! K, M/ {
- */" D! x- Q+ p/ J3 @, `
- public function getInstance($server, $user, $password, $port) {
" b4 d' |8 D7 {8 Q, n - if (isset($this->mo)) {$ @. `( _$ L W# e, i4 d/ O: f
- return $this->mo;
" U+ _5 c4 F1 ~ h* O! V7 v - } else {
& ?7 f- n% F- {' c - if (!empty($server)) {" s. d- l8 T5 H0 X* M+ k5 b. X7 Y* ]
- if (!empty($port)) {
l. J( A9 X9 M0 n - if (!empty($user) && !empty($password)) {8 |5 q. \) w9 I
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");( K6 P5 d6 c4 `, V& S" d. M1 d: Z
- } else {2 P! E, w0 I: K
- $this->mo = new Mongo("mongodb://{$server}:{$port}");) R2 |8 E# U: I, [( k
- }
% X. H) z3 V* O; b6 t6 e M, G - } else {
. {- o8 q. `9 K6 ~ - $this->mo = new Mongo("mongodb://{$server}");2 y3 n7 r! Q7 @& d
- }5 h% K8 _, O6 @! D' X2 _, [3 U
- } else {* L& r+ `6 l4 [ k4 z" H6 \. T
- $this->mo = new Mongo();& @! g, b3 j# A1 L3 X( ?( q
- }
3 e7 D0 _7 r, {# }- W ^6 d* N - return $this->mo;
) _9 S% C1 a5 S+ y- f* C8 W3 o - }0 m) q0 w8 b* J$ Y0 [
- }% h3 F+ s) M' ~
- /**
0 S+ v3 B# g8 f - * 查询表中所有数据
/ ^' g1 a2 C8 Q% {' t1 I: a2 Z - * @param $table' S- @, w0 t% q3 N, |. I* l
- * @param array $where+ N: @3 V/ N- S" X* `
- * @param array $sort
: K3 j( Y2 t( p. Q f* P- k$ P - * @param string $limit
' J; n' g, P' A% U" E# M! F - * @param string $skip
% X$ ]8 e# h. \. I4 b - * @return array|int6 O! v9 j* A* U. \2 w, i
- */
( K1 T% ^: p+ }/ B - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
8 `# p6 H" m7 L9 Y+ h& H# W* b) O - if (!empty($where)) {
6 N2 O3 Q" R1 ]+ u' u; Z - $data = $this->database->$table->find($where);
4 P! n* l$ q- s( h+ u- { - } else {8 ~; h. G1 A' b6 P/ o
- $data = $this->database->$table->find();
3 [& I ~' n% s - }+ V( U6 h, n8 h3 u) y
- if (!empty($sort)) {3 n4 R, u; F5 c7 w
- $data = $data->sort($sort);
1 ]2 C6 s' `, `$ S - }
: R* D- ^( i, k# t - if (!empty($limit)) {3 x8 p4 D9 ]3 D5 k
- $data = $data->limit($limit);4 ]) e4 r' l# e& d1 a' I
- }
" E9 N' J \' W9 d" q- l - if (!empty($skip)) {7 }+ P1 N; R9 X6 B e( K( C
- $data = $data->skip($skip);
% i$ s* z9 r/ h; z- _+ L; | - }$ A- P' z f$ ^! ?4 w
- $newData = array(); L* G. n. L- |! @4 j, e4 ^* |
- while ($data->hasNext()) {
5 u/ L4 G. D3 M g6 D7 | - $newData[] = $data->getNext();$ X q; d' {, f4 R
- }
" L w. @/ c' G( g2 ~$ d8 I# v - if (count($newData) == 0) {
8 ^% `9 c @( r$ y+ o - return 0;
$ G, P! g4 S. A" `6 c: M! I - }
; N B( A8 v' C. L$ Q8 x - return $newData;. O4 \+ h" U; N2 S) }" H4 e( [
- }& n) \+ i# q* ]& E8 W+ z5 w
- /**% C9 I% i) @5 g$ E7 o7 p# W
- * 查询指定一条数据
/ I* V* ?3 |; \ - * @param $table# j7 j; P: `* S8 K
- * @param array $where
/ T& @+ U ]/ Q3 C) t$ l0 j - * @return int1 T: E$ A, h1 s$ Y
- */" t0 D# J3 n; n' H5 }9 w
- public function getOne($table, $where = array()) {
; `" q! u/ g, \- K! d& R9 I - if (!empty($where)) {8 x1 R1 n4 V* S4 q6 ^5 `- H0 ?
- $data = $this->database->$table->findOne($where);! ]8 m6 ^! _; J: ?
- } else {9 c* |9 B6 M1 m6 w' g8 C( e
- $data = $this->database->$table->findOne();
|6 Q1 B5 L8 n N, Q* k T/ j - }: v) e _/ w0 J/ Z: W" W+ Q1 B* m
- return $data;0 @# _8 n6 E# i& G9 S8 |. h$ {$ f% }
- }, T" F. O, j9 v& u) z, v' j8 l" a
- /**+ R0 l- U1 Q8 Q5 K' K, I
- * 统计个数
$ ?4 S" g6 X9 h y* r2 U - * @param $table: m% }7 u( ]) |
- * @param array $where: ?6 V/ b- z& ?7 r2 l0 P
- * @return mixed7 x% N4 F; H) e* U0 F y
- */3 T& b. i, j! m& y7 t* |
- public function getCount($table, $where = array()) {
$ P3 H, I% H0 N' D - if (!empty($where)) {
6 @; z& ~ g5 t1 a/ F - $data = $this->database->$table->find($where)->count();: ?* V a. P. U. F7 t
- } else {
4 P0 J8 J/ E& ^% |) e' |* Q& |1 O) E - $data = $this->database->$table->find()->count();
" y6 o$ u L% f# Y - }: g' j5 t* m. ?9 W
- return $data;
+ T# w1 u" R- [9 A; Q# t - }4 x. Z% e5 B4 ]+ i$ J; r. c) v
- /**
+ t* T( E+ G0 u9 ?! H' N, z- M3 [ - * 直接执行mongo命令 X+ ]; O/ e" d1 d- ]& U
- * @param $sql2 r" ^* K( G5 v6 N5 D
- * @return array. `' ?8 a! h& v$ E2 Z' @
- */; k8 P) ~( K8 I- U4 C
- public function toExcute($sql) {6 e( t6 {) G" w; L: Z" p1 t& p7 N
- $result = $this->database->execute($sql);
4 }; Y; C; i# V3 q, I - return $result;- b9 a1 l- {. C8 ?
- }
' e! V- d0 p- d& h7 [0 W# l6 k: D - /**
+ P$ t0 @. |4 x1 R4 W; x' _' y$ A p - * 分组统计个数# _, m8 X+ d! N; u& u
- * @param $table
/ n6 ~5 f$ o" e) z f8 V - * @param $where4 w5 |: t' i! |& T/ k
- * @param $field
% ~/ I) J5 I; t+ [8 ? - */
, C/ P8 c" g; G' s - public function groupCount($table, $where, $field) {4 L9 o. n9 t! Q6 X
- $cond = array(4 j! j7 T2 e" \9 d
- array() y* y9 h* }8 L! H( K
- '$match' => $where,; j& l+ U: W: u9 x& {
- ),
& h' k. W. B! _0 m' u8 V5 M; x" F - array(, i4 j- z4 ]6 ~3 U5 i$ y7 }: s
- '$group' => array( x+ [9 w) C4 a7 ^, a
- '_id' => '0 c# M& r! l7 C, L5 }# A/ T
& _, V% @& U; R1 G: w- . $field,7 {5 C( l9 T$ ^; ~! c3 K
- 'count' => array('$sum' => 1), a2 u4 s" ^9 ]' G# Q- q6 m; H& K
- ),
* z) P% _9 n# E- k a% F - ),
: ?+ |$ s- X3 D - array(
- x- {* {) U* }/ f8 v4 X: Z- ^" z - '$sort' => array("count" => -1),0 K6 r2 c. G% i7 g$ I; F
- ),
C1 R9 ?: R) l, Z: ^$ K - );. }9 U6 D$ T V- ?) O$ |
- $this->database->$table->aggregate($cond);& @6 o" j% z! a4 v
- }$ t0 l. k+ U' Y. q& j* n
- /**1 s( {2 ?8 b8 n
- * 删除数据, p2 Q% u' x) \: A
- * @param $table
! E9 J" R7 C% y - * @param $where- ?# A$ X a) C6 j3 D
- * @return array|bool
- F# Q. F$ x- |/ W; d - */8 e% o# Y. s# {2 ^2 U6 m1 }/ t
- public function toDelete($table, $where) {3 o% w5 l+ f. Z& q" k
- $re = $this->database->$table->remove($where);
8 `$ p5 e8 t0 k$ S1 K! c2 c( t9 Z - return $re;7 w$ J; C' o4 m3 p
- }+ |2 B; m, g9 L1 c6 `2 ]
- /**
; e2 [. t3 b' q. F: U% ]/ E - * 插入数据
& t. I, i; g. X# Q - * @param $table1 U# k5 U0 ]- x5 V5 j: @( P& C
- * @param $data
6 _* d, J4 E, U% V* ~ - * @return array|bool
# q) K3 u0 R6 s/ v& E9 \ - */# ~2 }% L A j
- public function toInsert($table, $data) {
" h# s1 k. B+ O$ d - $re = $this->database->$table->insert($data);5 [& K' N0 a( M4 l" C7 A3 |
- return $re;4 J5 R! ^; a) M) D+ L2 S2 c
- }
$ v7 M$ d1 r( v1 d4 X - /**
7 k4 t& y4 k- L+ ]- n0 t - * 更新数据
& V, o, f" t, ?9 x, W: J R - * @param $table
3 u5 J+ S5 ~# S1 X9 `9 _; B - * @param $where0 @1 G4 y# ~( v; Y/ v1 w+ d
- * @param $data3 v: M8 ?! V! J8 d
- * @return bool/ H i; K6 r [9 ~) }$ M' `
- */) k9 @* m1 M& N% \
- public function toUpdate($table, $where, $data) {2 X5 Z5 v. ]9 [; K, Q1 n* ]7 D6 z& V9 c
- $re = $this->database->$table->update($where, array('$set' => $data));
" y$ [) K' h# t8 D; H - return $re;
7 h0 ?7 ^- a5 |6 o+ } - }: }9 @$ F$ c! s+ o: n
- /**
$ K3 H. d5 r' G0 L8 v( P - * 获取唯一数据
& ?. r2 z( m; Q% Q+ _/ ~; H - * @param $table* A; o+ T9 J' C# v( n
- * @param $key) d7 s2 Z: L* i
- * @return array6 E1 [% }5 e" F9 e
- */& X, P4 m' K" X: U' z2 T
- public function distinctData($table, $key, $query = array()) {6 r' |) m% ^2 ?3 e
- if (!empty($query)) {
, u- \9 p, w m# D+ z& A# D - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);; r' F, t' _/ \5 g3 o |1 P
- } else {
. h1 ]3 `. p$ T# @# f - $where = array('distinct' => $table, 'key' => $key);) y S& W, u5 H
- }9 l }1 x( y2 i# ^
- $data = $this->database->command($where);; x% O5 x: \- { G, x/ a
- return $data['values'];
( z0 f0 n( @3 T) K7 M: a) f% f4 d0 n - }: E5 x; `' U, x1 ?0 A0 B
- }
$ k7 r# t' ]3 y" L) u5 [ - ?>
复制代码
+ n3 q- Q$ D2 K6 a, ^7 g+ }/ o, U. B4 U: d% x2 K
|