本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
/ V+ T& G, h0 ?1 ]& M1 l' S. R模式自由。8 L8 \' d; n# y9 I
支持动态查询。. L- R4 {; f% n/ ^3 b1 V
支持完全索引,包含内部对象。
% \* a A. j! f* K支持查询。- `6 Q/ f9 [ N) N8 F: J# a7 i
支持复制和故障恢复。
/ f4 {1 G% E$ i8 k# Z6 ^3 }使用高效的二进制数据存储,包括大型对象(如视频等)。; B! q' G& K( {. C; g7 x* k% \
自动处理碎片,以支持云计算层次的扩展性0 [- n2 K1 g! W4 }' m% H! c- z
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
9 f7 g' T3 {( B e1 T文件存储格式为BSON(一种JSON的扩展)
, _, S7 ]3 M$ \2 N/ Q可通过网络访问 所谓“面向集合”(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! }; `, _; X' r9 [/ Y; _, |9 H
- /**, _5 J% S1 G# j/ f8 Y0 I
- * PHP操作mongodb数据库操作类
# g6 y. l$ ?7 H( w3 U: S - */0 U' k" ^' w* z8 I) d( h+ [
- class Database {; G8 Y9 c& m; ?( h' m4 ?! ]
- protected $database = ''; T( i7 L6 a' P
- protected $mo;0 m4 t) e3 l- S0 k+ U
- /**' w8 O, ~9 P7 A6 E; ~( }$ i
- * 构造方法
0 m& Z" E0 [8 N4 O1 Y4 ? - */
7 J) J4 `! e( J% j, s - public function __construct() {
5 }3 {. ` G4 X# c* C" _ - $server = DBSERVER;
\' L9 S( m: s# M; B2 N - $user = DBUSER;
6 s9 W6 X% ~9 I6 f3 n0 C - $password = DBPASS;
^9 _. T* ~3 N2 v+ a. f0 V' M2 I+ ] - $port = DBPORT;
! R$ ?; P. y$ y. z - $database = DBNAME;9 {/ H* b1 z6 |$ n) Q( l! |" f
- $mongo = $this->getInstance($server, $user, $password, $port);
& ?! S4 w/ J4 |) t( p. D$ A: ^: k - $this->database = $mongo->$database;
# e& Y) {# X. s4 `5 C3 b- \9 { - }
! C, U4 {* v* P4 D$ q% e4 e* G - /**
; g2 ?2 b: Z, j( i/ i& c) P - * 数据库单例方法
" N( d/ V8 l8 q8 c# q - * @param $server3 v U; P4 O1 y% M* I
- * @param $user3 H' G/ a4 v+ V* q* Q# C6 {
- * @param $password
, z# R4 P5 B* \2 G - * @param $port
6 z' u n" K* o - * @return Mongo6 f1 }1 u( ]0 ~' X6 X
- */1 G( ~* p7 J# g. q
- public function getInstance($server, $user, $password, $port) {" _2 m" s$ j3 ]- G/ Y" [
- if (isset($this->mo)) {& C" @# x' G/ g, O
- return $this->mo;
% s2 ]$ W- g9 T1 _ - } else {, z& t. h9 z" H n0 |2 w; h
- if (!empty($server)) {
7 P/ s9 _2 B% M5 ` - if (!empty($port)) {
- n4 q" \* H! K) E - if (!empty($user) && !empty($password)) {
! x" ?# R; P. L9 Z6 o7 c* v - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");6 x& l" ~. o8 L6 L) ?
- } else {
0 Y" J2 T. p4 \/ ^ - $this->mo = new Mongo("mongodb://{$server}:{$port}");
. k J7 R& k$ d1 d( }( L - }
( f1 @, Y$ x" D6 H3 d4 C - } else {, i& ` }/ N: Q" V6 O. V
- $this->mo = new Mongo("mongodb://{$server}");- V+ V6 `( K \( d
- } [' i; _5 [- N8 C! B& o
- } else {
5 f2 M$ _0 I9 C, X2 { - $this->mo = new Mongo();
) F: s* l4 x/ E1 [4 `! D, B - }
! n* J6 g; o" R2 [' | p5 T6 Z - return $this->mo;+ v; p a+ u/ t5 p$ x! F
- }1 i* p$ t0 a$ ]/ U( J9 O, m
- }
! V4 Z8 o) j6 j3 K+ | - /**' s5 ~% _! C# Z% s0 G# p
- * 查询表中所有数据
! O4 i: o! i7 ]( j - * @param $table2 |, O8 J" i: r1 i
- * @param array $where' q% K9 p7 K4 ~# n
- * @param array $sort( z7 w4 E8 y, U9 U
- * @param string $limit
- x- I4 g! D+ U, |5 G - * @param string $skip2 L8 t1 T1 j$ O
- * @return array|int
+ ~+ t2 K6 q3 W- O7 Q3 n - */
) d0 j, f" m. z# M6 X - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {/ n$ d' p4 A1 @* H5 H
- if (!empty($where)) {( Z5 A0 s+ X7 A# ^ k5 N6 R, U, z
- $data = $this->database->$table->find($where);9 ^# J' t( j4 r1 K; i
- } else {
- t* v, j5 S8 d5 r) a- f/ f6 A - $data = $this->database->$table->find();7 H, z1 W- {% O. G
- }4 e D( D, L- y# q* |7 z0 `$ V* R
- if (!empty($sort)) {
1 t# S! \- ?( S& Y - $data = $data->sort($sort);# y% q+ ?- d" P8 V5 C6 i
- }
, M+ z: M' T4 Y& d - if (!empty($limit)) {4 Z6 D: a& B7 x# i) U' [* A
- $data = $data->limit($limit);
+ N: t# [+ ]* Z - }
9 c! Z2 q+ W9 W- i- f - if (!empty($skip)) {8 r' w. y+ z! y1 q2 d
- $data = $data->skip($skip);* c% `! W9 Z9 y6 p) W& z- x# z' e
- }
( N d: s) H$ l& d - $newData = array();
/ D C* t) g& I. {! P! { - while ($data->hasNext()) {, }; m2 f5 f6 Q. t5 B
- $newData[] = $data->getNext();* [6 d X) ^* Z1 O
- }
/ W- d! i5 M& I0 l2 t& P' w: o - if (count($newData) == 0) {
6 d( a1 V1 W1 ]# l2 ] - return 0;6 P( W ^5 f- S6 y+ |& T* T
- }0 L: ?% J! O5 r
- return $newData;# v( h+ _, H M' H, E8 L7 T* ^
- }( f' r7 F2 O0 p' z9 X6 ]
- /**- r; `+ H ?" P
- * 查询指定一条数据4 e9 p% S7 G1 X. m* _% G
- * @param $table
% s$ C" M m E1 ^' U - * @param array $where" c }, n7 r+ M9 C. r: A
- * @return int& A: k% H& z6 r# o! W0 a/ E
- */) D" i9 a1 N$ Q3 ^+ O
- public function getOne($table, $where = array()) {. j& `; X7 A* q" [$ d7 Z4 w5 |
- if (!empty($where)) {4 x- [& `. z# K
- $data = $this->database->$table->findOne($where);5 r: Q2 k( K7 k$ a5 `4 }; y
- } else {4 W9 ?" X: x, [: c( I% [+ o
- $data = $this->database->$table->findOne();( C. s- I" q/ s7 o. ?2 Z
- } x4 {5 W0 O; }+ Z
- return $data;% P! @! G {% `
- }3 k( l1 x8 v" R. Z
- /**/ F" U# M( \2 {) |
- * 统计个数( L: ]& _" k i2 _
- * @param $table8 h* b6 p1 y- A0 s7 G. u1 ^
- * @param array $where
: x, k2 r/ T8 S - * @return mixed
- L. r* K9 o$ n - */
9 }# h: Y( I7 ^ - public function getCount($table, $where = array()) {
! U, O0 {( }4 A - if (!empty($where)) {
" K- l7 S3 K1 l o6 P - $data = $this->database->$table->find($where)->count();% O% \; V0 G j: M
- } else {
8 {" h- ]# N1 I' m) `+ s - $data = $this->database->$table->find()->count();
- q1 N( t) V8 U5 t+ H2 i - }
2 N }! U8 c' \' l4 ~* T o - return $data;
, q- z8 S" ]8 O2 q% r% s - }" t+ g5 q$ g6 W' g/ B# I" L% q
- /**
8 T! E' r4 Y; W v! m( q - * 直接执行mongo命令
6 {$ ^5 Y' X, k, p. l - * @param $sql
( d6 ]) D# I6 g, \. H: J/ v2 t* L# _ - * @return array
* K* C* ~$ P* L& D2 }5 z - */
- [ m: @) b1 T, b4 B - public function toExcute($sql) {
( a6 e7 M8 K2 u; V - $result = $this->database->execute($sql);
6 l( p* h; _) n, x - return $result;0 ~# N! d; U# u
- }
" c* U( [5 A# x7 p8 }2 W - /**& m9 p' @: P5 L: W( `$ H Y/ p. i
- * 分组统计个数* ]1 N$ |5 H7 Y0 z6 b
- * @param $table
1 m! N! f' ~$ n# B0 i - * @param $where
* w/ f4 O/ e9 z H - * @param $field
# J: N. S% P- Z, t4 B J - */7 I& z; ^; |# U
- public function groupCount($table, $where, $field) {
4 u$ S8 a) O B - $cond = array(* W. B6 u' ^ o/ c/ ^/ o2 H X
- array(# Y3 ^7 ~" e) c4 ]6 ~& Y, P
- '$match' => $where,7 M# c- U" i; }% g5 H# S
- ),
- r! R" @/ s3 h8 l; Y6 s - array(
+ w; n- y' B2 l, f/ J. @0 |# q' w' I - '$group' => array(
, Y+ V5 w) T( k* i% r1 ]" z7 n0 @ - '_id' => '
+ m) h3 H' j" V7 l2 Y - ; [4 u" r+ _8 H" T" p
- . $field, K$ V" B! N$ b, L4 L9 Z4 X, ~
- 'count' => array('$sum' => 1),
- B" y" q+ A# e$ w- \' f - ),
8 n; }3 J3 w; d - ),# y3 L! F5 ]% E" x) m
- array(
; h. _) K) ~* ]4 M; O - '$sort' => array("count" => -1),
: B& O$ R( w* g0 }/ u/ Q% j+ H - ),
+ k: ^' Q, @- l - );3 h- Q+ V5 k8 O! |0 ^' o
- $this->database->$table->aggregate($cond);
; c% I Q2 {/ ~3 ? - }. U9 ^, E$ y, T7 G
- /**' p# X: B, h2 J
- * 删除数据
8 }7 @- T l" K( P2 u - * @param $table
: r' E: h0 e9 i" Y' H, x4 x - * @param $where
5 d7 y0 ]4 y3 T0 U8 k3 } - * @return array|bool
' E* I7 b) x* ?5 j - */: k8 b8 g; A4 {" x- f8 M+ r9 f
- public function toDelete($table, $where) {
! v' g% D5 v/ V: W5 W- o0 r - $re = $this->database->$table->remove($where);6 g2 n# ~: m, g2 ]$ Z" T# Z
- return $re;
+ }, V$ z$ J" M% _6 e w4 B - }; n( H3 ?' ^) g6 Z4 }
- /**# V) G e3 h; [- ?/ H) K/ x4 h
- * 插入数据
4 L1 z/ Z7 h9 V0 P8 z - * @param $table1 O5 {1 L8 K( {5 a
- * @param $data" a* q5 z$ c% Z7 d6 w
- * @return array|bool
8 h8 I, s% j$ g( x5 ?1 Y+ a; i; A# o - */
* q% |) Y/ a- B+ S* [ - public function toInsert($table, $data) {
0 C P3 k+ h" | m* i* o: s - $re = $this->database->$table->insert($data);3 P4 z( ?5 u( d1 w. o1 u; z
- return $re;" M6 P# u3 e* W0 t$ F# B) z
- }! b2 ?$ K( y2 ^/ s
- /**
l/ }- h* v$ R* k - * 更新数据
7 j2 w% N0 u! ?" K% e. T, l1 o - * @param $table9 I7 W. D0 ~* E
- * @param $where y* v3 V7 ~* [2 H% H
- * @param $data9 p2 r! l6 P5 z- y! @ U- m
- * @return bool1 ~0 o5 V& V* V4 ]$ C! e! A" M9 P/ c
- */; f( U6 Z( @/ k% V5 F/ b
- public function toUpdate($table, $where, $data) {: ~% A6 q1 I$ B
- $re = $this->database->$table->update($where, array('$set' => $data));
2 W4 d2 n7 ?# D) B; b - return $re;
5 n& k8 t2 l: Q) k: v" s - }8 n# \6 z* `9 O) S% q6 H
- /**
0 [* l1 z2 X% p' u4 A+ P" r - * 获取唯一数据
7 T8 _7 }. @6 X: Q% K* K+ e - * @param $table- I& {* X( K0 _5 j3 d3 t
- * @param $key6 c2 {: m0 \6 u! K% o! B
- * @return array
1 o& R$ C" N6 x; V8 ~) U, { - */) ~6 K, W- J2 E
- public function distinctData($table, $key, $query = array()) {9 b. B/ }' f/ r* x5 E* R
- if (!empty($query)) {
7 Y _! ^" {2 X: r3 Z - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);# [; l, s: c8 v; ]1 m
- } else {1 _; ?5 G( x1 j3 v8 Z+ w' U8 j; z
- $where = array('distinct' => $table, 'key' => $key);& v" w2 h1 H6 t8 e% l9 R; d2 ]+ }
- }
0 L6 V9 m0 V7 j" ` - $data = $this->database->command($where);6 F. X6 ~7 ^" e( p$ {; p
- return $data['values'];
5 b! B7 u( P" t, ?' X' _9 H - }- P* ?2 x6 A$ I5 c$ X# y# z" n
- }+ C* s1 A. H N! |- s
- ?>
复制代码 * V: ?) N9 n- V% U( g/ }
# O# ^9 e" m* L$ M$ T0 N& M! k3 a/ q8 { |