|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
6 V% m. H j" o5 j模式自由。" c7 N/ L2 S3 F6 @& X9 s
支持动态查询。
, _" f& L; p# n! p" a7 E支持完全索引,包含内部对象。
' m- P6 X. ] s7 A支持查询。
8 V ]- G: M" N; T& W, L支持复制和故障恢复。; Q5 O a- }, p, E7 c1 {, A
使用高效的二进制数据存储,包括大型对象(如视频等)。$ \- J+ n# W5 D% y5 O* f) M" I8 c3 ?
自动处理碎片,以支持云计算层次的扩展性
; E4 Y3 k* R& Z1 f" @* D* j支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。5 D. H3 W- e' c& \8 z* z; Y
文件存储格式为BSON(一种JSON的扩展)
4 K4 e% }* n4 Z& h6 r6 }可通过网络访问 所谓“面向集合”(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) O" S& @3 J* `9 J& T
- /** ~7 R# p/ I# I: E& C, |3 n, h
- * PHP操作mongodb数据库操作类/ Q- m+ i# r; I. N
- */
4 u$ g& S6 }$ C0 v" W - class Database { K4 k* g# u! G1 V& N( `3 F4 Q
- protected $database = '';
, e' B* F1 [. ], T, O' W/ k - protected $mo;
. M; L" Y$ ~7 G - /**0 q7 ^1 g( O- P2 ]+ A5 K
- * 构造方法, a5 j; v$ w, T+ K+ q
- */
, J" G. X" W$ Z8 J$ W. p - public function __construct() {, i& l2 l N6 b x$ `
- $server = DBSERVER;
& x7 L1 e, @, u+ c7 c+ C - $user = DBUSER;
2 ^5 v1 o- k5 O; B - $password = DBPASS;' ]( n) e7 E; {/ ^% \
- $port = DBPORT;3 p8 m$ A3 Z# A( l; l
- $database = DBNAME;% T" O; @1 S" I7 B4 ]2 h
- $mongo = $this->getInstance($server, $user, $password, $port);
]* ]% ^% z5 c; q* o" m0 B - $this->database = $mongo->$database;0 g4 B/ x$ _1 `% y/ Z% h) H* o6 |
- }9 g' \7 W% l8 f s c% H
- /**
/ q- R: x& y/ i - * 数据库单例方法, L% n- \ N7 j+ ^/ L6 {
- * @param $server4 D! t: d9 l9 u. A( K
- * @param $user: F Y5 ]+ V" D8 h L- W
- * @param $password+ H% {) E+ k4 }5 J% T c
- * @param $port
- l% U# G7 @2 d$ m3 k - * @return Mongo
+ f, ^& |2 |% S - */
& ^' B) W u9 n - public function getInstance($server, $user, $password, $port) {9 t0 j& O7 a/ W5 J& C. W
- if (isset($this->mo)) {
3 C; F5 b/ p6 g - return $this->mo;
& F: `9 q' X+ C: u4 x! r1 w - } else {
8 g! j, [- g* Z" h4 e' v - if (!empty($server)) {
% U# p0 l W9 U - if (!empty($port)) {! I9 ]) G. \9 S/ s) P
- if (!empty($user) && !empty($password)) {# {2 Q* ~) K. t- e
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}"); I. E2 c% U& s4 F Y
- } else {
& t9 N* v% N, }. r/ z8 |1 N - $this->mo = new Mongo("mongodb://{$server}:{$port}");
7 c, _; h e* Y" \ - }
$ n6 d: j& Q# v/ l2 U" a - } else {
( i1 }/ t/ C, G# P - $this->mo = new Mongo("mongodb://{$server}");4 j! ^ i" G( }2 R. X' t
- }
5 t4 ?- `5 V. A$ @ - } else {
8 _0 a; F; M, ~$ @) j9 Y2 ]# V - $this->mo = new Mongo();
+ z$ V* u& T8 g3 } - }
, F9 S" c5 p5 T( B - return $this->mo;
. n. L$ l2 m: {( S - }8 V" I8 G; k M, t0 F1 h& \9 T
- }* i* V7 l7 M1 C2 i( l1 Y* q
- /**! M1 I% {4 I/ l: _1 t
- * 查询表中所有数据
' T8 I+ Q( i% d4 L$ _ - * @param $table
' ?2 v' R( k5 u* t - * @param array $where
' R6 s0 _3 ^/ X* A0 E& l0 l - * @param array $sort
! R& i/ C* W4 Y, t# [, A - * @param string $limit3 `7 f" H' a) J5 e
- * @param string $skip
& @5 A) N& e1 L7 q5 ~; l - * @return array|int
& ]& v, g# O8 s+ l6 h: n; h - */
4 T8 l# k+ d( J% U/ D - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
, X) G% E. ]* F2 Q - if (!empty($where)) {) u6 | c' q3 I, i0 V
- $data = $this->database->$table->find($where);
) g* s+ N/ Z# Y" \( \1 T0 i; p3 n6 | - } else {
# D# T; _4 P) Z% m- j) [5 y% S% ?7 Q - $data = $this->database->$table->find();
3 W9 j8 k( p& B, r) R5 a0 V1 j* _ - }- f; A( E& J, s6 `0 K0 r
- if (!empty($sort)) {
7 N9 I/ e( a* `6 G$ V, @9 c - $data = $data->sort($sort);
" t j1 r& G# E# M( t) _2 ? - }
7 {* X( e; {1 r4 |+ m, W) O! J - if (!empty($limit)) {
- F4 [& X% B7 v* X/ ` - $data = $data->limit($limit);
. J5 s4 k' a5 c% X; | - }
4 @6 i4 r9 r3 g0 i6 R2 p - if (!empty($skip)) {
( x" _; _# `& s, _3 C; u3 L- U% W - $data = $data->skip($skip);" \- a0 q- q& y. Q, \$ c
- }7 v' f9 w9 C: ?) S, w6 s# P5 |
- $newData = array(); V% ~5 q0 C% a! T" F; w- Q) S
- while ($data->hasNext()) {3 B3 W4 z+ d3 J! n5 D
- $newData[] = $data->getNext();
/ @; ]$ ?8 g5 X' }' i7 K+ ^ - }
1 m, T% }: b& R& r8 Q& O* N - if (count($newData) == 0) {. I% @. M# p) g/ B
- return 0;
; B4 ~& e$ y: g: X' n - }6 _& b9 ~6 }# G @2 v8 b0 ]
- return $newData;* E+ C. \0 l O; N: V* A
- }$ D7 y" I$ G9 s) w2 }% [' l1 |
- /**
' d, ] B% Q- N; g6 x1 k - * 查询指定一条数据2 V, I5 j. [' h* ?5 `
- * @param $table* J8 T9 x, j% a r
- * @param array $where
, ?% I# i, h& r+ x' ? - * @return int( j0 ~+ M: |/ @1 `8 D+ |
- */9 N; q9 s' g; Z
- public function getOne($table, $where = array()) {; p( H: H2 q' P5 s) f' D
- if (!empty($where)) {- n* G! z1 ~- _7 M2 O' x/ t
- $data = $this->database->$table->findOne($where);
0 X2 d0 I) R2 B0 Y7 \ - } else {* a J8 Y# T' }! i2 M
- $data = $this->database->$table->findOne();5 P U! r5 w5 E( ]4 q
- }
5 f- F' O. f* X3 e - return $data;0 y. F* }: \) y; a: F3 i2 a/ H! o
- }
' [3 W; T0 U4 Y1 Y5 ?+ y" s - /**% k4 @, ^1 z1 J
- * 统计个数9 p6 O5 N H; s" m$ T. f# u
- * @param $table
9 g: r7 `3 I2 I' Q u/ ?+ b& b% w9 G% r - * @param array $where
8 k( J# K* M5 T; `9 x z5 U - * @return mixed- o8 K% ^- |2 \* m# j% n1 ]* l, l
- */, E S* z+ L- G% \" W
- public function getCount($table, $where = array()) {9 W0 l) l2 U) v( |+ \1 ^0 u/ a
- if (!empty($where)) {
' i5 x$ O& Q. H5 s# g4 T2 h - $data = $this->database->$table->find($where)->count();$ ?! `( T% }# y% @
- } else {
8 ~& O6 ?) k3 | - $data = $this->database->$table->find()->count();- {& g% Q9 y* x: h
- }
4 d" d& I: m0 B - return $data;
! @3 k7 t2 c$ H3 E# B5 d! W - }
1 ]1 K2 l+ V0 i - /**
6 ^. c) }3 n6 C! r' }" y: d0 s1 b - * 直接执行mongo命令
5 c) X1 d3 n7 F* F! I3 C - * @param $sql
# [% u& I, ~ r - * @return array
8 ?. v3 t& |& r& U7 A& B/ Y - */+ e, W- q; k3 }, t
- public function toExcute($sql) {) I: f5 i; w4 E X5 Z/ Y! C3 G( [
- $result = $this->database->execute($sql);
: S: c. S+ \# z: A+ r. f( h1 r - return $result; ?! t' a7 c9 h1 a
- }3 A8 P1 c/ v7 ~! X1 ~
- /**, W' K J+ E9 [: k
- * 分组统计个数# }% a& x& \3 Y. C2 [
- * @param $table
3 v/ M2 }8 _( c* ~& Q5 }) U K - * @param $where
4 {. T j6 `8 ` - * @param $field
2 u4 h- Q4 [/ S: |) |4 [" h6 V - */
7 f5 E0 Q1 o) q - public function groupCount($table, $where, $field) {! v1 [, y, D8 x8 _
- $cond = array(
7 W, o4 l) L' b0 V: \ - array(; S. M( N4 z+ L4 g o# f* D( a# o
- '$match' => $where,
" P, z) k$ B2 ^: D! O - ),
9 u- w4 V+ Q3 ~! v! C8 I( \ q - array(
$ ^* n H" _# _* l% Q - '$group' => array(
( P) J# ]' o/ M6 c/ K( A - '_id' => '
. r- u) U2 X1 { - 3 t, z3 h2 h3 h* \4 n
- . $field,
+ I9 u7 \# f& G a6 X3 C - 'count' => array('$sum' => 1),
, B8 g2 U- {+ C9 l - ),
. _1 N' ]" r. \7 w- X( a - ),
7 W: m: O6 Z# h% y# `6 @ - array(; e5 p9 i# Z) Q( f
- '$sort' => array("count" => -1),
) f& q" j+ S" \4 | - ),
- S3 R# b7 ]5 W# @. ? - );$ W {' _: _6 p+ D% f' j
- $this->database->$table->aggregate($cond);
$ L* v# s O5 t: F* q - }7 O/ e& v0 x) {
- /**
; u" h( N9 ?; H, Q- K4 U - * 删除数据
. l1 L- |, m6 d m* X f - * @param $table
8 e9 K: V% D5 U7 P6 i. m - * @param $where0 A W4 ^& s0 G* s
- * @return array|bool `3 v3 w4 g, E4 D* A. x+ Z
- */) ~$ ~' T& m# o" p
- public function toDelete($table, $where) {
' Q+ B3 m$ V% S3 _7 r, @ - $re = $this->database->$table->remove($where);1 u+ i1 h# g+ U) Z4 |( \
- return $re;
1 C: `$ T6 S, y$ `( S4 l - }! I) N% P* o/ a; |' }0 U0 O
- /**
* ^& _ [7 b+ L% V, X" x - * 插入数据
+ d4 J, O6 O' W1 \9 m* Y% n - * @param $table
& C |$ ]" {/ r3 J" `" D; |9 z* x - * @param $data6 q2 H$ ~+ T, t* u7 ]
- * @return array|bool
4 X; A$ B; A9 w# Q- {& q9 p1 C - */
: F7 F" G+ d8 h0 h5 ~9 M" n/ `, ] - public function toInsert($table, $data) {
2 N( r- B3 t9 F7 {- r( k; ^ - $re = $this->database->$table->insert($data);
1 \9 C6 _/ Q h }5 s) O6 @7 W - return $re;
6 W- H2 i3 s9 o - }
( J- l+ n; x2 Y2 U) K' V7 I- ^ - /**
0 [ L) U2 o: K8 J( z, B+ G* C - * 更新数据' \5 P/ F" _% V" F. H; R5 B, i
- * @param $table
/ g- o7 c/ m: M$ p! u) ^# w: m - * @param $where
( {( _* Y) o7 L) p( P; v. S8 @ - * @param $data+ Z4 |3 u2 Z) [0 s
- * @return bool
1 x7 d9 f6 |0 j! p/ t0 q) }/ s8 w4 f - */
# L- E% d5 `2 O# D( c - public function toUpdate($table, $where, $data) {
) ~! Z. }' { S - $re = $this->database->$table->update($where, array('$set' => $data));
. Z9 Z! K. w8 f- x+ F1 C - return $re;
% W# D0 i; _8 k% |- h2 N7 N - }' ~: T4 g2 c0 w5 i
- /**6 |+ D* Y: A5 p) ^3 C$ y
- * 获取唯一数据+ ` s8 E' C0 \3 u9 y W w+ e
- * @param $table" ]8 o3 t. B. _" |& o# N l
- * @param $key) O8 [7 q1 k! T* I
- * @return array
- Q5 r6 d' p" \* m5 w5 F- D) x - */& V0 V& R, ?' A5 I9 B* s
- public function distinctData($table, $key, $query = array()) {. g) v0 i6 s' o; b' g% ?! `
- if (!empty($query)) {* @2 {. s+ f, t: Y _$ [4 d6 z
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);3 Z* C% d5 t: z
- } else {% V. N2 G' w' B/ ]" g; o
- $where = array('distinct' => $table, 'key' => $key);
: i) n5 M. R" j& S - }
$ ]( ~4 G! j. Y& J0 K - $data = $this->database->command($where);7 @+ p. e2 c0 Q: Y& K
- return $data['values'];
: r s7 s0 x, c - }
5 X, T7 x- R, c* G5 r3 }- { - }' ]* h4 F O. {3 m( i
- ?>
复制代码
- R- L$ M1 B7 ^9 ~( `' m
- i3 I& v) d2 S% Z2 T* B& U! H |