本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。& J" d1 P( ], B% c! C9 X
模式自由。
3 | C* p& T& j; H支持动态查询。& B) M( w, a% ]3 n
支持完全索引,包含内部对象。: y. }0 E; U& S. |1 D
支持查询。
5 ~& e. A( i* C" @& [支持复制和故障恢复。1 u8 V- T+ @3 ~! M' k& q% n
使用高效的二进制数据存储,包括大型对象(如视频等)。
( L4 H5 x. w( F自动处理碎片,以支持云计算层次的扩展性( t/ w1 [* V s8 f) C) }- E
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
0 H" ~. }& G3 B文件存储格式为BSON(一种JSON的扩展)- w7 ^3 r% [2 ]5 u0 y( @# m& K
可通过网络访问 所谓“面向集合”(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& |1 g; Q0 [9 L3 ^3 e% _
- /**0 v) j2 ^9 ?( ?( u+ t8 U0 e: v
- * PHP操作mongodb数据库操作类
0 ?( M3 H7 w! Q8 A; W" o( {/ U - */# a3 N8 \7 ?( R! {( @
- class Database {
8 a" j- `. g* c - protected $database = '';0 P( u7 r* k; x5 {* b5 [
- protected $mo;- w& t O0 ~0 z5 W7 P2 m# [
- /**
* x, \1 s Z% Z1 x - * 构造方法 H+ D; w4 w: d
- */0 @2 |* D, h( t
- public function __construct() {
7 h g N. Y5 b - $server = DBSERVER;
0 E3 N4 U. p# O# S" G - $user = DBUSER;! q; s* c# d p$ J" f0 a9 V
- $password = DBPASS;
8 H5 ^1 J8 r/ e, P( x- \ - $port = DBPORT;
+ n# ?2 u+ @0 v, B1 l( r - $database = DBNAME;2 V3 E# k* ^1 w) @' Y" B
- $mongo = $this->getInstance($server, $user, $password, $port);
4 ^7 ^5 t) _ C0 E7 } - $this->database = $mongo->$database;& j) g+ O" l! e Q& ?/ K* P- c% C0 T
- }
3 Q9 q. L* s2 L# B8 C& s% ^% r - /**6 a' c( D. n; U# g" Y
- * 数据库单例方法
" O2 e! k8 G! b2 y7 x; U% Y - * @param $server
6 k5 X+ H: g3 m7 i, z% C1 t2 B+ l - * @param $user
3 w, z! s1 }' X- h - * @param $password
# x8 f# ]: v$ O* {7 [ - * @param $port
* D7 e" Q! ~% N+ S - * @return Mongo5 D3 L; P+ B k! c: N# [
- */5 D4 |' z ?7 b6 m
- public function getInstance($server, $user, $password, $port) {5 |- w4 m( s- @
- if (isset($this->mo)) {- z" x7 v2 P/ H( B$ J2 X5 Q) i
- return $this->mo;& G& y! {4 s# P- k$ K
- } else {3 b4 |+ d: `0 I/ _
- if (!empty($server)) {0 T+ Z# Q: N& K" o: S I
- if (!empty($port)) {
- A, X# Z, _5 l5 h0 r - if (!empty($user) && !empty($password)) {
0 Y* R. @+ r$ W$ F6 f- p - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");. ~8 h/ y; S3 t
- } else {
) i* F" e0 Z6 O" i% ? - $this->mo = new Mongo("mongodb://{$server}:{$port}");# e* }" j. `6 P; X
- }
( g5 ^3 L* W3 |% o# i' F - } else {# m) Y2 U9 G |% y* y
- $this->mo = new Mongo("mongodb://{$server}");* ~" S8 [* W- C# c t3 K5 Y- o
- }0 O& Z6 l5 ?* K. a5 l
- } else {
4 l$ u h9 k( w! R/ c - $this->mo = new Mongo();8 }& P% k! k, _) M: |0 n
- }
& L- ?' e9 y' m8 Z0 c% C5 _ - return $this->mo;# @, v& s( J% ?) P% H+ z9 T* w+ a
- }
4 I6 A! J; l1 C( t0 P - }
8 B) V* m% g6 N/ |. [- k - /**# N* j% \: D4 ^1 K4 s7 H- p% g
- * 查询表中所有数据: ^1 |! W7 A8 e& v' \) l3 i
- * @param $table
* x3 k7 `; b- R* Q# ?$ J- O - * @param array $where
9 b. g2 J$ F0 w, e - * @param array $sort
8 s, y! I" K9 i' T1 } w, S - * @param string $limit
2 K* {/ ?* Y& i) K2 E a% T - * @param string $skip
4 C: o/ F- e) \& c - * @return array|int
$ x. q( U8 {6 v2 U4 B( v9 z% G - */
9 Q5 P* b1 k4 `- m- }' g+ z - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
/ \ \, m; L) v T, N# g - if (!empty($where)) {
/ H7 a* G0 Q& J G( m/ ?! R3 V, G - $data = $this->database->$table->find($where);
* W# D! y" U0 i; B, a# w/ m - } else {+ T6 q- S& b% d( D) ]/ r) J& w
- $data = $this->database->$table->find();
9 ^4 [/ @( L. y - }& Q8 h4 y! x+ g) M. r7 ]
- if (!empty($sort)) {
8 ?4 p. X! ~% t$ d# f# x - $data = $data->sort($sort);: y- C/ u$ W# g, a* e- I
- }
: S& l/ p+ C* k' {0 ] - if (!empty($limit)) {% k$ @& K; i& s- [3 {5 R
- $data = $data->limit($limit);' ? H( s% j% A M
- }. P0 h$ f3 _( u5 B/ v9 N' {
- if (!empty($skip)) {
% w f! E- q- W; C0 ]6 | - $data = $data->skip($skip);
. Q6 J% i/ ?2 Z - }* @. s! r4 N! Q, l9 i% R9 ?5 B8 ^
- $newData = array();: a$ T5 T- Y9 |9 Q5 ~) Y/ _+ a
- while ($data->hasNext()) {7 N+ F* w0 E+ w4 _" p Q2 T+ ]
- $newData[] = $data->getNext();4 W ^% Z; |- {; H
- }
+ h( s/ t% x- \. Q1 E - if (count($newData) == 0) {# Z7 Q& o1 v) a6 C2 j0 ^
- return 0;
. I, O) w$ L1 M* G q - }
M( ]- i6 ?' p- Y z - return $newData;
/ ]0 C! ^3 z8 j3 ?* ]6 J0 K - }, d8 u% U6 e% O
- /**
# S% T4 \/ o' I9 t+ D( D: C - * 查询指定一条数据
) _& J& C" }1 |( P7 y( J - * @param $table0 k# j4 F9 t5 T* D# I) E
- * @param array $where" ?; ~3 i) {( i- O5 G. y" W
- * @return int
/ L9 [( `9 ~' T2 d+ m1 T - */: o! K g2 q1 R" e0 ~0 s8 |0 [
- public function getOne($table, $where = array()) {4 w5 A3 j$ |2 G! X) g" w' F
- if (!empty($where)) {2 S& _# E S5 z$ ~0 \# j; `* w
- $data = $this->database->$table->findOne($where);
7 w( {6 B' d: T$ \2 G( ] - } else {
) J+ _; W! A7 [. X$ ]9 p* ] - $data = $this->database->$table->findOne();8 o7 |6 Q! o. s4 j. i
- }
9 P1 t" Y: p2 I" ^8 c. y - return $data;
2 m9 y6 b* r5 B- @ - }
) h( r+ p$ ?7 j, [' f# n - /**
: C0 O6 u) H |9 {6 w - * 统计个数
$ R4 |! C5 p t R7 }# z - * @param $table
* s& r g. W, n7 a' w3 v7 l - * @param array $where
{4 c7 U, |- j. w- V - * @return mixed
$ M) }- v" P$ l: q, B - */
9 w' S, q7 L, {# t) z - public function getCount($table, $where = array()) {
% b4 G4 p' z4 B/ n. n0 v8 A - if (!empty($where)) {, {9 _6 H3 i1 M7 c+ y1 D
- $data = $this->database->$table->find($where)->count();) r! ], B$ J( p* `& C! m
- } else {
4 X) n$ I$ w' F. _ - $data = $this->database->$table->find()->count();
5 U5 M" [. E- E) T' \* [1 ] - }
. W6 c' D1 f; ]6 e7 c: G - return $data;/ i/ Y6 H+ a4 M# \
- }5 i! b4 P7 M* y8 J; h0 e
- /**
+ W1 H4 t* v( @) F/ r* J# A: H - * 直接执行mongo命令, p3 f% J, A6 T( Q# G
- * @param $sql
& E" _: J" w* p& `0 |0 Z- \. @/ E - * @return array% Z7 Y5 x& t& ^1 r" `. X5 ^
- */1 b# w" d3 U; q; e9 B1 B
- public function toExcute($sql) {; C5 w# M) Z, {
- $result = $this->database->execute($sql);* o" l! R( T, D
- return $result;
1 r& s8 Q" G) Z - }
" I* F3 ?! _) Z% K0 D- e/ B! Z( N - /**
+ y( G- B( g& n/ _' S0 U. l* _ - * 分组统计个数# Q% W6 e" N& D8 @6 U6 T
- * @param $table+ U6 Q- \ c7 V
- * @param $where+ k' }/ B5 k2 J, n7 q: S, x
- * @param $field' D8 g, T: d% c$ X& m- x" B6 L+ ` E
- */
1 E2 _' q6 B0 X* q% U7 n - public function groupCount($table, $where, $field) { T5 ~; _& O9 q* e2 P4 S' A3 H5 v. @
- $cond = array(
9 R7 D/ \& v3 ?( Y6 `1 x$ I( p - array(& G0 W: k. ^6 F3 R' e' U# d
- '$match' => $where,
/ \' P% U% a; l! z: w) S3 j - ),* T. m3 t: P" n' w' o# N
- array(
) Y9 ~7 n) _$ w( }# e - '$group' => array(
8 G3 c" m2 }" H y& ~ { - '_id' => '; e/ Z; o6 u8 X/ Z2 l
6 }1 s: w) P2 Y! B1 ]- . $field,! w r/ I" S2 F
- 'count' => array('$sum' => 1),) I& l. c$ ^0 K3 m: K
- ),
6 p m) T! b2 r" j% U - ),# Q) E( v& h; G4 y
- array(' E R, b; C: ?7 \8 x$ K/ ~
- '$sort' => array("count" => -1),9 V. u3 A3 \ `1 Z) x2 v$ m
- ),
- v6 F$ v' z% I- K$ V4 L: x& I - );1 y- ]8 A" k% \6 I! d
- $this->database->$table->aggregate($cond);- x; X8 h" E* O) a8 Z8 W+ S
- }
+ I% W$ s& |4 o$ ^. d - /**/ D) |! ^* w5 {% m
- * 删除数据
0 m! w: |, k/ Z' h$ |- q - * @param $table
7 Y* F) M. I6 z2 a! R( j - * @param $where
; j4 a) @9 O; a: M2 ` ~3 P - * @return array|bool
# D: v" v* E% s4 P4 r* S0 X - */
4 c$ e& w. K) d - public function toDelete($table, $where) {' }# U8 ~) G% |
- $re = $this->database->$table->remove($where);7 d: D2 I+ O3 P+ p8 A$ l5 w
- return $re;
( \" s# H3 C( [5 _7 M - }* R$ X) L% C; t6 A8 R; \# S
- /**
2 [0 g1 B. `" x2 T9 M( j - * 插入数据
7 x. ?3 ^0 A/ g' S+ | - * @param $table
( ?, Z3 F6 F3 u9 F$ }7 Y, }% U5 j$ f$ K+ n - * @param $data
' [. J7 p- g3 ~% J i - * @return array|bool2 p9 B2 \3 s/ h
- */1 U0 t0 y- ~$ U0 Y
- public function toInsert($table, $data) {1 }, j* W* Q& ^5 d+ C6 E2 h9 E
- $re = $this->database->$table->insert($data);& F8 u. a3 K6 g" h
- return $re;) W8 Y( h- ?% n7 t
- }1 N" ?9 x/ e/ t. P2 p+ p5 j+ n
- /**
4 j1 c( F6 N2 D0 A( k - * 更新数据& e; I7 e& l8 {% O/ r! z
- * @param $table8 z# Z4 n# U7 P9 `7 i' b8 E
- * @param $where
- b0 Q+ A2 U% P# P - * @param $data" m2 R5 Z/ A7 @4 _! M2 p
- * @return bool% H8 f% w0 e' x3 ?
- */$ B- h& ]" R8 J/ f
- public function toUpdate($table, $where, $data) {
+ B7 K& Z2 y3 L- U - $re = $this->database->$table->update($where, array('$set' => $data));) E+ x- z8 r5 g8 i
- return $re;
' _2 s1 R1 m- E. i* ?( ? - }' V: [, f! Q* @ }
- /**4 c% a& O% Z' e- m
- * 获取唯一数据
K5 C' p/ h% F" _( I0 ~ u. o) O - * @param $table8 y# j( n+ r1 X6 _" K; w+ K( n3 S
- * @param $key% D8 ^- f. ]* U' W) L5 K
- * @return array
3 @* ?; |$ H& O0 |# c - */
0 a: W( Y- M7 F - public function distinctData($table, $key, $query = array()) {7 v3 I ~8 u* r0 D& @
- if (!empty($query)) {% }- j$ l) p% `/ `
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
. s9 }9 }3 @) N6 O/ L - } else {* `+ F! h0 m# T' n% {: u8 v
- $where = array('distinct' => $table, 'key' => $key);
' ^% d5 w, x: m; I& h- l8 j - }
3 a, F0 s7 R6 m% M, I0 K1 \ - $data = $this->database->command($where);
. E9 h4 L( j6 d" e) t - return $data['values'];
! L. ^/ O! E ^8 D: y. _4 Q, |! d" [ - }
! f" X2 Z# |" K# H - }" \0 j# a7 _5 a+ W3 i
- ?>
复制代码 + j- Y0 L1 N1 {) B
9 _4 J. f7 i" X- d: w3 _ |