本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
4 n9 \8 J, _# p5 a* H* |模式自由。
. H* T% D3 g f支持动态查询。3 u7 Z% U; `5 o: a' R! q- c9 l
支持完全索引,包含内部对象。
; o) u# j! j2 m5 x% c% q( s# @支持查询。
- T: q. k7 q1 m1 ^支持复制和故障恢复。
) y6 G* a# `4 x' V使用高效的二进制数据存储,包括大型对象(如视频等)。
2 y& d8 g1 p F6 q7 t7 X Y自动处理碎片,以支持云计算层次的扩展性
0 Q2 Q5 P& m* ^2 M" E支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
6 \) d9 c0 F% C ~: E文件存储格式为BSON(一种JSON的扩展)
8 p) g( l0 N( b# g+ d4 Y0 u可通过网络访问 所谓“面向集合”(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
2 C" X/ r: b9 P. h - /**
- z- ]: d. L$ q A, i - * PHP操作mongodb数据库操作类* j, k! x/ E6 @7 v3 b! z$ Z) l+ \
- */* _- C; j. @! B1 Q9 p5 `$ m
- class Database {, R7 P: U4 _( [" J" m3 F
- protected $database = '';7 w) Y& H' Z) z% d) a: u
- protected $mo;" ^7 b# f# `1 B- u
- /**8 u/ Y" Z$ M! \# {6 e" L: I
- * 构造方法
! N' A4 z6 @9 g+ j. }; H - */
2 G3 H6 ?# i3 j$ x - public function __construct() {
( m$ L; e4 O7 D2 o& \( u6 ^ - $server = DBSERVER;
, {9 n8 x$ c3 C+ e$ O; J0 U - $user = DBUSER;
; s% }4 G* W; ^3 X5 ] - $password = DBPASS;
& x* E9 n2 \& N - $port = DBPORT;0 W0 j$ l7 X' e; X. | `
- $database = DBNAME; D3 o! q+ c* E0 C6 i
- $mongo = $this->getInstance($server, $user, $password, $port);1 u: \. O! r2 P( @/ \
- $this->database = $mongo->$database;
/ S3 Q' v+ b& E1 b; a& C7 J; g. U - }
4 j5 i+ y. w$ Z9 Z - /**
9 _* n7 Z# S0 q t - * 数据库单例方法
: {9 G" i* b7 n; Y6 {5 D" u: G# T - * @param $server+ B9 P- Q. q- p; {, o8 J. h# ^
- * @param $user
* T: ^3 S( M# ?' v/ h - * @param $password# w) [+ e! H! w) _! d& R$ ?
- * @param $port
( \. b# ?4 {2 `: u; Z - * @return Mongo; H; N/ |3 _' R/ a4 E! p
- */
( {) ?9 f: e: f5 g8 q3 j3 ? - public function getInstance($server, $user, $password, $port) {# q+ p% v# ] [& J
- if (isset($this->mo)) {
8 O( h% a9 ~* A) `: `: \6 A - return $this->mo;4 I9 k/ F( _4 @* y/ L' p
- } else {) [5 ]& W0 k" s4 O9 ~, l) C2 r
- if (!empty($server)) {
/ ^+ R* R' B3 c - if (!empty($port)) {0 I- L$ F4 W9 r3 N( @" t% C
- if (!empty($user) && !empty($password)) {, L, J3 c0 g o; i6 p6 ?3 S3 X; N
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");8 |7 s% U: C9 W9 {" x9 B: A
- } else {+ o1 v6 m: k1 N: Z! J9 c
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
- u9 g$ \+ r3 K+ E: y5 l' b - }. k' I$ v% B% c& k2 i& v
- } else {6 x7 B$ c5 U6 a* t, C. T
- $this->mo = new Mongo("mongodb://{$server}");4 d+ P9 }, Z, T6 t# u
- }: D+ `( a7 }+ G8 ^) S8 c! e
- } else {
. A# @ h2 ~! N! z* ~: N1 \ - $this->mo = new Mongo();
, t- A; C$ M! ], W' y, f7 y - }
: ^+ W$ j1 U- }$ P2 t. T$ v - return $this->mo;
$ U7 z6 t4 k7 ]4 n f - }! m9 V- g, c' ^& C# l# v
- }
, Y) |* ]& v* B0 J8 V - /**' E: a; b3 c) j& p5 n) r9 X
- * 查询表中所有数据
6 U1 v+ |2 K8 w - * @param $table- y' h/ I% k& n: @
- * @param array $where
- E" b3 z/ @1 P' D! h - * @param array $sort" o8 i9 S5 S# P/ \0 r
- * @param string $limit
$ M6 u8 { Q* y2 t. ` - * @param string $skip; H5 D# d, ~: a3 F# a
- * @return array|int
$ w2 ?7 K( M9 Z& w; i - */2 l! Q/ c5 }% K
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
1 E* W3 S% \0 y/ h - if (!empty($where)) {/ W. Z% k! w8 d. B
- $data = $this->database->$table->find($where); R& I8 V$ `! L5 f+ |. S" e+ c
- } else {
8 m; H1 U0 l/ z; [ - $data = $this->database->$table->find();
4 s; U9 `) ]4 d" s" @+ G - }% t5 O8 w; N/ W, ~ n; K. {
- if (!empty($sort)) {" [; r' Y) G' q7 `
- $data = $data->sort($sort);2 l1 E3 U) b g( R# v. V; S
- }% `0 O, D; L' u0 r0 o
- if (!empty($limit)) {
7 [2 v+ K: b, @7 \ j( f/ R - $data = $data->limit($limit);6 A/ G# J# O5 R/ j3 t
- }
) C7 |) r9 O. p. J6 n$ z4 s - if (!empty($skip)) {
, s- s+ X" W) `- _: o& V) z P - $data = $data->skip($skip);5 F! t+ r/ t. u1 b
- }6 [' p2 M3 z" [- o% M0 [
- $newData = array();
L! P0 c* z$ T- Q: \6 x! ^ - while ($data->hasNext()) {$ v _' K' K* Q, A
- $newData[] = $data->getNext();
+ f, \# U. }$ }& O5 P n9 e W - }
' i( V5 v0 L) f8 f' c - if (count($newData) == 0) {
0 E: r3 y1 [' i& G1 Y( x% J - return 0;- ?! k" \0 K3 B5 y' p4 `
- }
7 x' M P' {& T" _( ]6 Z0 \ - return $newData;1 H8 [, m( ^0 I4 M. i! d6 J2 j( w
- }
4 d9 m/ A$ V! L* y4 R8 c7 M - /**
/ K6 Z ^1 _, U5 U1 v6 x - * 查询指定一条数据
, w5 ^- ?3 r) c5 }; D - * @param $table% ?0 V7 G9 r5 [1 ~+ j
- * @param array $where% ]: _5 r, }" y3 I' {
- * @return int
% H1 Y g$ W4 I; ?3 V, j - *// ^3 X2 y% p9 m4 w5 s* l! j; I3 S
- public function getOne($table, $where = array()) {
. Q& A7 u5 @2 {9 w# G( y5 g - if (!empty($where)) {
. P; x) f; F9 `( O - $data = $this->database->$table->findOne($where);
2 @! n3 Q0 V+ [ ~! _2 l- `4 Q) } - } else {! M' K. I" C( }
- $data = $this->database->$table->findOne();
' t& K9 y, g. f. _ - }2 f3 T3 h( I- D D9 d' S% Z
- return $data;3 W1 A$ J; [% r" }6 K2 A
- }
) C/ F1 a+ r7 A7 R' K) H- X - /**
4 i$ f+ a' s8 I. J' c - * 统计个数
* U5 S& M& f- j! J8 @ - * @param $table7 @* C# p! R! U% G9 D7 l
- * @param array $where
- O, l% z* j' B- q( `! T - * @return mixed" X0 R6 Q) q2 Z, U( F# |! ]
- */) S! x4 K4 d; T1 n, E) Z
- public function getCount($table, $where = array()) {' `. d$ l' V/ w/ g# c
- if (!empty($where)) {
) V |9 K, A, D( r0 q2 S5 ] - $data = $this->database->$table->find($where)->count();
- @" h3 i/ L* b+ \ - } else {$ U$ n' x( P# B8 G% M2 }
- $data = $this->database->$table->find()->count();
6 `4 o @! `" p: L P+ @ - }
& C6 S7 K- J( r% f" v+ M1 e - return $data;5 u; A. k8 y8 k, |
- }; ^5 e6 I1 F9 y. h% u) I; @
- /**- s( L7 g9 g6 w5 q* d( V+ O% z( \
- * 直接执行mongo命令9 \% m5 Q+ T2 G
- * @param $sql3 }& k, n n! b3 |0 ~
- * @return array; Y2 R# _& X7 @4 E- ^& z o
- */
2 u, ^1 l9 C5 m/ W4 X! g# V - public function toExcute($sql) {! @4 c" m" N Z$ C4 _* z9 D9 h
- $result = $this->database->execute($sql);
! o5 o1 v/ y- j$ x# W0 @ - return $result;
7 Q6 s' Z3 ~2 d4 S6 x) K& e - }
1 w; \# d& B* B, ~ - /**
6 M* B0 C1 x' b g7 R0 R: t+ x! C! R+ r4 b - * 分组统计个数
6 P! l; b6 `2 E3 m4 Y - * @param $table
+ r T1 K5 k X @8 d- a8 ?# F N: S - * @param $where4 {/ {& U& I% n
- * @param $field% b7 U# n( w3 ~1 Y
- */! O5 ~* n: V4 U0 X8 h+ Z( s( X3 e
- public function groupCount($table, $where, $field) {1 q, B5 N$ l S* x% { b/ T
- $cond = array(
: b) ?$ a/ p3 D+ ^- Q - array(# z8 F9 E! j3 C/ K: D. G9 `4 P
- '$match' => $where,
1 w8 r% w* F& \; u - ),
$ W9 r$ L! X$ h8 f - array(
! z. t1 g1 N- U7 D K, X' g o - '$group' => array(
0 |& r* G i8 P. W& X - '_id' => '% q2 D6 b$ H# g- M# S% {
- 1 M9 P+ `: M+ c
- . $field,# I+ }$ r; i9 ]
- 'count' => array('$sum' => 1),
1 [# B( F4 ?4 X5 T- w+ x - ),
' E3 G) Z0 Q# u' T* H - ),
$ E* }; M% `3 y: p# q2 o7 R0 I7 ~9 a - array(/ @) q$ E ~7 Y0 W) W- O
- '$sort' => array("count" => -1),
$ F8 M6 P ?3 _7 {6 {' w) S4 l - ),
; U. ^; e+ F& A1 z - );# h# e7 K( S8 N5 O
- $this->database->$table->aggregate($cond);
/ F( t4 }7 p% C8 | - }3 O' }8 @- M7 E) c
- /**" \. R; u0 @, h2 g. d4 Z! l4 `
- * 删除数据
I3 `5 r; y$ j' d2 G5 T - * @param $table
+ C. ~5 C" _- p* r - * @param $where
9 I/ _, Y# u' L, P+ G - * @return array|bool
4 P! ?. ?3 P. N& _# @6 w- l, f# K! M- C - */) C3 Y/ m5 m+ M. I" {, F
- public function toDelete($table, $where) {# ~0 |# ^' H2 w
- $re = $this->database->$table->remove($where);1 u: X0 @2 p5 O- s4 |. F) A
- return $re;
' X+ g2 y# ^2 s) K" J1 M - }
5 W1 h1 w/ B! D: o# @9 z - /**4 a9 L# ]4 b) {0 ?
- * 插入数据
7 z7 I0 h8 A+ p0 G' z: z0 A8 N - * @param $table. A6 K$ s: |5 u" k# N% K$ A
- * @param $data6 M% U% d7 O) a- {, b I
- * @return array|bool
W0 b" n& c/ M' P - */
. s. J* F5 O# j6 [+ [ - public function toInsert($table, $data) {, V' J5 G {$ J. m( i
- $re = $this->database->$table->insert($data);. V" h- T: d" ^: Y+ K; I: w8 e
- return $re;
5 h$ n3 c& _! h( r - }
; Y# P$ v7 U+ [8 a6 n* ` n# ? - /**
( v ?6 \0 C/ e. T8 |! J4 J) s - * 更新数据
% v! s2 u, ^9 a - * @param $table: D' m v, w" k& x8 j
- * @param $where
+ d; y4 B7 F# S0 ? - * @param $data! H( l9 o6 X6 k) {4 F
- * @return bool
# p9 S8 E9 u% ]1 P. d# ~, G - */$ c% n7 A! }+ @: X$ w
- public function toUpdate($table, $where, $data) {
9 D1 Q) y6 R9 m6 _/ P% z7 R2 Y$ l) \ - $re = $this->database->$table->update($where, array('$set' => $data));1 B- e* i8 q0 T0 U, s. b: I
- return $re;( U; c! K% }) S) L7 E0 ]
- }
# T' |, T/ h9 j* x - /**
5 p7 Q- b7 G% \2 D5 u% s! I - * 获取唯一数据
6 q; Q, H0 q, r1 C - * @param $table
6 O. [5 s- A0 _% q; ~) F' F - * @param $key
8 C5 a2 a9 Z4 A) M6 l( N0 | - * @return array( p& h! R, v8 j8 y
- */
$ Z1 Z1 s- j2 c6 l, g - public function distinctData($table, $key, $query = array()) {% O( N1 f1 v9 E' h6 k: b& h- A* M
- if (!empty($query)) {" F/ Q. q" w1 f0 E+ c
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);6 x2 B. i9 m, a! c2 \, d! p
- } else {! v/ {4 c* a- M7 d9 v. u
- $where = array('distinct' => $table, 'key' => $key);' N# c7 r# M+ G- F* V. d) a
- }$ H, q5 o) S& {3 o$ \
- $data = $this->database->command($where);
/ L0 M! B6 Y @7 }7 ?4 [ - return $data['values'];
/ z m) h0 ]5 B- N% z& | - }
/ w2 I- r0 `" h; r4 b+ ]4 F- C - }7 X; k4 @' H% S C3 N0 F
- ?>
复制代码 K/ k& v @8 R
1 L* b" _. C0 m4 S1 a) ]
|