|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。0 O8 b; C" ]" R1 w
模式自由。
3 l2 A0 l" s0 x% ?支持动态查询。
5 n" j5 z) \! ^1 p- D0 r支持完全索引,包含内部对象。/ _3 x% p' w' R5 \% t3 T7 D2 o
支持查询。
4 x4 f* B* i* h$ f" j: }支持复制和故障恢复。
- I5 w0 J2 j: m; h使用高效的二进制数据存储,包括大型对象(如视频等)。
9 ]: o" P r) B) h# t" |自动处理碎片,以支持云计算层次的扩展性! P# L$ T5 Y; }
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。' l# U) l+ u2 K( X
文件存储格式为BSON(一种JSON的扩展)! Z: a5 z' q7 e& Y- {: Z
可通过网络访问 所谓“面向集合”(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% c ~9 b# Z# c) I. ?5 n
- /**
; t. f/ N- ?7 D3 H! _( R3 A - * PHP操作mongodb数据库操作类
: T# B& G/ J, d8 M0 S/ @ - */0 b1 Q2 p/ B' M6 ~) d) Z) ?
- class Database {
7 q1 Y# Y( F6 K' ~' t( W; F* y - protected $database = '';! z4 u1 q: ?8 n9 ?2 _- |9 d5 V. w
- protected $mo;7 r$ E5 E9 x) v
- /*** `$ H/ X& [8 K, Z+ E' n4 L3 A+ k
- * 构造方法
9 y7 `; a# t0 m, G n - */
. h# X7 d( o- o/ h1 R* I( X - public function __construct() {
- p9 ]; U- e+ `7 i' Y5 f0 } - $server = DBSERVER;& x2 f% l- ~% r1 w; [# d6 s8 b
- $user = DBUSER; d. U: A: l* w6 a% v, }9 ]% \& t
- $password = DBPASS;; X- s( [" Z: _4 j2 |
- $port = DBPORT;/ B; U8 m `2 I: d/ x E8 b0 i7 y
- $database = DBNAME;
" p/ ^# G/ b, a2 J - $mongo = $this->getInstance($server, $user, $password, $port);
0 f! x' z& ]+ G: L/ U& }- Y. q$ F- z - $this->database = $mongo->$database;; Y7 Y( L5 [9 a, H; G6 Q
- }( w5 G) [) S% s6 w% f+ _, B
- /**) j$ o8 r% N5 _% M# `
- * 数据库单例方法& t. Z4 q3 e5 a2 ^2 t' p4 b
- * @param $server5 H/ T2 p$ M5 f; }& T1 Z# Z4 j
- * @param $user
8 v0 t, m0 H$ C- J4 h( U0 D+ y - * @param $password! D) Y# a) v' W2 K! Z, V
- * @param $port
& E7 b* R, _0 r* u+ Z$ o4 k - * @return Mongo
0 e$ Q; s3 q& F - */
; ?8 \4 k5 N# U& l+ ?0 u( p, R2 O - public function getInstance($server, $user, $password, $port) {$ m' R5 r% [; m x# R
- if (isset($this->mo)) {
$ }+ L' P- n: i. i& ~5 |" N1 a - return $this->mo;- k3 e' q. K0 w: Z
- } else {
* M7 H' Z0 E8 m# D* I% W - if (!empty($server)) {
* O! T' r6 R+ m1 g - if (!empty($port)) {% z- m+ E+ w5 c, S H
- if (!empty($user) && !empty($password)) {
8 K5 |( B; e9 G' Y4 s1 w - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");1 x7 K2 Y5 b- o8 b* V# P) |
- } else {
& x' `# \) O' M& Y, y. P) Z - $this->mo = new Mongo("mongodb://{$server}:{$port}");5 \! K4 Y# c: S4 f
- }
0 u+ }$ y1 S3 \" n - } else {+ y4 w) b7 ]% W% B, _
- $this->mo = new Mongo("mongodb://{$server}");8 ~5 S2 K6 K O- I
- }
3 M" A# a1 t/ S& W! ]8 U - } else {/ r/ u- W! G9 J6 j
- $this->mo = new Mongo();% ?2 @6 ~. w6 z
- }
! T! h7 x* G9 N1 c0 i# } - return $this->mo;
0 o8 s/ k4 Q+ `* ]" W- A. C% G - }
8 d4 K+ ~9 M2 ~% [, p+ G - }
2 S; h, ]$ w! g2 i/ b: a, O - /**6 a/ b% \) z$ a7 y* Y r" x
- * 查询表中所有数据
. d8 [& u3 _- G2 H$ E. o1 j$ S - * @param $table# i) C* n0 l1 x6 r" a. i" U
- * @param array $where
7 _1 t0 w, `! ^& m- \; T( E - * @param array $sort! r3 ]. }( z f' }
- * @param string $limit* K& }. S4 R8 n6 O; V" L, {
- * @param string $skip
& n' Z/ C, V4 z& e* ~ - * @return array|int
$ N/ J5 {" v0 r2 ?0 B - */$ ^9 j7 @. W1 r' y
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
; c% l! D8 ^ m$ | - if (!empty($where)) {% E4 U } Q# w( h# z- C
- $data = $this->database->$table->find($where);
+ O" \3 V E* A5 o, m) T - } else {
( w4 A' |- q% q+ w3 W8 P - $data = $this->database->$table->find();
! e t8 `2 l3 r/ e - }
1 ] R' t- S6 p) t2 q - if (!empty($sort)) {
6 s5 j. Q# ^. l7 w: R) c% i7 r - $data = $data->sort($sort);
9 m% R$ N0 c' u# P7 }+ O - }
' m5 h( c$ @ U2 t# G - if (!empty($limit)) {
1 o, G% u9 Y) Z4 s# v - $data = $data->limit($limit);9 Y" e' {7 ?' Q: |" g7 M& b) i, F
- }$ C5 r* C7 I% ~. s9 {
- if (!empty($skip)) {% ~* t! w3 F$ x* n) I0 E4 V
- $data = $data->skip($skip);/ p5 b8 ?6 Q+ C% a6 I
- }" _* a6 P, J$ k' f4 r
- $newData = array();
! t( I. h4 y# `& c! e$ } - while ($data->hasNext()) {
6 U, J# u8 _- U' D% v. z - $newData[] = $data->getNext();
# o0 T7 J; v. h' E2 J, w+ B - }& G1 j2 g% r# k6 A5 p
- if (count($newData) == 0) {
8 d" x# B2 n% D5 t) e - return 0;
0 t; X# x1 A; E1 b - }+ b2 ?! E/ t7 m* ?( \0 W8 `$ I1 K& A: F
- return $newData;
v5 ]3 g9 L6 r+ j1 j1 N0 @ - }
- s; @) q' e; N8 P - /**
. l- r! L$ T4 ^& i2 ^7 x% v& S, L) Z+ C# ` - * 查询指定一条数据% f) d! u8 y0 C E/ ?/ j: w
- * @param $table
( Y c7 E3 e) D3 E: W) h8 v - * @param array $where
3 ?1 ]0 u- ]: `# m" u - * @return int
, c; {+ ^- b9 n$ G6 r/ Y- z - */, u; y& T/ [/ L# w9 q, y
- public function getOne($table, $where = array()) {
3 t# e! U, {: ^; H f Z& V - if (!empty($where)) {, E0 h9 q1 d8 r, Y/ R
- $data = $this->database->$table->findOne($where);
8 A5 }0 y0 F- E! { - } else {4 P# V, h" D7 u1 u! G" `
- $data = $this->database->$table->findOne();4 h8 z6 b& M' q+ \0 T
- }/ @7 M4 m1 K, V5 T/ A( l8 C1 d
- return $data;' v7 p ~ |+ f$ q$ L* w
- }$ [7 a1 @7 G* } {- s, w& _3 ?4 ^
- /**& P d2 ^0 `# A5 \( S7 {( b. c
- * 统计个数
7 q7 j, O4 O$ J* i/ u, y - * @param $table- t) ~5 |) o& U8 I
- * @param array $where
, H( ]1 }7 L. y$ x5 R - * @return mixed! n- U# M4 \, b; {+ @+ g
- */
( I% Y6 J' r. G0 `5 a - public function getCount($table, $where = array()) {* o, E& j$ U% G
- if (!empty($where)) {
7 { L8 o- g1 T a* `$ [& F% r) W. I - $data = $this->database->$table->find($where)->count();
7 z* p; ~# t4 F- |/ [ - } else { M2 l" d, |. p' T8 G, X
- $data = $this->database->$table->find()->count();/ c5 ^/ h" ~% \2 j9 P
- }
6 F8 x, g% ]3 | - return $data;6 ~3 r3 u! l$ S' O) p$ w
- }
/ Q& [$ o3 j @/ U* r" i - /**
! u9 R8 n7 |( u - * 直接执行mongo命令0 M% }7 u7 c, C8 H, I: ?! K
- * @param $sql4 {0 Q6 ~+ Y" v
- * @return array
U1 c- J$ ]8 s - */
4 `' {/ ~9 _. t1 H! y8 O0 S* v2 y - public function toExcute($sql) {
3 ?4 _+ c: u6 b5 N& J - $result = $this->database->execute($sql);3 f d! u9 Y b% O8 m
- return $result;
( L0 \8 r, f; ?$ J, [ - }
" |7 w: S! E1 P! o - /**
, N$ g- [; n9 Z; U) p/ b - * 分组统计个数
3 |2 f& w. Y: a5 Q6 u. n6 g - * @param $table! Z. |+ Q6 z% n; T1 T
- * @param $where
% d5 B- e( l/ _, D7 b: ~9 a% X% { - * @param $field: \( s, W/ q6 n5 H- G
- */
& Y$ C g# z; [6 d/ b( e! h - public function groupCount($table, $where, $field) {% o, U" \" \% }3 L0 T
- $cond = array(8 E/ E* `+ L- m. X( `1 t' m) o
- array(, N4 ~4 R1 z/ Z+ G
- '$match' => $where,: j2 X/ O, Z% G3 |0 J
- ),$ l* w9 T/ u2 d6 l6 i7 f
- array(
: w6 p! {: y1 l, p5 x( { - '$group' => array(
$ z m1 O1 G' t) f+ |2 x4 m) L4 O - '_id' => '
* o7 V% F' x3 U$ Q
^% U1 _4 V" \% p/ x- }& Y9 t- . $field,
/ I0 O/ o, \" ^( H - 'count' => array('$sum' => 1),8 P+ S& y8 Z1 [! s6 `
- ),0 d+ W. u8 P; a) z) {
- ),
8 m8 ]* T7 W6 n$ R B, D! g - array(
: T5 i# a7 h6 d0 m# ~ - '$sort' => array("count" => -1),
/ g( I+ l/ V& A. C9 `. a( H/ u - ),5 W: f- R- L) r. Z) Z, D0 p
- );; u9 w8 f" K2 J1 b/ J1 Y# M& ]
- $this->database->$table->aggregate($cond); z% W; Y5 g) l0 }! \7 ~
- }6 \/ K3 ^$ E, B, |3 Z; w
- /**- n' j' e; n+ A( T! V0 t
- * 删除数据
, L9 }0 |# V4 O7 y- l, } - * @param $table+ E0 l9 p( ]; J* o- o! r
- * @param $where6 ^$ X- A0 j/ `5 u5 j
- * @return array|bool5 V6 S; ^2 R+ [/ _7 ?; U9 M
- */
4 ` h- M. b( e; k. ] - public function toDelete($table, $where) {
& b* p L) L" Y5 G/ j3 ? b) Z - $re = $this->database->$table->remove($where);& b: U4 H/ J' @. z( u( ]
- return $re;3 x, R$ b( E f
- }
# z4 c% M. q! H# L - /**
5 z: l; Y) D, r& [- ] - * 插入数据! o, Q5 @, }0 `" z) @! i- ^: M
- * @param $table
' N; S X$ Z' Q) [ - * @param $data* X1 d7 c- i w: [9 O! {; Q
- * @return array|bool
" f7 I4 |1 a. A7 C/ C# P - */
! z, _' v; r/ M% ? - public function toInsert($table, $data) {/ y) O, [% v" ~# A5 J7 ^+ Q
- $re = $this->database->$table->insert($data);0 u1 l5 S& Z/ x7 X
- return $re;# Y. \% c8 X) W! r7 I: P
- }
/ G$ x! f/ x9 G0 c - /**, k4 a" d8 Z* f$ P7 R8 B3 S9 H
- * 更新数据
; C7 m4 B1 z+ [+ H - * @param $table$ f0 F& j* c/ D, a( o# h
- * @param $where( _" v6 q' C6 Y7 |2 n) s
- * @param $data
1 N( k6 p# x2 J - * @return bool
7 Q$ ~+ ]" T7 u0 W - */
6 {' V" L% C! ~! c9 u$ _6 x4 u8 {- L - public function toUpdate($table, $where, $data) {. G% @# Y1 ^! \( {& J0 I8 a
- $re = $this->database->$table->update($where, array('$set' => $data));
7 }6 U' s+ o' L8 w$ j4 B( I - return $re; M r5 z9 ^5 D
- }7 E- _& [* g8 G5 Q! V$ E1 ?
- /**
. W, ]6 ?) _% Z) q - * 获取唯一数据" x" {1 X$ ]$ A; F( g8 g$ e
- * @param $table
1 e. @4 b+ S; X# b4 e: V6 ^- Z - * @param $key
* G5 J9 i3 s& z9 _ a - * @return array5 b4 w! `" S& A' G F
- */
1 Z8 b( W8 V5 m! u; o - public function distinctData($table, $key, $query = array()) {
! {: o& _) R5 Z4 ?' u5 n - if (!empty($query)) {
5 ^8 R4 p& Z( x+ z q5 p: K - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
4 j0 x/ ^, p" [% w. }/ B - } else {% Z) `" k0 S0 Z4 c+ l1 Q1 O
- $where = array('distinct' => $table, 'key' => $key);
# b. e; N& m' j' ] - }
2 T$ k. B+ h( L u! n - $data = $this->database->command($where);+ b l5 G7 K6 A0 Y) f5 p
- return $data['values'];
4 m! O) {3 Q5 ~( u5 E& I& F$ B1 e& L: V - }
* _) c/ j; _5 h+ H - }2 l8 Y6 ~* n9 k# n C& L
- ?>
复制代码
* v3 O1 d/ v6 Q! c) ^* r7 a) z% l
+ x: X' e7 Z- L; S& D' X |