|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
; d2 Q& @( i- Q ~模式自由。& F3 d1 j! N. p% k
支持动态查询。
0 m2 q9 }" J1 A+ C4 @7 a支持完全索引,包含内部对象。
* @* Q, [8 ]* r支持查询。
3 x7 F# X' @* [7 _, |支持复制和故障恢复。+ W/ _& m: |, T5 o1 V& t4 `
使用高效的二进制数据存储,包括大型对象(如视频等)。
( h% X" r' h! `自动处理碎片,以支持云计算层次的扩展性
/ Y* v, C- x' V- c2 |支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
# j5 h1 ?* c# x1 Y$ M文件存储格式为BSON(一种JSON的扩展)' y1 j( Z9 E# Y* p9 D8 }- o, L2 u% b9 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
: y3 D% n( J2 u* B" Y5 Q4 O) C- D - /**" H' q# n0 ?' U& \3 V) X$ p
- * PHP操作mongodb数据库操作类! f' z6 |4 Y# f( c: K
- */4 U) w# W( l3 w- m+ a: m
- class Database {7 O; o4 x" m9 z: d& A; V
- protected $database = '';7 @- S% p7 Q! ^
- protected $mo;
5 ?7 a8 A: V( ] - /**
/ E1 s7 F3 j# t0 v& A - * 构造方法8 t1 i2 c8 {4 o- S5 j7 w' M
- */
3 C1 H1 @; q( Q' W3 K3 w - public function __construct() {" N8 W% ~' p8 ^" d2 p! d
- $server = DBSERVER;
1 |# @1 C1 d% y# B- \ - $user = DBUSER;
; u9 x, F/ t' ^8 @ - $password = DBPASS;4 y8 v6 R4 I, G& a
- $port = DBPORT;% a+ i% s% W4 O5 u& @' b8 N
- $database = DBNAME;0 d, g0 L2 O4 r5 h8 {: B
- $mongo = $this->getInstance($server, $user, $password, $port);4 Q4 f8 ?+ }4 H
- $this->database = $mongo->$database;
& b3 h7 e7 @% r1 r6 G) j* k1 b - }' S: T7 {6 f/ m) ?2 C
- /**. k1 j4 M9 C" C9 K$ U
- * 数据库单例方法
/ ^5 A7 Y9 v# Q# l/ R - * @param $server; C- W% y* w+ D% ?5 z* K$ Y
- * @param $user
5 p7 I; n7 k e. q* A - * @param $password a) X- D6 p: O2 y" [
- * @param $port* p9 e) H- @% F# D
- * @return Mongo
/ W+ l% }( e! I; ?( Q - *// G/ l9 l! T; h Z4 i5 [1 ^4 \) A
- public function getInstance($server, $user, $password, $port) {
0 s4 l" ]. I+ d. H5 u - if (isset($this->mo)) {
# x( n. V9 M b1 U: Z7 d9 e3 c - return $this->mo;; w; ]+ a) N* s: G4 M
- } else {5 c \) O( {4 m2 p2 k/ D& ?5 {( o
- if (!empty($server)) {4 y/ A! X3 Q& W. {
- if (!empty($port)) {
% {" B! f# L" \/ C+ m& O - if (!empty($user) && !empty($password)) {2 ~# n9 ]3 c2 L( f* b
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");5 g5 M- w) H% X. b. s6 Y
- } else {
$ o% p0 T2 V0 ]: y g- { - $this->mo = new Mongo("mongodb://{$server}:{$port}");
1 ]3 ]" Z2 K. N - }
`& P! _& y2 W0 o% G9 e) j- O$ q - } else {
: }/ U5 q" E; _0 f' ]8 p; Q - $this->mo = new Mongo("mongodb://{$server}");
' n$ ?" B: `. _. H' U' D - }
}7 }- Q7 O- v: ^' C - } else {( g. C; S: F/ C7 M# ~5 A
- $this->mo = new Mongo();. @2 M; F8 |# V% U5 q k& _
- }
) r+ |: f6 f/ i9 ?* h2 h! X3 r8 f' v - return $this->mo; `$ ?" a& w- R5 z/ {1 U" b% b4 f
- }
6 N& x$ I& i |3 ?. F5 S - }
1 N* t1 `( }7 i; w% ~+ z$ T - /**8 S+ z3 E# Z: P* N X) W9 ~4 y3 H
- * 查询表中所有数据/ j2 Z: J6 _5 }1 L
- * @param $table
% C) M1 n. c1 \. d4 O - * @param array $where1 w8 V; {* ]5 \* z2 d$ q
- * @param array $sort
n. a9 c) j/ N8 o& p - * @param string $limit$ U% |9 n$ k% @3 g6 O8 V- o
- * @param string $skip
4 c( m7 b% g2 T8 E5 V - * @return array|int9 G- F8 m+ I+ B0 ~
- */# v! h5 I1 P% K) x6 A1 ]9 ?. Z- Q2 f
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
5 J& r6 c6 {" |3 N$ K, k - if (!empty($where)) {' G: _+ h2 ]/ V" A# a. ?
- $data = $this->database->$table->find($where);
, U% L% q! F- | - } else {5 d+ h2 q. }7 q$ ^' f0 H4 ]& I
- $data = $this->database->$table->find();
8 G" @& l, v5 o* @ - }
8 o& g+ ]; }5 Y( j" F$ M- O5 J4 {6 ~ - if (!empty($sort)) {
5 r, D- b9 n7 }9 X1 o; d4 T - $data = $data->sort($sort);
" r9 e% z0 C. H$ M. ?: B/ y - }
9 @) a; O4 L L6 G7 M - if (!empty($limit)) {; A7 B; @- r, D p
- $data = $data->limit($limit);. v, l0 p0 B- J9 p' [( w
- }
$ R( m' b( C3 Z - if (!empty($skip)) {
& x+ G2 x5 A) ~$ ~3 Q6 t: V - $data = $data->skip($skip);! I$ ~' H( |+ j5 [
- }: F9 S' J8 r% w
- $newData = array();3 w3 [# d( G# o9 x5 l( h% U
- while ($data->hasNext()) {) w5 R6 i6 |2 w. d3 K% }. o% P U* J' r
- $newData[] = $data->getNext();
5 f f+ F6 Y" z$ d/ E - }" h& D3 ` @! a
- if (count($newData) == 0) {
) o$ t2 i" j& @$ H7 K' ]5 |. M - return 0;1 e. x5 r7 [0 }3 i
- }
0 S7 ]! K$ }- b, ~1 a6 d$ l - return $newData;, G2 m9 ?' C" C5 {+ C$ z8 d" p
- }" }' s$ l1 U' n! Z* P! E
- /**) P w; }+ s* |% m: t
- * 查询指定一条数据
! E5 C9 O- G( ` X8 g3 f! m B - * @param $table
: O( Z( B* z, U) c2 G - * @param array $where
6 y u5 ~3 S6 \ s - * @return int
2 f! G$ u6 G! Z0 m! \# H - */: q7 }6 _% ]! j" Q: S7 \/ f/ _" }
- public function getOne($table, $where = array()) {# o" H9 u& z" @* m; m1 V
- if (!empty($where)) {8 p/ T- ]1 a/ {; w @' C
- $data = $this->database->$table->findOne($where);" k4 _8 m0 m9 R6 s: W7 Y( q
- } else {; x/ P/ u u: f7 o C! d
- $data = $this->database->$table->findOne();
! o" }' ]# b4 U) s: @ - }. f/ X- p% s- T( X2 [
- return $data;, ]7 {# g, T/ X F) g( o
- }" N5 g5 R: _3 V7 p1 ?
- /**2 w; R H& Z& ^; z& A; R9 f
- * 统计个数2 B) }1 ^5 \+ l+ \( }# b' H
- * @param $table
, ~8 w& _8 @1 ] P7 ]$ y# _ - * @param array $where
, F9 K! v. M/ f. K, V! g- I( O - * @return mixed
* A& n' V8 u1 {: B# O p% E9 ` - */( a$ e9 w3 z0 M0 H1 u( }- R
- public function getCount($table, $where = array()) {
) q9 ]7 H8 E L( W4 K6 @ - if (!empty($where)) {
& a! P, j* y& l: D k& J - $data = $this->database->$table->find($where)->count();
' ^1 Q" o' u8 x, u& k1 H* Y. ] - } else {. \1 w& \- P$ A# x2 P
- $data = $this->database->$table->find()->count();
# J/ ]9 r$ q2 r - }2 _! e- O9 B" s5 b
- return $data;
( v1 p* J1 D. N) m& }8 S0 S. e- m. x - }
, w* r/ \% S' e# b) S B - /**, q/ M9 ]; @( p+ V7 ^
- * 直接执行mongo命令
/ u5 L) ]# |! ^# B - * @param $sql
. g. f( U$ F% V: N - * @return array
" u+ {: @ A4 P% ^& Q/ W - */& ^5 u! e0 ~% Z- F( O7 {; v
- public function toExcute($sql) {
5 o3 c' t! M) b, V: c( ^9 O - $result = $this->database->execute($sql);
1 S/ \& w, T2 a' M( D - return $result;
% J: d: N7 Q6 S K% J0 \' p2 B- P - }" D0 n: W6 ]$ I% n
- /**
( F" @5 D+ S1 R7 ^- X; g" a - * 分组统计个数& e: T7 k3 b/ p# V, D. [8 }6 t
- * @param $table* N V& _ a8 b, X. E/ i
- * @param $where% Z a9 r: j' B( s
- * @param $field, \( D4 s0 t9 \2 P# d
- */6 l+ Z$ O k @' V3 y9 W( I
- public function groupCount($table, $where, $field) {
! v5 u6 b" O. ]6 u - $cond = array(
+ D& D4 b# t* M! c - array(! p) Q& _0 U( T' y
- '$match' => $where,3 i9 }% I" }& z8 t/ u* N
- ),# h6 h6 r0 r% k3 i9 U2 N2 s3 z
- array(
2 W" M( R# ^* h% C# U0 n, b0 L - '$group' => array(+ \$ k' K+ a1 O3 f: M: H7 u( }
- '_id' => '1 k5 I) t; L( r0 H
" T- E. c; x( y$ A4 e- . $field,
6 i$ A$ K, _, {. s+ h& f& Z% t$ z - 'count' => array('$sum' => 1),- Z5 L8 ~: m* ?) z+ w6 Z' F' Z
- ),
6 {* Q, c1 r0 f% c5 Q$ ?" L. o - ),
: ~6 v. g9 \* }6 t: r# G1 a, j - array(
8 M" \: Q! H: U - '$sort' => array("count" => -1),
+ O: X1 _2 c: m { u1 U% O6 I - ),
3 x( L/ l/ C; T - );
1 Q7 a4 b4 _4 }0 _) X: Z - $this->database->$table->aggregate($cond);
: K( d1 M: ?+ f# j - }
: }/ M$ A0 u: f9 R9 o - /**/ J2 ~" _, L' m) { m
- * 删除数据
; T& l# ]: y& t$ }/ K8 [ - * @param $table8 o9 P5 p5 U6 V3 F0 N
- * @param $where- v' B0 Y& a% I4 Z1 z7 h! m- d# C
- * @return array|bool
7 `/ r0 N) v0 D - */
7 h x0 R8 }; l/ o6 | - public function toDelete($table, $where) {
7 A9 S7 D0 Q! I3 {. {! n* E9 p - $re = $this->database->$table->remove($where);$ O( _: E! V1 y
- return $re; E5 f2 p/ N) i
- }2 C8 Q d" C6 \$ J
- /**
6 x2 E4 d: I3 r t& f, F - * 插入数据
. `0 W" H d$ V- \' w; x( ` - * @param $table$ k& P1 y( A5 t
- * @param $data
. E) K7 Q3 v$ T! \. a# o) S - * @return array|bool
* b4 u" M/ R5 k3 a - */
( F6 w# {. T6 f - public function toInsert($table, $data) {' j. Y3 d; P* F
- $re = $this->database->$table->insert($data);
9 e. ~( ~$ S$ h - return $re;
, u! @" f4 o9 \: {7 B: A! W3 a - }
/ l, R. a+ ]5 d P) q, K - /**
! S$ L: z5 @1 A; ]. ?5 ~ - * 更新数据
" g* l8 [4 H) Y$ ^ - * @param $table
0 R# |' l- Z/ s" P( C - * @param $where! u4 x8 N! f' E7 e: F& |
- * @param $data
; F& u" \( a2 d& M- {4 t- G6 p - * @return bool
( _1 M( w: |* {2 f' t - */: V' a! {' L/ k+ a O
- public function toUpdate($table, $where, $data) { j! q- i. G5 o. d. V2 S/ T: E
- $re = $this->database->$table->update($where, array('$set' => $data));
1 U* A- k" Q$ J s6 V5 z - return $re;5 G5 x! s, J' ]% e
- }
- U" |3 [0 K5 }6 K( H* _' I - /**
/ X- h. m$ W, e5 G - * 获取唯一数据
2 W' Q9 _( S1 n" G |/ M - * @param $table. l' R+ o: u- z! U6 Y
- * @param $key+ {8 M$ u1 t3 _/ Y" v2 I7 w' J+ N( ^
- * @return array& x4 ], O) c5 t S
- */$ e8 ]) j9 o# X7 T3 b
- public function distinctData($table, $key, $query = array()) {$ {7 `+ C( K+ } B& q+ K( o
- if (!empty($query)) {2 {/ m* x$ ~& @) D6 k7 X
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);1 k3 F i+ Z1 G% e, N
- } else {
3 p% C/ b' N4 v$ H( C1 y - $where = array('distinct' => $table, 'key' => $key);
4 p8 }* y2 N' \2 D9 Q2 J - }6 k1 w6 \: ^# B2 h% o
- $data = $this->database->command($where);
$ t8 k4 p& E1 N9 M - return $data['values'];' [. s3 c p- `. I
- }
* _0 y: t$ P, i% D( t- f - }3 i5 y* Q7 e% }1 e- ~" ~
- ?>
复制代码 D! t8 C2 B9 f8 i! ?! i
) G% e- Y1 ], \; Q |