|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。' w" K7 I9 Y6 `- A3 n/ m! \& N. ~
模式自由。3 Q+ T g: G M8 H
支持动态查询。
( W, [& k1 z/ ~* c5 `% T' }3 h支持完全索引,包含内部对象。; q6 n ]7 U. d1 W6 U/ i
支持查询。
9 ]3 V' j( u# L3 C9 N6 h支持复制和故障恢复。
4 Z( d( u# M: A+ p5 }使用高效的二进制数据存储,包括大型对象(如视频等)。
1 S/ d2 B+ ]7 t6 |自动处理碎片,以支持云计算层次的扩展性/ I- g% B# h/ G9 E% n: ?) l; P/ b
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。" B2 |- W! H; Z; L! y& k- Q: ~+ v
文件存储格式为BSON(一种JSON的扩展)- L2 z* u* @. q8 `+ }+ b) a+ K' t
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php3 F3 Y9 O9 U Z5 l8 B4 a" ]
- /**9 Y6 H! U, l q# f% _' e
- * PHP操作mongodb数据库操作类
' w) O; C. E3 b$ v- X: Q- B4 Y$ R - */
! m6 P+ ]5 x- b. t - class Database { ?. H0 v+ U( p# N2 m7 U
- protected $database = '';: @/ g5 Q9 [4 |/ G7 V0 M# C
- protected $mo;
. S9 \" ]+ Q' p% }9 A9 ~% Y/ x - /**
. M2 u& Z% V4 I6 q, |5 O - * 构造方法, |% `4 p+ ^* Y, u* k2 n
- */
# S6 ^$ c, d: v$ S. C5 w' H2 V7 p- j - public function __construct() {% F& |0 T& @% x9 }% j! ?
- $server = DBSERVER;. {: E! S' V& ?7 Y. i
- $user = DBUSER;+ s4 w, ]! v8 x% W$ D- L+ Y# a, \
- $password = DBPASS;
7 K2 O7 K, m! ?8 J - $port = DBPORT;
: j! l; ]6 M% b# U - $database = DBNAME;' c% Q/ F5 N; K# W2 @- O
- $mongo = $this->getInstance($server, $user, $password, $port);
3 N# B3 Z3 x7 L - $this->database = $mongo->$database;
, i$ H6 M' s: p6 y - }- Y Y2 l# l0 z. @: e0 T1 m
- /**
+ D$ m% m* u$ G& U* e- s - * 数据库单例方法
7 f! P4 U7 b0 _% _3 l( n# y - * @param $server" M6 A8 Y; I7 T, s6 ^
- * @param $user
, b! M% V: k1 x, A! u - * @param $password
" m+ p% f2 l" K/ Y8 I* w - * @param $port5 r* U8 R. n |; I" f- R
- * @return Mongo
) N3 A: U: g' }) | {/ { - */1 @2 p1 b& o4 K. W6 H
- public function getInstance($server, $user, $password, $port) {7 T8 f; t) t) t
- if (isset($this->mo)) {7 ^% }6 T. [! O+ K
- return $this->mo;
/ x* |- P0 L2 h3 l) S - } else {! B3 ?1 u" q6 J, f5 v; L, v
- if (!empty($server)) {6 W2 U7 G& {1 M" ]
- if (!empty($port)) {
* |1 U$ [" R- ?4 t. }6 } - if (!empty($user) && !empty($password)) {
$ F: {% \/ U ?, K) \" T; C* b - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");% ]7 d, O8 |! a# Q/ ]! X* {
- } else {* q+ ?' i* V2 h! L9 g) K& ^( X
- $this->mo = new Mongo("mongodb://{$server}:{$port}");1 q- \/ d% C/ b) K( F
- }
2 G. C1 ]( n4 F' _( f4 q" ~- d - } else {
x2 |! }6 U8 X0 V* G" f - $this->mo = new Mongo("mongodb://{$server}");2 f. M" {4 c6 Q; u) a" b, @
- }
# S: L; R1 [- M1 a9 H. [" [ - } else {
. v; C# l, N, f7 S, p - $this->mo = new Mongo();7 p/ E7 N5 W5 W f8 ~
- }3 I/ G( u* H( u, G5 P& `# t' n
- return $this->mo;( }6 T: k& C4 ~
- }
6 z, c! P2 T8 w( z3 i$ v2 ^! \- O - }
+ }# o4 t0 U, @& w - /**/ @. X& r* j3 L) ~
- * 查询表中所有数据7 ~6 O% M& X4 j0 e
- * @param $table9 U$ B7 i/ j) b% e; I: a
- * @param array $where# P X9 A4 ?+ J6 m
- * @param array $sort
% r8 {9 u" b' I h8 j - * @param string $limit ^4 y) p$ k1 A u
- * @param string $skip
, g1 k5 J; ~5 L - * @return array|int- C* n x3 ?7 j7 G1 {& b7 Z4 M( V
- */$ Y3 I+ M1 K5 ^) T# v3 A9 @
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
: t$ K& Z6 g- V( k - if (!empty($where)) {5 t9 {5 |( G& V" G4 }
- $data = $this->database->$table->find($where);: p! E6 S% E9 E4 ]0 A5 r
- } else {
5 y+ F1 F6 \2 y, H1 L, y - $data = $this->database->$table->find();; u8 d- g- e! k3 Q7 `& W t
- }8 e7 F0 c' \. r3 w
- if (!empty($sort)) {9 f+ n3 F: ?: ?: q9 w! |& s
- $data = $data->sort($sort);
9 X7 s& F6 i& M+ v* q - }7 Q4 f5 j; v6 x# ^9 |! S
- if (!empty($limit)) {% O& d' a, q9 C+ A+ f. V- g
- $data = $data->limit($limit);
& ^$ ]4 }# x9 A* r& S - }2 m( M8 Y( p2 }$ P4 D& e( o) L
- if (!empty($skip)) {
. x' C2 e5 L. S5 q9 n: v1 W - $data = $data->skip($skip);8 K4 n, B4 {* i0 J7 F) Y
- }
( `' y4 k3 X P; C! `( \ - $newData = array();
~$ t/ p6 a& V# m& [& d% ^: a2 Q - while ($data->hasNext()) { _4 N0 L" j9 t( P/ Q. f# `) x
- $newData[] = $data->getNext();0 V) A2 b9 ] l2 L% `
- }9 h6 p+ X* T. [* w: g+ ~
- if (count($newData) == 0) {
7 y7 i+ I( ^1 H( s: k5 _ - return 0; U* |/ B. \+ R' c
- }5 l1 A& ^1 B- q# v
- return $newData;: j+ h, r% J! \ R& c
- }
* p& {/ o& ]) b2 Y- s - /**; t( W; z% F& X5 B6 @$ t$ g0 |5 k
- * 查询指定一条数据" G: r0 c) M I' m, g4 U
- * @param $table
6 [0 R3 e) i/ @4 F, I& p - * @param array $where
7 T* _9 o6 k2 }, w/ P2 t/ V) t; | - * @return int' m8 S. Q: L1 L7 U$ K7 g2 K6 X
- */
' K) s; }* G7 H1 B* ^ - public function getOne($table, $where = array()) {( A! ?4 y, K0 ^& U, I* n
- if (!empty($where)) {
3 Z2 p0 G1 S9 }* o6 u/ |( e - $data = $this->database->$table->findOne($where);
5 D( K' C- m5 G - } else {
! t; [ ]# U' z - $data = $this->database->$table->findOne();' ^; G4 D. @) Y- }) R
- }
7 X; F/ n, X) s/ w4 S1 b - return $data;, y! g: X( _" |4 t' g- E) L& |9 r6 _. A
- }+ t$ B$ V1 I" r4 A
- /**
. s3 ~. H3 A4 U5 }0 U' {* P - * 统计个数
/ C4 t0 x2 G/ @" e - * @param $table
4 ]" U( F8 [ w# [1 C7 i5 A k - * @param array $where
6 y: N# O( y. l% H" c - * @return mixed: i2 r A& q* v- N0 ]
- */1 F+ D9 l/ l9 M+ p6 `: c* _8 x
- public function getCount($table, $where = array()) {
+ o$ Q# ?/ ?5 k3 y - if (!empty($where)) {
6 R4 B& g5 `1 I# _+ x( j - $data = $this->database->$table->find($where)->count();; f& {. @ X) K8 k
- } else {
5 {) {9 K' U; z W$ n2 c - $data = $this->database->$table->find()->count();
# Z7 f3 D& J9 t% t. P - }
( ^! q- m! r$ n C; g - return $data;
! a! Y! T Q" q% [ - }- F0 U3 V2 S& z$ Y/ o" d4 e
- /**
$ d5 C8 t7 d- l: T* q5 t2 ? - * 直接执行mongo命令0 f j+ a1 W R7 m: T1 i Z
- * @param $sql& s& w4 K0 t6 p+ }( J; u4 S" c
- * @return array
$ F' k6 {$ ]- U8 H4 A. P - */! B6 b% F0 ?8 w0 f& @
- public function toExcute($sql) {5 `& T" d; ?2 [: M
- $result = $this->database->execute($sql);
9 S! N; t1 t4 O3 G9 V9 F - return $result;( @, r6 z" g5 [# E. b
- }( p9 W3 r+ F5 u1 x, d& e7 C/ m
- /**
" v& k8 T2 r, Z4 k1 E0 s) F) R* Y - * 分组统计个数
# ^+ o' ~7 B9 R! K - * @param $table7 T" L' N% i+ Q
- * @param $where. Q" m0 K) K0 \. M; X# b4 }
- * @param $field
& w+ R5 o/ G8 W( |% @ - */
/ i* M/ J/ n0 s6 ?7 T5 V - public function groupCount($table, $where, $field) {
. ^% K8 f" ?, S* _2 \ - $cond = array(" J1 ?/ C( A# o8 E, o0 H0 o' R
- array(
% i0 Z7 q \! _( a* ?) Q7 `* j- j - '$match' => $where,
. U9 Q! c1 g o - ),0 K( B% J" B4 z G
- array() J F6 X: i5 l4 @
- '$group' => array(
- J# }: y2 m: m! d6 n: j0 C - '_id' => '
; c2 d6 M* A4 e0 @' Y- r# }2 N - $ z; x% A. a3 u2 s+ ^
- . $field,% ~: b) e5 H2 |* T; u2 E5 _
- 'count' => array('$sum' => 1),2 D9 A5 t" L9 u: J8 F5 _
- ),
# Z" y6 l# C% b- E( g - ),# O7 ~# l! g. }- A% s
- array(0 k% a! J3 t1 D; D
- '$sort' => array("count" => -1),
' k% |5 B q. f - ),: L, V( q! g. d. Y/ u3 O% h
- );5 |0 @( t, o$ s8 P
- $this->database->$table->aggregate($cond);% z8 G; \1 ]" \% R) P
- }
( W2 H$ u0 ~2 S" o/ S0 p0 n - /**
9 \* O1 t% c+ }- l# q - * 删除数据
2 e) Q7 a, _# [5 ~6 B* ? - * @param $table8 v& a1 P) C+ S( o" F9 y* a
- * @param $where0 ]2 T0 Q* v. E y
- * @return array|bool
* t3 N" K' y" F. |$ l - */
: W8 q, j; o( Y: z/ U- l) Z& b! Q - public function toDelete($table, $where) {2 O: g; z* o4 z3 b# k% K V+ M, k3 _
- $re = $this->database->$table->remove($where);2 H4 T; V# Z+ W, O9 n
- return $re;
8 L, e6 p4 O2 T# _# u& ?5 n6 b - }
/ f# S/ x" n+ y4 [4 q! j0 h - /**
' G% R, t4 }: {1 h1 G - * 插入数据4 A4 D3 b: ~) U$ Q7 _
- * @param $table
/ Q8 b# }3 z% t - * @param $data
# k5 D0 Y& P8 c - * @return array|bool
2 Y* d: F+ x; D3 Q8 E9 ]# y - */
) z0 l5 U$ M) H+ B2 u - public function toInsert($table, $data) {
. f7 T% s* w- K+ d# r5 w0 o: ^% z - $re = $this->database->$table->insert($data);
: R* n7 R! O: c8 I, q6 C6 [6 A - return $re;
, x" y x& x: Q# |5 B. X9 o - }
2 G! s( o- }2 }4 F/ A( O0 \/ J - /**
6 B( I" \ t2 p$ g - * 更新数据$ \- K# O) K" C2 v7 x3 _+ F
- * @param $table+ a- C/ X+ ~- i0 V1 C6 v
- * @param $where4 m3 k4 Q1 t7 o$ Y& o
- * @param $data/ B: B/ {8 A$ b0 h u
- * @return bool
- |3 S5 u- V$ }5 Z6 X0 B7 Q y - */- B; S i- Z4 V( _5 G' r |
- public function toUpdate($table, $where, $data) {8 s3 r# S) D7 ~6 p& x; T$ f( C0 c
- $re = $this->database->$table->update($where, array('$set' => $data));
1 b B# G0 e, Y - return $re;
8 G" X H& e m - }0 v. F0 m3 B# U
- /**
+ D5 i0 {6 m T' N - * 获取唯一数据: |8 j/ x9 O }) Z; `' p/ G4 D
- * @param $table
$ | C; i" _9 R; K4 x8 s" j- U& Z% s - * @param $key
' o/ b. ?1 f% [$ | - * @return array* ~1 N# k- t6 Z
- */ F4 e3 v6 S5 Y
- public function distinctData($table, $key, $query = array()) {$ H2 Q; f9 ~3 b' q5 y# r: {
- if (!empty($query)) {
+ `* z0 j; V7 P - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
9 J' P0 t* h$ c% Q5 i - } else {: G9 J4 Z4 `4 ?9 q; y& R
- $where = array('distinct' => $table, 'key' => $key);" R3 X, L8 l f+ C, O
- }" G& S |! X& B' q8 ?9 P
- $data = $this->database->command($where);4 G8 L z9 o6 ~: a/ t
- return $data['values'];
" {. C# ~' E+ k. _6 ?. c* A& \ - }3 f: J+ R% H% i) g/ i
- }
' t4 `5 i7 _5 m, U( @9 }. v - ?>
复制代码
/ A! ?9 ]$ q8 h) V5 J" t3 z7 G& H0 b0 a
; m# o3 h5 m9 `9 Y3 } |