|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。% p5 v6 x, B+ z
模式自由。* C* u" X4 r: q- d k5 F: f z
支持动态查询。3 n8 t' a c1 j: e; J" M
支持完全索引,包含内部对象。
/ T2 w* e( S/ K7 y: n. u$ g支持查询。* h0 ^; v V4 k5 Z7 l
支持复制和故障恢复。
& r ^1 K6 T" _5 ^4 f# @使用高效的二进制数据存储,包括大型对象(如视频等)。 e0 l2 l! a: K2 b- W! m) b
自动处理碎片,以支持云计算层次的扩展性5 q9 ?! h( ~7 G% n' }
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
; B y1 {2 Y, n: V/ D3 O0 J# ^7 V文件存储格式为BSON(一种JSON的扩展)
" }: z. w1 `" }& ]( o$ @5 L可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php5 |) l8 B1 @' N
- /**
3 e& Y+ R0 z: F& W - * PHP操作mongodb数据库操作类
1 Z& ~: ? [: H; D( N( R$ U. L - */
. }" q+ V1 ^, F3 i8 i( h - class Database {* g* M' E( _7 O, w. a7 B' m7 Z- [
- protected $database = '';( L, a; X9 S- }
- protected $mo;
% C5 ^9 s4 u3 y - /**+ j# l4 \& S& C Y& i& g* v8 M+ q; |
- * 构造方法
* [1 V3 p+ G' C2 A, P6 B" p0 i; o - */
5 r O- B3 J. g- _0 J" G9 {! W - public function __construct() {
% S& o- X9 C6 w, o - $server = DBSERVER;; f6 u, }: \6 @( u
- $user = DBUSER;
6 A5 `7 J* Y, M/ c2 U5 x* P. u - $password = DBPASS;/ B9 F. i! K* S' E1 J* Y! r
- $port = DBPORT;. E5 r/ q4 ?+ G* @
- $database = DBNAME;, f( }# R0 n& i0 o9 s5 l& M
- $mongo = $this->getInstance($server, $user, $password, $port);
- _ a, D' E: O* C( v' x0 ~ - $this->database = $mongo->$database;8 r% @ C9 d9 r
- }& F5 a i/ e0 A8 |
- /**' P4 Y5 \2 ~# |" o4 d8 e
- * 数据库单例方法7 c3 t& r( ]+ R1 f9 V- J1 w
- * @param $server8 Q+ |& _1 T$ V" d6 u
- * @param $user1 Q7 g& y3 O( d6 D" }% J% b, o
- * @param $password
6 K/ E# c; \, Y) W) s - * @param $port3 x: q+ H& t% }" j: I9 b
- * @return Mongo
% Q; |, O$ m! u1 X& K! w - */
( [& p$ O3 R7 ?$ R* z) |1 L9 }4 c2 F - public function getInstance($server, $user, $password, $port) {
4 O3 B' l6 i& v9 c4 a7 K) } - if (isset($this->mo)) { e0 L9 C; w, V! y
- return $this->mo;2 `8 G; Q, @% x% |1 }( r. A
- } else {
; L$ \6 L8 w9 s3 F( X - if (!empty($server)) {1 |7 u1 T7 X* D) U" S0 R
- if (!empty($port)) {3 `$ l, K h0 p s. @) U; B+ f
- if (!empty($user) && !empty($password)) {4 n6 b; J2 S- ^; k# R4 H# {* F( `: z
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");! P$ H& ^! m$ d/ K, Q
- } else {
7 M' K. }0 n! M% j9 X! i' m - $this->mo = new Mongo("mongodb://{$server}:{$port}");
6 ^& U2 s3 i- B) { - }/ U! A* l4 V/ k) w( W2 f
- } else {
% t7 z( l2 h" K) S( X, C& F. ^' K K - $this->mo = new Mongo("mongodb://{$server}");
; O, P/ g1 a' t; Y- f g1 K - }- ^1 u2 ^3 B2 o9 W2 }/ W: u& [
- } else {
. e/ H5 E, G7 z a v+ j/ y - $this->mo = new Mongo();% |- ~! B k$ B6 A4 l; w
- }
# M* T+ T( v" N. r2 N - return $this->mo;
- y2 X) h& y, I" E: X3 g - }
! [( z$ J9 D% }& O3 u - }8 j. f, b' ?- k9 V0 Q: h+ h
- /**9 h% D) g) \8 l( U5 O0 G
- * 查询表中所有数据
8 [( ~" x6 v* v- h; Q, C - * @param $table
+ x% X+ M6 v8 w6 O# C. x" ` - * @param array $where
0 u Y: ]" `/ } - * @param array $sort
, d* r* \& ]3 T. f) ?1 j - * @param string $limit, H7 U8 ^, Q# X2 \3 S
- * @param string $skip8 @* }& @, U3 i# x2 G0 F/ I
- * @return array|int* _: n4 b* l" a9 v- g! `9 U N/ J- D
- */3 Q4 C |: t( v6 G
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
" t5 I2 u/ _/ D$ e4 O - if (!empty($where)) {! a G2 F7 f/ F9 r1 t! Z
- $data = $this->database->$table->find($where);
; s4 x4 W% a8 V' q, s7 ~ - } else {
L# d9 M3 O3 t" a% b6 l - $data = $this->database->$table->find();+ J8 K3 y1 @! r/ K5 A7 Z
- }
- ]5 c; t1 M0 v5 H+ U, B" F$ M - if (!empty($sort)) {( P0 A- ^" V) e- \! y
- $data = $data->sort($sort);6 b# {/ h; T) a
- }+ F4 k: q, e8 D
- if (!empty($limit)) {8 I, N0 l- [9 f) j% T
- $data = $data->limit($limit);/ [3 q+ Y: k' l( b
- }
/ `6 {& z8 D- w - if (!empty($skip)) {
, m V& Y9 C. r- s( t% d - $data = $data->skip($skip);
5 b# a) v) @% K4 ? - }
# e6 P6 O! K2 m/ j+ W - $newData = array();
* \% F6 i0 A: i: @, e, H6 J' c* X - while ($data->hasNext()) {
! E( K" T! j% _# S8 t1 `+ F2 U! Y - $newData[] = $data->getNext();
% J+ `; t, ~# u0 E: d - }% q- h" {$ w* o8 ^8 m ]6 z3 N7 B
- if (count($newData) == 0) {
4 U7 F; G( J& o. r - return 0;
' Z( a# C' m" z8 ^2 z- M' H8 j - }; f/ J" e1 t) F/ a
- return $newData;
6 I: h' t7 |6 ^. P5 R0 ] - }
; I" X' A* q: y& l - /**6 P. G' {& ~, ^2 A! X$ J( F
- * 查询指定一条数据0 O+ p% N7 R1 |' L
- * @param $table
. x( Z+ w c( a/ R, s. m$ q) o7 ` - * @param array $where- X* C* C2 J3 V& Z
- * @return int1 T; p0 k4 i: s" g2 e
- */
3 S8 \3 T+ e1 R - public function getOne($table, $where = array()) {6 B W$ Y+ f, }0 r3 Y( P, D4 i) {
- if (!empty($where)) {
' g$ V6 Y7 C* H - $data = $this->database->$table->findOne($where);7 s% y5 q% u8 C4 s1 I( k1 P; Z/ N0 g
- } else {
3 o( b2 C) w/ W3 v! m! N6 u - $data = $this->database->$table->findOne();" A) `4 w0 z1 x, q6 ]
- }
! c* L3 x* W! Q& }5 M" D - return $data;1 P1 z; Q' o# @+ u1 n8 R M4 G
- }; b F! P1 b9 x! U
- /**4 i H8 m- V) A, x
- * 统计个数
' f$ w* o1 @) M, o% R - * @param $table
+ N% D ?9 |+ X! R! v2 O5 b7 P - * @param array $where
5 r h9 r1 U4 n+ W - * @return mixed
4 b6 q1 B9 @8 |) q: k% o" U - *// j+ y6 w/ c, q- d
- public function getCount($table, $where = array()) {
0 H6 R- _* w) C2 S+ |) T - if (!empty($where)) {8 g* k5 y# W' Z& S; M
- $data = $this->database->$table->find($where)->count();2 h5 d7 Q# }; ]. z% c. K
- } else {
6 d! B: R5 G/ r" I - $data = $this->database->$table->find()->count();
- r, }7 h/ \/ B [' d0 M2 @" J - }
7 ?6 c% L, D2 B5 v9 x1 T2 A - return $data;
& [6 g4 N& K- E" K/ p* [/ \7 v0 c - }5 A: o B! g' k
- /**5 v1 x9 H; e' L7 W- F- E4 v7 i
- * 直接执行mongo命令
1 N, j2 k( X |. Z1 k - * @param $sql
1 ^$ R6 F) P6 I/ S9 q. E1 Z3 l - * @return array
$ M+ [& W/ t, p; z; c3 d0 t - */; R3 i; \2 P7 M0 P4 d" o
- public function toExcute($sql) {
7 M7 w3 G9 c- k6 k, V - $result = $this->database->execute($sql);/ k# S! b* W$ x) @, M
- return $result;
; X9 p9 u) K9 ^9 s+ F7 A& _ ] - }
& ^+ S- @1 _0 y6 O. u - /*** l# D# r2 p3 v3 L6 w
- * 分组统计个数1 P1 y7 M/ p# f# j9 h G! R
- * @param $table+ Y. ~+ S1 S. B6 ~7 t
- * @param $where
7 ~) T9 C! ^+ g - * @param $field
1 S5 C" i! t% G+ f! K* D+ B - */
% \& {* s9 Q# Y2 a - public function groupCount($table, $where, $field) {4 I( r( z6 i1 ]( {4 s- W" w# j
- $cond = array(* b L0 Y3 z) o& c! C, {5 h4 Y2 Q
- array(9 t2 L3 l/ _( F9 M. @* W
- '$match' => $where,
* j/ k- @ Q n8 t - ),8 B4 s: M7 w6 G! h
- array(/ R$ G! \& _ \ P* M6 u
- '$group' => array(" s6 \0 E0 @2 s, X
- '_id' => '" ]# J( j0 W1 ~8 l# G- G4 W
- : A8 _( q1 {' K. G* \2 ? B3 N
- . $field,6 h2 ?# |/ l3 P) ?: `( X
- 'count' => array('$sum' => 1),
7 l6 f4 z! Q* j2 n: [6 A& O4 J! D - ),( i u, V7 a. r5 V* c& g
- ),9 Z9 k1 k% _ K% x6 @- c9 Y- L- ` Z
- array(4 i" m M0 h; \+ Z( p# g
- '$sort' => array("count" => -1),
5 D7 ]( y! Y, G6 K+ e$ } - ),
2 _# Z: G! D& O - );
" Q {3 j; B1 G5 ~1 {% e6 e9 w - $this->database->$table->aggregate($cond);
& @+ \7 u: w# t' }7 F - }2 Q, t: P3 {5 d q
- /**
q$ h b8 \. ]4 G - * 删除数据
$ `: {0 T; @$ P& o# |+ i. r - * @param $table
7 d; S( c' {. g0 L - * @param $where5 _4 E' G( _! q* Y e: a' C; s
- * @return array|bool
5 Y$ A5 s! J' a- ~ b - */
2 H' w2 s4 ?# B" c1 }# l - public function toDelete($table, $where) {
, e: t& F0 H- ?2 V! h - $re = $this->database->$table->remove($where);
) A( ?6 I: X7 [, h# d$ w - return $re;
$ b* T5 A6 |0 b, _$ ]9 V9 h$ z' | - }& `+ c ^" _' {# i% k9 W
- /**! R3 u' W9 C8 J% ^
- * 插入数据
$ \# m/ o; T0 w7 t% z - * @param $table
5 B3 |5 a/ t) z% M& f9 L - * @param $data
. K" q2 ]& P) x; ~& Z - * @return array|bool6 m! ^: n8 W* U- e6 n# o
- */
. j+ ^# Y4 C7 n$ c- B; l - public function toInsert($table, $data) {+ t+ v* g! |7 O
- $re = $this->database->$table->insert($data);: }, O: v3 ^. t$ o9 @
- return $re;
! ~0 g2 c( w& L1 c/ a* [+ d - }
1 {. p3 g/ n/ a- T, ^ - /**
. [6 {% k( r: Y& h$ E; i. l: c - * 更新数据/ M8 f0 D7 L$ m8 W) m. P
- * @param $table \. ]3 ?- {4 t" ~
- * @param $where
! \9 A- ~4 n7 p% R3 a4 R! c$ n - * @param $data7 c$ g9 O: ]! ~$ u
- * @return bool
% N5 e# M% s! i; x" A5 K8 ` - */0 H3 S; P6 c5 M4 z7 |
- public function toUpdate($table, $where, $data) {% ]3 l8 @; o6 g& y- {
- $re = $this->database->$table->update($where, array('$set' => $data));
: V3 `1 y g- X4 w/ Q9 G6 b# _" \ - return $re;
2 A* z4 i. R5 Z5 V& G; ~1 w - }
& Q1 K' a, ?1 q+ T; F! H9 d - /**$ Y! ? `" F( y; w
- * 获取唯一数据! J! X2 p1 I& ^) x1 i( X h
- * @param $table
- W. M; h+ I& C - * @param $key
9 h) I. Z1 T' z2 n5 e% d6 Z - * @return array
8 k, A2 M- Q! f2 k4 g3 Z - *// \1 S# x- k; Y& d% s; O7 T/ E
- public function distinctData($table, $key, $query = array()) {
: ?: x1 \2 m) ` - if (!empty($query)) {8 Q1 b, G. B- U8 J, ~
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);, v8 z) M0 s2 p; P
- } else {
( K* q# z' V, T! t( Z4 G - $where = array('distinct' => $table, 'key' => $key);
& d' I1 N3 ^, n# ~' ~2 Q9 c$ } - }' Q$ N) f, z4 s+ j/ w; ^, e
- $data = $this->database->command($where);
$ o$ Y6 V$ e/ y! E1 F - return $data['values'];
. P1 }/ X% m$ k+ a/ L* l9 S- C - }
8 ?, F6 n1 S' S - }8 R: k2 N' u+ U6 Z& `
- ?>
复制代码
& n4 T* e% j: l' d9 t4 G8 o& J9 X. x( a% g$ x8 y
|