本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。& @8 i6 d8 ?5 ]; [5 M
模式自由。
3 j6 [3 Z5 s9 r) c: L# y, E支持动态查询。
' o& C G7 q; O1 n支持完全索引,包含内部对象。
& m; X& B, l/ B支持查询。9 ?, d: e% Y. Y# c! q8 b% e
支持复制和故障恢复。* ]# v0 o* y2 E! G0 ]% K1 ^
使用高效的二进制数据存储,包括大型对象(如视频等)。
5 {/ u* m. a7 r自动处理碎片,以支持云计算层次的扩展性3 i" s r2 R1 @8 [ l* O I
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
/ t+ ^& p$ G! L Q文件存储格式为BSON(一种JSON的扩展)
' a# @$ P, Q4 ~. n. P可通过网络访问 所谓“面向集合”(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; [/ u& z6 X% G' p Q& x
- /**
% _" z" K- c/ l2 j0 e. A - * PHP操作mongodb数据库操作类
`- o, Z, R, M- Y" ~) N - */0 X! T) R& P# N: @ g: Y
- class Database {; C6 t8 H0 s/ ~$ F; z* [
- protected $database = '';5 V* n9 | C1 V0 g2 K& @
- protected $mo;! {7 t" W7 Y# k# G' Q) F5 A
- /**! b I! N% N2 G# q5 h) g+ n
- * 构造方法
, p) k: P3 ~) P4 \& C5 X - */
3 S3 h! z8 e# o. n; n& { - public function __construct() {
& m0 u2 ^: J" r" k+ Z9 P - $server = DBSERVER;
1 ]! D3 \) H# y* [, H7 @+ @ - $user = DBUSER;
/ e5 `+ a' [4 M2 S( D4 | - $password = DBPASS;
9 z2 g! a1 h. H5 c - $port = DBPORT;
7 l; c: p8 N4 `2 s" Z9 ], _ b) ? - $database = DBNAME;
8 j! o) n! K7 `6 U - $mongo = $this->getInstance($server, $user, $password, $port);
3 y+ g3 s- `& ~8 a9 f% _ - $this->database = $mongo->$database;
+ {0 A2 G( _5 a! @ - }5 e' j% P2 O+ ?1 Y1 n$ i; U9 P# S
- /**
' \, @) W2 w6 k6 U- \; U( l5 H - * 数据库单例方法
+ P/ l7 F4 H0 X. d) A - * @param $server7 w# Y- L- X% I+ ~/ a k; ^# H4 H2 D
- * @param $user9 m' |4 `+ g) l) H( v! ?2 s
- * @param $password
, I, i: ?: o! [ - * @param $port3 [' u" f. U i* C" F3 D
- * @return Mongo
5 T0 ]) R: ~- H. v& Z9 _2 K( V- g9 X3 s - */
, L8 V7 T4 {0 Q. W - public function getInstance($server, $user, $password, $port) {( Z+ u( y6 v* }: L2 e0 r2 c7 p; X
- if (isset($this->mo)) {% s8 s% Y1 \6 u$ u3 I
- return $this->mo;
" T# r- B8 S% }+ |$ h - } else {
; U* D( z: P6 U6 A2 \ - if (!empty($server)) {
1 J, Z, N, o ]0 P/ A - if (!empty($port)) {" S* y$ T" u. V- K" B4 l
- if (!empty($user) && !empty($password)) {
: E5 }' \5 C U, {7 [) V - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
- K/ o2 z0 V" y" `8 e6 ] - } else {
% D. i/ S8 M; ~: i - $this->mo = new Mongo("mongodb://{$server}:{$port}");
/ t9 M# K9 k2 T( M( p1 e T - }) f) O( L8 q# e
- } else {, J1 ?3 S; C7 H5 A2 h) x" D; w
- $this->mo = new Mongo("mongodb://{$server}");
. i0 Z. { U) v - }8 ]4 ]1 k* G/ u V. g. G+ I$ B
- } else {" J% g* R# O; `6 F& t
- $this->mo = new Mongo();
1 F- `# W; X( R% A/ F5 e0 t - }! t4 E% A2 ]! F# N# R
- return $this->mo;/ f1 ]* }/ S2 I3 d: j
- }: Y0 I6 `, ?& ?8 ` S/ e$ N
- }, Q0 Q; q5 J, p0 d
- /**0 y; T3 i- p. p8 P
- * 查询表中所有数据
2 M5 C$ q2 }2 t - * @param $table2 B5 f0 A+ x8 p( h: f) I
- * @param array $where3 `6 m' T1 Z# S# R' G% a" J, J' k
- * @param array $sort! l X6 {- F% ^
- * @param string $limit
0 F9 a9 ^- E3 C' | - * @param string $skip
( K: }" r/ `" e8 [* J8 _ ? - * @return array|int5 f" @2 s3 i& Y. H" c7 O1 d9 L7 q
- */- L% l+ I$ A- {2 v1 k
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
$ x3 @3 N4 M: A3 U8 [2 E$ b; ` - if (!empty($where)) {
, h. q) P, i: [/ k5 e8 s2 K - $data = $this->database->$table->find($where);4 y; o: x9 y! U& B' P7 b; v3 `
- } else {
2 R: [! c( x% T7 v2 I - $data = $this->database->$table->find();. n3 S: C7 S; S" N+ ?
- }
. ~6 ^6 v+ e) @, C7 _ - if (!empty($sort)) {
! B# q% n& T% |8 Y/ ~ - $data = $data->sort($sort);
# I+ } z4 b; f) Y: ?! V' q8 { - }
, ]$ v, m) E5 Z6 {! |, l8 x - if (!empty($limit)) {
- f( b& r0 S! R - $data = $data->limit($limit);0 b$ T) g0 H& \3 s! [
- }
3 L+ ~4 A1 L! i, [0 Y - if (!empty($skip)) {
* [# e# s4 [5 Q' Q6 h& h) @ - $data = $data->skip($skip);
7 i! |' q1 D% ]4 @' g' G/ ^) b( b - }
$ A& ~$ ?8 z1 x% }0 I - $newData = array();
% R6 a0 @; E$ v. e m! j' Y# n: z Q - while ($data->hasNext()) {
- v* }2 k) t4 d - $newData[] = $data->getNext();9 q5 ^3 H! n) @1 I- [
- }
/ s# r# |2 e+ U; A' l/ ]/ c# [ - if (count($newData) == 0) {) s. ?4 K/ G+ H! {/ F/ S( I
- return 0;+ c' J3 |4 g; M _! l! h" I4 k4 V& }
- }
0 O8 V! J- T, t8 O$ A! ]. r - return $newData;) z! |" h8 A( l$ R" U8 w7 @1 _
- }, s0 Q$ C9 X4 |: _8 H( ~* u4 h
- /**
$ i1 b' W$ L0 M3 O0 W$ n" e7 d - * 查询指定一条数据
* `+ b- w8 v- s- i7 u- C - * @param $table- }9 G' u% T O/ @
- * @param array $where
2 y; E% Z8 H0 j' a2 y3 f' D; ` - * @return int! L' Y7 j. E( m+ o# ?9 i% p
- */# y) \) W) s9 ?. F L8 G
- public function getOne($table, $where = array()) {5 |9 u# M) g; }* T/ R1 y
- if (!empty($where)) {
5 B9 }1 D- X6 F3 g* v - $data = $this->database->$table->findOne($where);
8 i6 d/ r/ S/ I+ r - } else { E& s" G! [' O5 l: P; O, Y' @( p
- $data = $this->database->$table->findOne();
3 j% M! D8 Z3 D0 ~' `, @% h - }
N0 _: {" p' p( ? - return $data;% U- ], P$ i) x6 k
- }: I d2 [' O# c: D
- /**
1 k9 J7 d% N3 v. c) a4 l - * 统计个数& G+ H) k/ h/ w x, c
- * @param $table
' E; s4 k f6 ^7 A - * @param array $where6 {- z! k! y0 `$ }. z
- * @return mixed/ t5 l* }3 I; B1 X
- */+ F; a1 [* {( B+ a# t
- public function getCount($table, $where = array()) {+ D4 f, W9 h' R9 U/ [. g
- if (!empty($where)) {
! n# |0 }* [3 {6 l4 g2 A - $data = $this->database->$table->find($where)->count();. A4 @$ |* V9 Y. o
- } else {
3 g7 Q6 V7 C$ y- r5 k, @ - $data = $this->database->$table->find()->count();5 ~, q7 L6 t7 p F
- }+ j; O/ t8 W& o6 ~ T. G/ [
- return $data;
% ]: A) B! L! @0 ]" x# B - }% g! @. H% j6 p2 z/ _2 b, j/ n
- /**/ C$ c: G# F) V6 r5 T
- * 直接执行mongo命令% H" U/ L* B# M9 \# I
- * @param $sql6 d3 A" [6 T$ s% ^( ?# s
- * @return array5 K6 i- P: p; m r# E
- */; q2 H: {# {8 n% m' x9 i' Q* P7 t1 d
- public function toExcute($sql) {4 o8 [- z) }- ^4 t" R
- $result = $this->database->execute($sql);
. d) k7 @% g4 B- O) y6 B - return $result;
0 }4 }" J, [) Q6 C! X. D5 g: l - }
" p# X; `6 ~6 n - /**
4 F, f+ j2 a# p7 v! w5 I - * 分组统计个数8 Q% T6 ~, |( \0 s4 D; g7 Y
- * @param $table
7 t* x" I( V: ^! P; S - * @param $where7 D2 I; K* h) U1 f) ~* }4 W: U
- * @param $field
/ A1 E9 ^( O# H8 U) `8 { - */2 B4 ~8 A$ b, F8 r; ]: v' h4 b/ T4 z
- public function groupCount($table, $where, $field) {
+ @. {0 g. N" F$ ~5 G6 S9 _% W) p5 q - $cond = array(
+ u" s$ V0 D U# Y+ g- o0 f - array(
' @& u' v( }$ j' N - '$match' => $where,
9 C9 d; J! v2 l% t2 X - ),8 T$ F# G2 z. X' [+ O0 X) Q: F
- array(& M& ]6 j) J% [; U8 ]) a
- '$group' => array(
) K8 w) `7 u% Q0 |3 c - '_id' => '
' R" B6 d$ e# l3 Z6 i6 T4 v - 7 I$ v A/ c6 X( y6 f" G. j& k
- . $field,
# Y8 m) e1 `- w, Y6 B - 'count' => array('$sum' => 1),
) A7 R$ E( J" t( M8 d - ),
C! k2 H% t; y3 n - ),( L; l& Z3 {- v1 |9 W: o
- array(( a# k# a, ?: T2 P) _ C7 o
- '$sort' => array("count" => -1),
) |) u6 i2 N( b9 b/ z$ T* u5 p - ),
3 A! [- _4 l3 {% J# } - );
$ O$ r8 p8 ?5 f; U5 N - $this->database->$table->aggregate($cond);4 ?" j/ O# z2 ?# h9 U5 w
- }# w2 G% M! ?4 \: E4 v+ z% z
- /**
$ G9 Q l! S" E8 y9 R' z - * 删除数据
* k9 H/ n# ]& V* ^ - * @param $table) }* \) U( V2 n5 H9 @/ [$ |
- * @param $where" P+ @& H7 U) C
- * @return array|bool
* p7 r }& o! G2 y3 J0 A3 n3 @ - */
5 z) O0 e; s0 T. d% A$ N' l v; O - public function toDelete($table, $where) {5 w }/ i: V: s# e( S9 {
- $re = $this->database->$table->remove($where); ~& W# L! e0 w5 b4 b u
- return $re;
9 s$ N# ~4 [4 ?+ d9 l0 q% n7 n4 t - }
$ y& r# }! r0 E4 r+ h9 v$ E - /**
% ~2 E& J. t/ L% M) v% d, S - * 插入数据
+ }! n7 n6 K* j& s9 h# ?" b - * @param $table
8 k1 T3 c; M: t! s& \$ n - * @param $data
* g( I6 |) b6 W! K - * @return array|bool
* |$ q. j; S" E) ~+ J4 J, M - */
4 ]6 h/ K( R* q& | - public function toInsert($table, $data) {+ V. r9 [4 F: z( V- o& w
- $re = $this->database->$table->insert($data);6 U! y" d/ i, i6 m6 r6 I% ?
- return $re;
& _3 U/ d3 h9 l& ^) U - }
B$ @% l# f2 k8 s* E; ?/ g - /**( N( }7 _4 I* \5 V, p
- * 更新数据; v) ]& `* @. w4 Z5 ]! b* F% ^ o
- * @param $table) u0 O1 ?& S% n
- * @param $where
( Q+ b& B+ y' s - * @param $data/ V( C! B9 E+ d& \0 E% Z$ k; f, a
- * @return bool/ B; a; B7 I. Y
- */
- Q2 e7 _3 q& c4 l P5 P f: y - public function toUpdate($table, $where, $data) {& h' ~3 F/ Y+ I% X/ J' l& t* I4 C9 s: Y) C
- $re = $this->database->$table->update($where, array('$set' => $data));
( q$ M# [2 ~+ w) J1 U, [6 D - return $re;* g( U' ^' q5 D: w5 f. e
- }& w( u0 u7 ?3 j) q* d3 K
- /**! V' {" }3 A* J
- * 获取唯一数据8 S* H* ]1 @- I+ \1 u3 e- g
- * @param $table! M, O! F' x* E6 l% T
- * @param $key' ]& d6 B) P' b8 h4 s" @8 K7 w2 a- T
- * @return array- ~: ]* O3 |* m( p( j+ Z1 j
- */
* R! ? ]$ _" A6 S4 z - public function distinctData($table, $key, $query = array()) {
2 {9 g0 W: @6 R. ]) D) I1 B7 N - if (!empty($query)) {
% c- }, p. O& {! g+ q - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);, z% O0 M- L, N- r! l, G- H& @% N
- } else {
* i9 u$ v* n8 U& K" N9 S* [ - $where = array('distinct' => $table, 'key' => $key);
8 T0 q* ~7 a% M6 \; S* d& w - }
. k% t5 D* F% Z - $data = $this->database->command($where);; V' J* m5 `1 R( m" v, A c
- return $data['values'];+ Y2 _' g% O5 V
- }# @9 _$ S; O5 _3 b" Z
- }
& |' |& U9 S6 L( c! M" J - ?>
复制代码
) `# g5 U7 H% Q7 h# n
4 B2 M; }; R9 s2 j" S) a |