|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
8 g1 U, A o% n r* O模式自由。2 P/ E1 C. q) J* H G
支持动态查询。9 n, I: o- I) w8 k* Y
支持完全索引,包含内部对象。+ a$ e5 ?# a1 A2 D7 |
支持查询。
" C9 q. Y& P0 _- q支持复制和故障恢复。
5 B" M$ A7 l8 Y2 H使用高效的二进制数据存储,包括大型对象(如视频等)。! P0 N- ^* C: R9 Y
自动处理碎片,以支持云计算层次的扩展性9 v/ F& v8 y- h& G9 Y* `
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ b' K- i$ t9 j文件存储格式为BSON(一种JSON的扩展)
5 I3 ?& g3 B/ s" b( 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数据库的数据库操作类源码如下,仅供参考。 - <?php
' T( H+ V; d6 ~ - /**1 ]3 h& Q4 F- X% I. H
- * PHP操作mongodb数据库操作类
6 R2 x4 K7 n' s* M' { - */; o5 E2 x3 K0 R) X
- class Database {9 X5 y4 b t+ x
- protected $database = '';) n* P. R- ~0 U- N" I% s
- protected $mo;. W/ L# D- W5 V! Q
- /**
. H9 I* V. ~- T5 q - * 构造方法8 }8 l% B* i1 V7 C+ ]& _3 G
- */
+ z) M. ^. E9 e8 D4 R2 G - public function __construct() {
6 z7 q2 i; N t' y' n - $server = DBSERVER;
4 n5 ]% C+ [; v0 `, U: k - $user = DBUSER;, n+ f' @' U) m% C8 ~ L
- $password = DBPASS;
; o8 O: h. m3 {" i8 O$ }. {, ] - $port = DBPORT;! }6 {7 F- {; F8 c( J( U
- $database = DBNAME;
9 E& b: G6 x* q5 K - $mongo = $this->getInstance($server, $user, $password, $port);
; _- p5 H) H6 g( g+ c! N - $this->database = $mongo->$database;
+ t9 p" R3 m' b% M2 r0 C% }' b8 }+ L5 h - }/ p: P5 Z) M1 v! \- t
- /**
& S2 ]. m, ?" }: Q8 n - * 数据库单例方法2 Z% {" I! y5 @" t1 n' }9 A
- * @param $server
( Q9 N* Q3 P, V p& h - * @param $user
7 _) a* Q: `3 L2 q: s. L - * @param $password8 f! H9 ~; A4 j) ]% V( ~
- * @param $port7 |" P0 @1 y, V8 ~" P
- * @return Mongo- U9 G& W' S0 ]
- */9 @9 z; @; t+ f6 F
- public function getInstance($server, $user, $password, $port) {8 V# T2 x# \5 ^/ {
- if (isset($this->mo)) {3 |2 Z5 _6 l; r+ ]
- return $this->mo;
E6 E. `" C: G% `/ j1 y - } else {7 g+ R" `; x: Q+ x7 Q% J6 M& x
- if (!empty($server)) {' B- U8 j8 F) `% H3 e$ l; D
- if (!empty($port)) {
0 | T1 }- L' q) A$ C - if (!empty($user) && !empty($password)) {0 Q; B- e1 L9 V+ W3 K6 e: M1 o5 D$ |
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
. [7 W6 E+ F( W, C - } else {2 J' N$ q' e: F! L: W
- $this->mo = new Mongo("mongodb://{$server}:{$port}");. |* C$ Y3 P9 U9 I& u" W
- }. {% @( _3 v- Y
- } else {
/ _/ R+ a9 ?* t# a( J5 k# n0 s" ? - $this->mo = new Mongo("mongodb://{$server}");% L9 ?7 {8 }. U
- }
8 ~" q: w! d# {: V5 O: B6 ^# @2 R - } else {! y) O% M7 K3 N; [. P: ^! K
- $this->mo = new Mongo();4 y7 e# z1 v, w. h" m
- }7 i7 }+ t5 f$ T
- return $this->mo;
- }0 k G9 A" [9 f! ]7 y5 p - }1 E8 i+ O: `" \/ Q) C1 z9 E0 t
- }
X4 P/ A0 I$ w; C$ [. H - /**/ O2 S: V4 p2 N
- * 查询表中所有数据; t7 t2 m' t6 ^# [, D
- * @param $table& {# ?* l' w' ]
- * @param array $where
- T6 ]8 P7 J4 b - * @param array $sort1 C5 I8 e! S3 ^) v4 M6 C" D
- * @param string $limit' r: M0 \8 p7 ^* g. ~1 X
- * @param string $skip
9 z5 T- w5 g% I0 K. G - * @return array|int
% B* Z/ O. Z4 D4 ?3 |! N - */
/ `! r$ s6 U: S - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {7 ?0 y M, R" \
- if (!empty($where)) {, |" r+ A- t, P
- $data = $this->database->$table->find($where);! _# i$ J& i0 c+ D1 i' N
- } else {
& o& V5 Z" @( l* p7 _9 Y - $data = $this->database->$table->find();
# T5 `0 ?' Q# K - }
. V$ L8 ^! \5 L. h! w4 s1 P - if (!empty($sort)) {
9 V- P; [- j: V! v7 | - $data = $data->sort($sort);) k5 j( M4 C" e, W1 |$ a
- }
' y& b# k+ q- m: s/ g, C( o - if (!empty($limit)) {! X) W; I# f+ T0 O
- $data = $data->limit($limit);: q0 | R" @1 V
- }4 I1 r0 P6 \+ l Q3 b4 {: O
- if (!empty($skip)) {& V, i6 D+ l3 @6 T/ h
- $data = $data->skip($skip);9 f3 F, u- E: B3 D& c& o9 @% b
- }0 b( ^) |8 L9 ?2 @! ~$ v) X
- $newData = array();
; g0 V* E9 i2 `4 T3 p7 v) A - while ($data->hasNext()) {
9 d9 @+ _7 F8 ~1 ?+ A - $newData[] = $data->getNext();
0 `$ H0 o, [, W! o - }6 Y# e- d4 P, F7 L* ^% f6 u% N, T
- if (count($newData) == 0) {
6 i; H ]& Q! M& `. E - return 0;4 K) S, Q0 `6 W; X: D
- }5 l! X3 w- t; a* B$ r2 N! f
- return $newData;
6 d* t* |7 _" k. ^( L5 ^" q - }1 m4 h B( _. P( e
- /**, y" z, l' g2 g2 M" q! k# u
- * 查询指定一条数据
3 K3 h( N9 d, ^7 P0 B$ s - * @param $table
$ r6 `3 @3 u/ k2 M2 R0 R4 f6 } - * @param array $where
4 s$ Y- G }9 k" l( O - * @return int
* _. O5 l3 B, S; o; [/ a - */
: R$ P5 F6 k2 N/ q- _0 r8 ` - public function getOne($table, $where = array()) {
: r9 r( j. U* u3 f! ^ - if (!empty($where)) {6 V- e7 f$ E, G1 T, M9 y
- $data = $this->database->$table->findOne($where);" U2 A/ B% @) n/ h
- } else {! M$ v$ H1 F, r3 K
- $data = $this->database->$table->findOne();; y: s$ q8 d% m5 a1 P
- }/ s7 J. O4 q4 ~$ Z0 a' b: N
- return $data;3 p) _8 w0 c4 U1 u+ r* p( [
- }
$ D5 _/ O0 S8 ?% x8 R4 G - /**3 H/ v$ G" ?8 F" I& o( R* z
- * 统计个数' J! y5 k" T# d x# T$ F
- * @param $table' k$ k) u9 E/ F( S
- * @param array $where* y3 K' z: g6 R4 j
- * @return mixed3 z0 k4 h$ g$ Z7 v& A" I9 B1 D4 ^
- */! U' L2 d Q" k+ [0 Y
- public function getCount($table, $where = array()) {# p$ I% S6 J1 s' ^! T9 _$ V. Z
- if (!empty($where)) {% D6 {& }, u$ h. P9 @5 ^
- $data = $this->database->$table->find($where)->count();
; c; y. }6 c* w, X2 z - } else {( L8 w, I/ |" r
- $data = $this->database->$table->find()->count();
& g2 T1 h1 E6 {, g9 T& {1 f - }0 B& E3 C" }2 Q' V* U' X- x4 S
- return $data;
* e/ X: i n2 G6 t - }4 A8 f0 G2 W& _
- /**
. {8 f; ^& C: m2 d9 K. V - * 直接执行mongo命令& l9 X6 r' N. k# ?9 p1 k% G
- * @param $sql! q8 r' M$ g& i/ ^2 n
- * @return array
# [% d- w& G0 U - *// u; Z* G$ h' T# a5 b" l0 x
- public function toExcute($sql) {
" g( C- a% W% Y# f' ? - $result = $this->database->execute($sql);
$ w+ h8 Q+ o; D3 [$ k( y8 Z - return $result;# n A/ r% F) N, H! h
- }
& a+ P/ t# {. w4 Z7 x - /**
2 a, ^8 d$ N; @; k - * 分组统计个数+ S. B- c3 x! ^8 U3 \$ w1 n
- * @param $table* {/ U$ H4 x5 U9 Y& m
- * @param $where, c) \* B w& ~: D5 J% F
- * @param $field, Y: e2 |6 B, }& D# \1 H' q
- */
8 t0 w# J" Y5 G/ ^ - public function groupCount($table, $where, $field) {
0 _ U4 ^1 U' P - $cond = array(
( @+ f+ l3 Q! J* ^+ Y* b3 r - array(
, D( P8 Z* ~8 }+ U7 j8 i/ U - '$match' => $where,
# R" C) {- V; ?! }% b# _2 f+ J - ),' J) m" P W& l: n/ S
- array(0 r8 z. d* N4 i7 {/ \* N
- '$group' => array(
7 a8 C W, V; s$ Q - '_id' => '
* h( {. x2 \8 \, ]* H& i5 D - 6 `8 d- H, e1 ]: C8 z
- . $field,+ x9 x f/ x, w( M, ]8 ]1 x
- 'count' => array('$sum' => 1),5 R' A1 J- a7 Q G+ b$ i
- ),
# U! c: ?+ K3 e Y, G& r7 f1 @. x - ),
* e) C! }0 b, v - array(, [6 B: M+ i( f0 e( Y
- '$sort' => array("count" => -1),
. H! [ _( a) Z" G* v1 P3 Q7 \ - ),2 D- a* T+ o5 b! l7 o: e k2 z( m
- );
) [! U. O6 G& K* v& p) X) E0 y - $this->database->$table->aggregate($cond);7 [; r; M; A4 W8 H; h* n
- }9 f* f$ o; Z5 M
- /**
4 i9 n3 E' A: G u* W$ u8 @ - * 删除数据
4 `4 P3 E& ~$ Q+ B j5 V0 z - * @param $table
5 M9 k3 {( \: i4 W - * @param $where
* `* U/ f8 y! a- ~ - * @return array|bool) T* f( n; w& f. i
- */
/ ]% T# M/ a" A/ k - public function toDelete($table, $where) {
) Y: }& W+ U6 C) a( y2 F - $re = $this->database->$table->remove($where);
9 h$ g7 U i# J+ ~1 W p8 T7 P8 a - return $re;
) d8 O" I! a" |6 f6 |+ _ - }& _: b+ W1 _2 ~* @" L, r' M# i, t
- /**
7 q! \7 O5 s/ b0 A0 m - * 插入数据$ Q4 z) [" h) ~& X7 A
- * @param $table- i; [) e) u- R+ x2 r: c2 Y+ a* u
- * @param $data8 G3 G- k2 P/ `: \9 r) n- c
- * @return array|bool
6 g0 D w/ z( c4 u m - */
% r! s2 H( |/ l% o - public function toInsert($table, $data) {
: h+ c( L& y R: r5 W: u. t% C - $re = $this->database->$table->insert($data);1 _! i0 P5 D- d7 o, l% p
- return $re;
1 z0 n. T0 {6 h6 V; v/ A5 C - }) y# \/ e7 P$ L$ \) l+ k) x: f
- /**
: ?7 S" K8 P0 b5 |! V4 e6 X* c - * 更新数据
) c3 c9 a4 t0 `8 z% h - * @param $table0 Y+ O# }3 ~4 T3 i; Q$ Z( c$ J( m
- * @param $where7 W8 |8 {! `) j+ r
- * @param $data
! k: t: s- n3 v+ c - * @return bool- L0 Y/ z( d1 R( F4 x6 A- _
- */! d& Q( i/ d- x# w8 z# }: e* k6 D1 L
- public function toUpdate($table, $where, $data) {/ c* k$ z) v5 _3 C4 R
- $re = $this->database->$table->update($where, array('$set' => $data));* r, Z% L- R- E5 D+ V
- return $re;- w. V# g* {/ g
- }
, F/ d5 |, i2 l5 S - /**
9 O/ u1 q8 v, u2 j - * 获取唯一数据
- F" `" t+ E% ^9 S3 O+ a - * @param $table
# k$ {, z9 ]" v - * @param $key/ I+ {0 A% L0 u4 I4 q |- h9 [
- * @return array! e. k C7 ~7 e+ V9 X2 c" }
- */* O( k$ C0 u5 ?6 K @
- public function distinctData($table, $key, $query = array()) {
* p* G3 s8 A5 Y* O; j/ | - if (!empty($query)) {) K5 V1 D* D7 |" }; N
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);, G) n9 t; [+ }# H8 q. G# }
- } else {% N X$ Z. W z& x2 z# v
- $where = array('distinct' => $table, 'key' => $key);
# [$ h7 u* Z8 E7 N2 \7 u - }$ y" u0 q9 `, z1 H) F
- $data = $this->database->command($where);
9 l- _ e9 f. d# G3 [: ^ - return $data['values'];2 c: E t2 G7 n( y
- }
1 w/ l4 [3 p( I7 p! U2 i - }2 E7 F0 S$ q x, {7 A
- ?>
复制代码 ! [0 q" q' {: t: v ~8 \( \
3 H6 C6 U: A2 m2 P1 G
|