|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。5 _& s/ i* J" c9 \) [, Y
模式自由。
6 p/ j) ]3 Q9 {7 ]( V+ A6 F* t支持动态查询。: ]/ l* ^4 V& P1 u t& B- s
支持完全索引,包含内部对象。
' @& P( J+ K0 o3 P( p }支持查询。) z) ~, x" V7 S# K! D- \7 P
支持复制和故障恢复。1 t; N5 n6 h- {, g2 ~& P, H; C
使用高效的二进制数据存储,包括大型对象(如视频等)。
3 u5 W0 i0 s' X7 P5 D, R7 t) r, u自动处理碎片,以支持云计算层次的扩展性6 t4 i2 U" D4 J$ e: u; k
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
0 ?( Y7 H, H5 [5 ]* m文件存储格式为BSON(一种JSON的扩展)
/ ^# V3 k# f h. ] M2 |可通过网络访问 所谓“面向集合”(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+ b$ e/ W& n+ f/ A
- /**
! a. Z: b0 a D6 X( J1 } - * PHP操作mongodb数据库操作类2 s$ G* l# y2 N5 Z5 J. A# _' l# r
- */
2 w* g1 @' E/ Q" y& `/ O - class Database {! ^6 M' D! C2 i
- protected $database = '';
; U# q' G% N3 s" C2 k; w" l* k - protected $mo;1 K9 H/ M: o7 n* Q% B
- /**' T* q0 L+ P6 [* T' {8 ~
- * 构造方法: S* W4 b5 Q1 x* W: N# g
- */
9 c8 V' j" R( f0 u3 o - public function __construct() {
7 U) w, b7 U# }+ W) u% \& [ - $server = DBSERVER;
* n7 L# l" W2 m$ j' K - $user = DBUSER;
, G" T; Z# i1 u! y - $password = DBPASS;
! }# Y5 Z, x- q' d - $port = DBPORT;
- f+ c: Z8 v" Y' b' w5 @ - $database = DBNAME;2 R4 O2 E- d# N2 m" C6 P
- $mongo = $this->getInstance($server, $user, $password, $port);
3 R7 x8 y5 }6 n- Y2 Q, m - $this->database = $mongo->$database;6 ]- f5 ]3 E% b) Z
- }
2 ~6 ^ [' w8 o+ W: y - /**
8 r' G7 Y' C: R7 R7 U) X - * 数据库单例方法
1 O/ K4 S' f' t" P2 o9 D - * @param $server
4 D" g* M, a8 ~+ T2 I - * @param $user
* Q5 @0 l- e: c) |$ s+ ? - * @param $password4 D5 u+ b9 l# o1 C
- * @param $port
+ k8 X- z& p& E R. ~" O5 A7 u - * @return Mongo7 u2 w' q7 h+ z) q3 h
- */
6 f* o: R; O- K5 ]! b; _ - public function getInstance($server, $user, $password, $port) {
: _7 u! p3 v! V2 J W - if (isset($this->mo)) {
' j- M5 U' K+ e - return $this->mo;
- s2 [# |( f1 G! G - } else {
% n: ^0 a1 H8 I6 T) M. p. b - if (!empty($server)) {
/ w# D: _+ b* N- z0 O9 C. B - if (!empty($port)) {/ J- T& |* @5 j2 |% ^4 \4 d
- if (!empty($user) && !empty($password)) {+ [8 R0 C* L; H6 a9 h, d4 C- d
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
+ J$ R4 j: z9 Y* M* V, M7 O. c - } else {$ W1 M% C4 d3 A3 y
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
3 I$ Z& x N# d1 g: @+ T - }
0 h5 x" G; X9 |2 J( a - } else {, N- O6 W2 d6 a% b, P: w
- $this->mo = new Mongo("mongodb://{$server}");* }# |9 b. _+ I. s; M! F8 c
- }2 }* w9 `0 d, \7 N8 U% P
- } else {2 \8 C9 V$ N# g* `0 t: n
- $this->mo = new Mongo();
+ ]4 n% P; _( [0 o0 c5 h/ M - }
8 s1 [6 P& W$ c z, e) S9 D' N - return $this->mo;
7 D' x, B% q1 d0 G - }+ b3 Y- K% M% l7 [" E
- }4 C& @4 {9 C1 l
- /**
1 i5 c8 o% Z+ @# \ - * 查询表中所有数据$ f4 o8 O% K% }! A; [7 R$ t! ]
- * @param $table
% n9 J: Q5 p6 U1 D6 b - * @param array $where
- s P0 A& j6 Y7 U - * @param array $sort$ B' g: L; x w& L% N& ~
- * @param string $limit: x4 Z* g: E1 j. k8 H4 J+ I5 Y
- * @param string $skip
! C8 }2 ~% G, C4 R, W - * @return array|int
! ]! s& O! r0 X% X - */9 D6 f: J( t' V
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {# [* t# T+ S) }% U, S0 `
- if (!empty($where)) {9 c2 S& \$ |# u0 |5 G, N$ w
- $data = $this->database->$table->find($where);- M( W( w5 w3 L# ~$ T& N+ ~
- } else {0 \3 E- j: y7 t/ D) V% R8 j$ b; f
- $data = $this->database->$table->find();( [, U& `' Q) y# J) E
- }1 P8 N6 x0 P/ a
- if (!empty($sort)) {
, U, k9 q, @" H8 L - $data = $data->sort($sort);- @5 P0 ?3 W- I2 C
- }- V4 E2 V! X5 h0 _
- if (!empty($limit)) { X% G, C1 m8 w
- $data = $data->limit($limit);
% X8 h; F6 K) b s$ s+ E' u8 o - }
! p& c. Y# z7 ~7 B: d' |9 _& u - if (!empty($skip)) {2 W6 h, m& p% o- [; b4 P* R
- $data = $data->skip($skip);: w+ x" G2 V* }3 F$ q! j4 @ r
- }1 ~4 C) X6 G+ `8 l9 a
- $newData = array();, w @, x! t4 C6 }
- while ($data->hasNext()) {# ~' K' t1 o4 q3 Z3 i! j
- $newData[] = $data->getNext();
( i6 z0 |. V; D2 U) Y/ \4 a - }" l3 H, a7 r2 Q/ b
- if (count($newData) == 0) {
2 b$ @# O4 F4 K) k3 Z( J! P - return 0;5 g L, Y$ i+ a# P8 W
- }7 s/ n }$ [' _" B- P
- return $newData;1 @0 L# e) U s0 o7 Z% B
- } o+ D8 Q& i) r3 a7 @
- /**0 ?4 x+ r. s7 _& m W+ o
- * 查询指定一条数据8 D: Q4 f/ K6 R3 W6 f3 |
- * @param $table* E' d8 C3 Y5 T* |
- * @param array $where# |: n1 c6 ? D0 A# g
- * @return int
! I$ e. X/ O% I$ p - */
' o* v5 Q+ T) V6 Y9 R - public function getOne($table, $where = array()) {7 \ J/ T& F* V g( q+ l) F2 [, [* `: O
- if (!empty($where)) {
3 s5 D$ f y; c( m* t. u - $data = $this->database->$table->findOne($where);
& H/ {6 ]1 w; E& z- G - } else {
( U7 l4 }3 U5 I3 A2 c, l! w - $data = $this->database->$table->findOne();
) P2 h3 v+ Q% k+ H2 x - }
8 Y3 A/ o' S2 M L8 d' t/ E6 M- D - return $data;
0 ^( ~8 p, a3 Q* H& o - }
" x, t6 y3 G! o& T# E& @ `6 W - /**
) f4 V3 x7 _- W* M- ~4 J }7 N! J - * 统计个数0 A4 u; j* W0 K6 O
- * @param $table
% g2 U9 y6 y& N: J% H3 E6 T* q - * @param array $where3 C. c$ @' h6 E8 t* g
- * @return mixed: q1 i4 p9 p2 \( W1 ^8 \3 u
- */
: ]( T- p/ {4 g! V+ P - public function getCount($table, $where = array()) {
. X2 n% @4 o- j( ?8 B! H$ d! R - if (!empty($where)) {
9 B& s4 l4 }. x7 A1 g7 q - $data = $this->database->$table->find($where)->count();* y1 y& m" Z" g+ U) W8 x
- } else {! f: D5 |# l! Z
- $data = $this->database->$table->find()->count();
6 F8 m& A/ |! p - }
! X1 |" n0 a( D6 X0 a m - return $data;
# S2 i I' t, ?. P L( G7 R6 L v% ^ - }9 m$ T4 ^/ q* O% G) j
- /**
+ q5 S, o' p. N$ [ - * 直接执行mongo命令
, k# W# Q6 _! v4 z3 q* ` - * @param $sql
2 O. k# m' E9 I- O+ _& P% m - * @return array* s0 H$ a5 p0 l
- */# Y% C' ?! }$ Y: i( ?
- public function toExcute($sql) { s1 H o. U) Q5 m
- $result = $this->database->execute($sql);" g" D0 |/ b/ p; M9 A4 x. E n
- return $result;
2 v, o% L2 [$ `) B: U; r& L - }1 q; P) }3 \2 S9 G
- /**
# j" D4 X4 ]) {0 r5 s - * 分组统计个数
! S. h. _8 b5 l" T8 G4 { - * @param $table
0 z( s7 E8 Z6 A9 m - * @param $where9 U: B }/ V$ P8 T( v: Q8 n
- * @param $field4 y7 w1 N4 Y1 B- x
- */! T, B4 D2 [; @0 u
- public function groupCount($table, $where, $field) {
( Q' u0 |% S, C, X- y) \! } - $cond = array(
2 L$ ~/ p1 {) x - array(
6 `+ A" ?, H L) Q) {8 K" } - '$match' => $where,
. [3 |- m7 P p# u8 z* `- o - ),
; @( ]3 c& P4 L - array(
& y" B: w9 K, O' j& r - '$group' => array(* v, c. u5 G! z
- '_id' => '
* H. J( }2 F5 I2 w$ \. G
1 u# |6 u) n% ~- s _- . $field,( |5 ~3 o" q0 p
- 'count' => array('$sum' => 1),( |; W0 K$ Z- v' \+ l# X: I$ I2 }/ H# R
- ),4 c V; k' E( S) Y6 R6 t
- ),) @" l3 g4 L( }) _
- array(6 y6 {1 ^6 F- o1 D6 E% U6 P, G6 z
- '$sort' => array("count" => -1),( ~: h0 Z4 C1 j! d1 M: c
- ),
0 K0 J) I$ M, v5 I7 W W - );% a% Z' E# x9 _* ~2 C6 G, _5 V
- $this->database->$table->aggregate($cond);
. } d D3 p( m6 V7 b' d. }; L- Y - }
6 T( ]7 _/ x$ }% A - /**+ E* Q8 I; _- z8 q
- * 删除数据
5 O4 M9 u8 D9 b9 I' W0 s - * @param $table# o, `& e# |8 B! R4 b# z: H+ Z7 Q
- * @param $where3 y+ D$ H* u( @' V% K
- * @return array|bool' r" S0 V" K0 p5 I- ^
- */& G1 z$ ~, ^, R6 J
- public function toDelete($table, $where) {& K9 H' u. d% V
- $re = $this->database->$table->remove($where);
: ?6 e* W4 X# ?: C% A - return $re;) F4 w* N V0 N4 v
- }( ]: g w7 E- u, }( Y8 d
- /**1 _& q% [# K6 M8 f x! K
- * 插入数据
9 J% l' p4 h: t; d+ C. R - * @param $table
* V( N* M/ S8 s - * @param $data7 g5 z# g3 Y& o1 k9 \1 X4 ^
- * @return array|bool- R1 C" l+ e+ w1 I' r
- */) r3 Q1 W& L! i' y
- public function toInsert($table, $data) {5 V& X! i# G! P, j
- $re = $this->database->$table->insert($data);) Q8 g9 X4 c$ E' K( S. X
- return $re;$ d7 F# n/ l/ d( T& M( [2 I
- }
. w1 d1 Y) ]1 @, M$ P# M" F- q' H - /**% Z' H4 x) K5 {' p
- * 更新数据
) ?2 e8 b% X- p3 ~; Q% J - * @param $table0 U4 v5 M8 C: G/ I5 w( {
- * @param $where
5 J* G& f' v- x* K% i8 T* Q* x4 S - * @param $data
1 \5 R2 r3 j" l c U - * @return bool: f& E: g: J. Q/ H) V
- */
! q- f6 N6 z' X8 \# P/ j7 g - public function toUpdate($table, $where, $data) {
, n$ S( \+ a; i* p- E - $re = $this->database->$table->update($where, array('$set' => $data));
. H( C f; P0 S" D! Q# y* m - return $re;4 M, e! t& \# I, ]! M
- }
/ t9 `9 r% k4 q" D( r5 ~5 p - /**) Y6 P, u2 A; q- n, z1 Y d; W
- * 获取唯一数据/ M' ] `: F+ k4 I
- * @param $table" P; T- j# M3 F3 Y3 s; j _) E6 I
- * @param $key
% }! w i( [& k {: W" D& K - * @return array) V3 P/ Z' }5 j/ d3 Z2 y3 X8 j& j
- */
9 W' Q7 [" Y1 w7 [3 O) M - public function distinctData($table, $key, $query = array()) {0 s; Q* W- W! g8 l% s
- if (!empty($query)) {' ]2 ^* D5 |( T* F
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
; E5 v. q1 f, M7 K3 b0 t% b% n1 L - } else {
+ r h6 E) B- m1 ~6 s; A) ` - $where = array('distinct' => $table, 'key' => $key);# M+ F+ j q: H3 m6 a2 j3 K
- }2 M! ?, a# E7 f
- $data = $this->database->command($where);- O" r# w# H! J5 Y9 s
- return $data['values'];
# y& u$ X4 v- x5 H) n V - }
8 N& G5 R2 {+ A" [) V - }
' x. k+ v- A) I. T - ?>
复制代码 5 n, J5 r3 n: d, f, z4 L6 l/ W
% K* D& ~( Y$ z* e$ }; S
|