本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
/ I! ~8 @- a) J/ D$ u4 s9 X [3 T模式自由。) m! i; i6 y7 M9 h* V8 O- Z
支持动态查询。2 g% m* |* F8 `; Y: G" U" J, D
支持完全索引,包含内部对象。1 j, O* S6 J1 K8 x2 O/ w5 v! b0 I/ l
支持查询。& r- x4 I1 D+ N) m' }2 l
支持复制和故障恢复。
& z( o7 b- m1 C1 j; W使用高效的二进制数据存储,包括大型对象(如视频等)。
2 ?1 @0 y+ S8 p0 N+ B* g自动处理碎片,以支持云计算层次的扩展性# q6 d( ?+ n6 ~# M
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
, E0 V. T# l4 G3 i2 V文件存储格式为BSON(一种JSON的扩展)
K/ t, J9 j0 F) f( C9 N" n可通过网络访问 所谓“面向集合”(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& K" S, y$ `) u' k4 d7 O
- /**
7 o' j$ E) Q& V7 A1 P& `5 x! V - * PHP操作mongodb数据库操作类
. e9 K% c/ d; B& D( R - */
- J7 d# c) \* j& r+ V - class Database {" R! u. j" Z) T( V7 O' }# k
- protected $database = '';
8 s2 O* G8 h: ?) x6 M - protected $mo;
2 z. b! B! Z# F% Z - /**
$ R' }3 O. |! k6 ^- Z$ e7 v - * 构造方法: r* T- g5 o8 m: y7 c6 {! [2 ~( {
- */
9 x4 I& z( M+ q) E0 B* f - public function __construct() {( b4 A! C2 D" b4 V f0 W3 R' b& Q
- $server = DBSERVER;
9 _( j9 b" g4 ^* ^ - $user = DBUSER;( a7 G, E/ Z/ w5 B8 E) i
- $password = DBPASS;0 G! T4 y, m. c, d7 e/ f
- $port = DBPORT;, y7 h( ]% m! p, v
- $database = DBNAME;8 j9 Z* Z* J5 G$ U
- $mongo = $this->getInstance($server, $user, $password, $port);
% I9 i9 f/ W% s; s0 m - $this->database = $mongo->$database; I. M h6 J: m" Q
- }
7 _) I7 C9 \# ]5 q2 J$ e - /**
. j& F9 H( X5 d I8 J3 v - * 数据库单例方法
: L7 X. y. m: V/ K - * @param $server/ p" t8 s) W4 F! N% c1 O, I
- * @param $user5 F1 Q) z& [& f. V& _" ^% \$ ]
- * @param $password( u6 [9 P0 v+ W) H# ?1 n* C) h
- * @param $port
2 S7 Y8 K1 {0 e# q5 b( T - * @return Mongo0 l q5 N. f; s% z8 t
- */: _4 X* m$ u+ y/ ?* m; D
- public function getInstance($server, $user, $password, $port) {9 a9 w/ h q. q0 p$ b
- if (isset($this->mo)) {
; [! m* f) c0 s0 m" E5 B - return $this->mo;: H" \- ]2 w7 S9 c3 O
- } else {
% o# R- }& s3 l9 r - if (!empty($server)) {* n5 `) c+ U+ E& V: {$ I& a' B2 m
- if (!empty($port)) {6 G9 G9 P- }+ b+ ?. A" C7 J
- if (!empty($user) && !empty($password)) {
# }5 ~! L+ O/ W: P! [ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
- o% q# g1 v$ \ G* i* z - } else {/ M( v+ V- b7 W
- $this->mo = new Mongo("mongodb://{$server}:{$port}");: {& [- U- V" |( p
- }1 e5 f3 P R+ X3 V" Z3 j+ ]
- } else { O% C0 J8 s/ U/ m; Z5 j2 j$ K
- $this->mo = new Mongo("mongodb://{$server}");
1 ]. d( G2 x8 V1 K. P* H - }
1 B- R" G( R, M8 o. V0 Z6 C3 [$ P - } else {
( ^. q- O! C0 ^ o - $this->mo = new Mongo();" J+ j: c* S# c; u
- }! q1 E: h0 V4 {7 c; \0 b
- return $this->mo;& e, ?$ N& u: z7 J, Z
- }
( b& U1 }" M3 R, Q7 K8 X3 { - }! x! m( ^, c3 J0 s+ }$ ^3 \' i* M
- /**
$ p6 y1 Z; _6 [# o. R - * 查询表中所有数据
& U L3 H8 K g6 ~) h( D& j% r - * @param $table4 q) H3 U: C% d, Y: X: q
- * @param array $where
- E# P6 J0 h: i% o! A- _ - * @param array $sort; i" i X6 r( `) n5 `
- * @param string $limit2 F8 o1 i5 o1 [' D9 k! X
- * @param string $skip0 f/ }$ N3 v% V+ |
- * @return array|int9 X: {' `9 l1 h' t6 n* M. v! n4 }, S
- */
+ A7 |6 o& t' V0 ^+ d+ M3 i - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {- E- n1 O6 V( j# D, u$ a1 m
- if (!empty($where)) {
' i( u) t5 W/ q: D - $data = $this->database->$table->find($where);
0 M& z! {' e6 l9 k& F4 \. z7 v - } else {2 G8 s* b' e& Y0 K/ K
- $data = $this->database->$table->find();
& V' T8 Y- T3 G - }
" K8 Q. n4 d2 \# K( b0 v - if (!empty($sort)) {4 m( _) c7 R7 }
- $data = $data->sort($sort);
* U0 |& `, S8 ` - }
q( q$ k, V- V% o$ g3 X8 v - if (!empty($limit)) {
* w" }& _1 q. Y) |0 K8 } - $data = $data->limit($limit); s& N; _* _8 `; z4 l- j6 B
- }
5 Y+ E. Z/ t& S6 e/ P - if (!empty($skip)) {$ e1 l9 e1 ^/ v- D5 H
- $data = $data->skip($skip);- C, f5 ^6 |6 P9 N7 t' N: g
- }
x+ E7 {1 _% L& E3 _# _/ p - $newData = array();* O/ ^' X+ {1 i( r& l
- while ($data->hasNext()) {, D) M' e4 a7 T v
- $newData[] = $data->getNext();
* d( H+ v! W; t) {1 M4 ?1 V; `( S - }
$ C4 ?- j |1 i8 e - if (count($newData) == 0) {
3 _9 v; Q3 w7 H, |2 Q - return 0;+ Y: b" M, k5 {7 t
- }" G1 z: N# c7 X2 K$ F3 |% \5 M
- return $newData;
/ f9 `- I$ G7 f - }
$ g% I. h" F# c! D( S) M1 \; |" w/ p - /**
1 H( e" _- U4 B. V2 @, i1 h4 X - * 查询指定一条数据
! Z3 ~+ ^& `, o0 H - * @param $table
, C+ U# z7 x, W6 @2 a8 ]/ @ - * @param array $where1 _3 c8 Y- i0 M0 O' P& \
- * @return int B8 R# ~% ~+ I* r' z
- */7 p/ W0 L; c: g
- public function getOne($table, $where = array()) {3 X5 ?+ j7 m1 d9 v/ W# I
- if (!empty($where)) {
% `6 i3 M1 s9 M" q7 G% y - $data = $this->database->$table->findOne($where);9 W) f# G, D! v1 c+ b/ w
- } else {
# ^4 O8 k( z, F1 Z+ A5 M - $data = $this->database->$table->findOne();" g( B3 t$ k1 P/ [
- }2 Y. ?5 b3 Z+ o w+ v; j
- return $data;5 W3 \6 T9 U1 c+ \3 r7 C
- }
% z0 m* q$ y$ f4 E+ }2 p- `# f - /**( K; L5 j" Q+ c/ v3 |4 V4 w
- * 统计个数1 N& ], @& ~6 m2 \, `, y; Z
- * @param $table- m$ _; W7 }! L' }6 M
- * @param array $where4 u2 o! N q& ~% ~5 L8 L6 h
- * @return mixed
; j) X3 V5 V2 \# K - */% g* S; N( u9 L: o% x
- public function getCount($table, $where = array()) {
8 B9 g! n8 g4 M4 l% @4 O0 u6 I - if (!empty($where)) {+ S! K' a+ j: J
- $data = $this->database->$table->find($where)->count();
/ F8 _$ S- h% V, u9 G - } else {
1 G* f0 |( z) l - $data = $this->database->$table->find()->count();& a6 a/ I# R3 z0 X) Q
- }( ] a% n# U) ^% e R' X3 b
- return $data;
c% ~( k6 f+ j8 [( g - }
+ E8 C* s7 w1 j$ y# O - /**
; R2 p& h+ @, k( P7 x, u - * 直接执行mongo命令
1 Z# @. R ~- y% I O+ t3 \ - * @param $sql
5 X& P. T# w; F; [) S - * @return array
# n0 o9 e- V, c" ]% D: ]. \ - */
. R5 ?5 d& C1 C- ?) O& Y5 g - public function toExcute($sql) {$ P6 y( d- A( G' c1 T9 V
- $result = $this->database->execute($sql);8 z# n8 E$ i* K$ j4 K0 Y
- return $result;$ `- i6 R5 Z4 M. F* Z# C( @
- }" u; q/ X- ]; r" I5 m! n3 T
- /** C" e! N3 ]0 M" {5 ~/ e! ?9 C" t
- * 分组统计个数; `9 |0 c4 m( g* i7 K
- * @param $table2 Z& ]0 l3 J- i2 A; [" H( N0 }
- * @param $where4 r. R- B, }& E) p3 L) E
- * @param $field# X |9 P" N' B" k, P- w, d
- */% E9 V: h1 `+ E* @
- public function groupCount($table, $where, $field) {0 q) R! V( w& l' M. s+ ^/ [
- $cond = array(
; M- V0 M3 c4 ^- k8 H2 A7 q3 Q - array(
, r4 s# k" o# \( O8 ~! b- [7 E - '$match' => $where,
$ n, D: B% r6 P' N* ?. V' b - ),
/ A. |& j5 O/ n) ^ - array(
& E C, e2 Q- x - '$group' => array(8 M/ H3 Y) [2 Q; \$ h. I, h3 E
- '_id' => '0 b) @3 s9 _$ P" k4 q& Z
% i" T- [5 U* k, \- . $field,
1 Z" Y4 h; w2 y - 'count' => array('$sum' => 1),% z2 g- X# `, W1 L2 x
- ),
3 g7 a5 `& ?, ]- S - ),
- X U" n7 r2 J @! X! [8 \ - array(6 w- e7 k6 F9 _" P2 O4 l0 q0 q. p
- '$sort' => array("count" => -1),
' k; H9 R" V9 Z1 j5 ]: g5 R - ),+ ]1 G/ F/ H6 f. j- L5 V7 d" k
- );. I2 ^; i8 z) u' |
- $this->database->$table->aggregate($cond);
' X4 s; j# ~1 I: b; r( C" D - }
0 `$ q V4 X& T* y - /**
7 X! j8 w; g! `1 g% l. O - * 删除数据0 z4 [% \ g- S- d$ g
- * @param $table$ i4 x# o0 k, \5 t( w; Y
- * @param $where
( t4 N6 W7 b" v0 g - * @return array|bool
& u; q* |* Y5 D' V - */
* _# C4 S5 n; s! ^& N, ~! `3 u - public function toDelete($table, $where) { Z0 ]6 V* I" O
- $re = $this->database->$table->remove($where);
3 T$ N5 U! b; q8 B5 n5 j - return $re;; b$ Z) T# q+ j8 p3 c
- }
7 T( R" k0 F I* V" {' p - /**
5 Q- f/ |1 o6 ?' C - * 插入数据/ m* ]* i7 r. {4 n3 V; Z$ s
- * @param $table' w; o- e7 H2 b. f
- * @param $data
3 d' [+ l& T# c4 ^4 ] - * @return array|bool
! R: ]/ }9 f% S* z$ ~ - */1 d+ v q+ ]0 i, b* M& i
- public function toInsert($table, $data) {: p9 [7 ]+ {) G( W- F
- $re = $this->database->$table->insert($data);
& C1 o$ S1 X3 c) E1 y/ A" E - return $re;
; }& X4 T" @, m$ j$ l - }
) ?9 S% c: ^5 T6 f" g) S; c - /**
* c- D1 k8 ?" r: N. D2 L. B - * 更新数据9 b2 Y7 [ V& o- O
- * @param $table9 [% M# B! k. e; b
- * @param $where4 y, ?, J: w" s I
- * @param $data4 }6 o& N3 w8 {) d @
- * @return bool5 H; a5 j! R% m6 ?1 h# F+ `
- */
+ b9 S" d9 m# \ ?- |5 o - public function toUpdate($table, $where, $data) {+ m' d h" T. ?; v' v
- $re = $this->database->$table->update($where, array('$set' => $data));
$ m; l4 \3 P% ^ R0 K' S4 O& f - return $re;
N9 p- K' a- E1 P3 P! a - }0 ^6 \" x7 z, Y! l# E: q
- /**/ U+ E1 _1 J; W) a- C$ d/ a6 j
- * 获取唯一数据
$ J, \; ?+ L% B% h1 n# A# j8 e - * @param $table
) [* R# W9 U# N" O/ @6 F( A - * @param $key
0 u v7 c8 E( l) a- H - * @return array
+ b' W+ j, |$ s( s$ R. _) ~ - */
$ p& U( ^& F+ M) `1 r% V. H - public function distinctData($table, $key, $query = array()) {
- p% C ]8 n' R9 F/ f5 v: P - if (!empty($query)) {: V+ M0 ?6 v; j# b8 w1 s
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);8 l4 R7 R6 U) j' V7 a% c6 S3 C5 i
- } else {
0 i' _& u2 H0 z: O7 h4 M - $where = array('distinct' => $table, 'key' => $key);
, M' H8 U3 F( d+ T5 Y7 o - }
+ `2 I. Q4 l! m* Z- L8 y - $data = $this->database->command($where);; Y( t' |+ D% G
- return $data['values'];0 t N: `9 x/ U' o
- }# c% H+ U! e6 L% @8 x3 L x
- }
. M; j0 L# U8 L" o6 t6 B9 ^ - ?>
复制代码
, P* u9 y9 `* t- z; ?: ]6 |9 Q
1 s0 R; e7 i) ^" L! L |