|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。" a- m) H8 R# U, ^$ g
模式自由。0 b, f! `: ]: P( n- f
支持动态查询。
: ^+ D m ~- S4 s) X: b2 J- t支持完全索引,包含内部对象。
' L6 ~: Z) J; C+ E- i1 J支持查询。
5 n4 a, D. u# Y* |7 b' u支持复制和故障恢复。1 m* U5 G$ E% {9 ^" I$ T4 I" r8 D8 F
使用高效的二进制数据存储,包括大型对象(如视频等)。
. z1 V, G8 s$ d9 D1 p ~- N& m" O! m自动处理碎片,以支持云计算层次的扩展性8 L0 p+ t7 {2 K* o
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。" C5 s7 r O- o6 F
文件存储格式为BSON(一种JSON的扩展)
~$ T' f, J% E7 K0 ?" p/ ?7 B可通过网络访问 所谓“面向集合”(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
. e# O4 O# i: d$ I) o2 K; n - /**' Y! U2 ]; B* Z' g# X% Q+ Z& a( o
- * PHP操作mongodb数据库操作类; g! G. X: _; w9 c; R! e
- */+ n# s* ^% E9 w% |/ Z. B
- class Database {; k4 b' B/ H* X& } B
- protected $database = '';0 @( u4 |* f" @8 S- `
- protected $mo;
" i" I+ A; ~# d& ?, D - /**/ m; J/ y$ S/ [1 r: _" [* ?, [" e- z+ E
- * 构造方法
: Y- a% T# z J6 |' |1 R" X - */- h5 t$ m; o/ {- ^, T C2 @2 k
- public function __construct() {
8 J$ B: ^/ x+ S2 T; A - $server = DBSERVER;
; s5 D9 `8 k* ]1 @ - $user = DBUSER;" O6 V$ q# z( S# l: l+ w. \6 J% X
- $password = DBPASS;6 w/ x9 x% }: p! A+ Q
- $port = DBPORT;9 P: E4 O/ ^2 O, n ]5 _2 {3 K
- $database = DBNAME; y# w2 I! U6 J' I3 h
- $mongo = $this->getInstance($server, $user, $password, $port);3 H& R" A, P. A% z5 n6 [9 o
- $this->database = $mongo->$database;
9 ~* M$ { O0 i l/ n - }
8 E* o9 g, B2 M2 W2 U$ u. C6 S - /**1 M d% O j+ P, V
- * 数据库单例方法& b( o U+ w0 |0 j1 X! A0 }& o
- * @param $server
9 K. G# s6 F" l' o4 { - * @param $user9 K# b. ^+ |6 J) I5 b; O
- * @param $password4 u% W0 M5 k$ i' E
- * @param $port1 T( v$ h* s" C+ _- f
- * @return Mongo
' T, h; c& Z2 _' H( p - */. Z) ?% [. [& w6 }8 H1 a
- public function getInstance($server, $user, $password, $port) {
/ a" {1 v, I; U) M# Z; B6 |# j - if (isset($this->mo)) {, y& y' f% K, y2 k
- return $this->mo;2 ]5 p0 _) W8 {7 s2 U" G
- } else {; X6 G# L* f& ?5 \4 I0 x& P8 h, l5 s) [
- if (!empty($server)) {( a! @/ z1 E y
- if (!empty($port)) {
: W* f) j: r' t& o2 w - if (!empty($user) && !empty($password)) {
! u/ z! f+ W& G$ {0 M& C) u - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");+ C: N! B7 U& O8 F \5 u' q! z( q; O" k
- } else {
|' n3 ]( f! Z+ R) J. I" k - $this->mo = new Mongo("mongodb://{$server}:{$port}");1 x- i, \! B9 ]. H9 b
- }8 a; B7 {$ u" e7 B( J: q5 E: m0 w4 e! J+ C
- } else {
( ?. _, h+ H/ U) p' }3 P# G5 E - $this->mo = new Mongo("mongodb://{$server}");
: f& }* h' b+ ?" {- Z - }
0 F3 s: R- y9 Q - } else {
4 l6 s! f% e+ S# g0 L - $this->mo = new Mongo();
! ]* P @6 g- n! K9 P - }
# I& a" f: R1 C) | - return $this->mo;: B( X. Z" I) K1 g
- }
$ t X2 n* O7 z# j. d. I - }" o- q0 F' i4 F& i7 m8 R% f* w
- /**0 z: z: l; \6 m/ V' T- f# m
- * 查询表中所有数据
: ~; P2 P4 r, m - * @param $table
; @6 Z+ C1 s6 Y- `% l - * @param array $where, m4 F, X; S' K( R0 a# i) P
- * @param array $sort$ {- m8 ]+ a# W/ |- h! X( a
- * @param string $limit0 s9 J) f" ]; Z- ]8 i
- * @param string $skip
6 |, k! B" I$ F& g - * @return array|int
0 f/ l, J$ V5 E/ o" \- H - */2 w- s& p/ N) Q; e) \0 t9 l
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
% D' g1 B+ r' M }' o j - if (!empty($where)) {
; u; T. p* t- U - $data = $this->database->$table->find($where);4 M' M( L9 v* r; W: M7 u& y
- } else {
@: W% w* W0 S1 J" ? - $data = $this->database->$table->find();$ j" Y/ H C4 P0 m
- }, [% d& f' X5 S5 L; ~. w# ]
- if (!empty($sort)) {) X' g# Y6 V/ i7 _: `( J2 g. d3 Q# n
- $data = $data->sort($sort);
$ M4 S' |: r& n2 f, x7 W+ `% c7 V - }* U6 W. Y- w9 @2 s/ x$ b$ P! C
- if (!empty($limit)) {
& d& Z& u! p; G0 G/ d9 { |% F; X - $data = $data->limit($limit);5 Y& ] A$ c# t- T2 q4 E7 R
- }: O3 R) U* @ P" O& C# ^ p
- if (!empty($skip)) {
* v2 a i' O$ q e - $data = $data->skip($skip);9 W, i! \' R* i$ l8 h1 `4 p
- }0 A" e/ l- U- Q7 s
- $newData = array();
6 k1 H0 i# P+ |. C0 g, N: o - while ($data->hasNext()) {
+ p& F; w3 _( e, P, N - $newData[] = $data->getNext();
* d; m' f* {: }4 ?5 k' \ ]7 i - }9 N7 f* O8 L( d+ d2 n8 F8 Y
- if (count($newData) == 0) {
) x; }9 ]3 b$ Q( Y - return 0;! i) W! t9 g0 t8 U+ z- y
- }
) k" H }4 {5 t- c) S C- P% g - return $newData;' B" _ r1 O% T5 D& h+ J7 O& l
- }
' B9 a, F! H- V. _% z* o- q - /**# N1 s: [1 e/ M/ H& [& ]# C8 X
- * 查询指定一条数据
/ G$ z- _9 V1 l$ G; S - * @param $table6 Z* ?7 \9 c1 B c) X" d
- * @param array $where
" B* |% T& g; y/ a* g# g Z - * @return int0 Q( Z. T* M9 R; n
- */
" k) E+ @: X( U* A' t ~2 J( G - public function getOne($table, $where = array()) {
6 D8 d2 i+ o# ^$ A8 S* Y/ V. ]9 `( { - if (!empty($where)) {9 S; L0 p( d4 c3 K* V: S2 V: w# m
- $data = $this->database->$table->findOne($where);
* e: U4 L; @8 k; r3 ?: F2 @ - } else {% [9 Z9 d0 p& Q0 N& y
- $data = $this->database->$table->findOne();
8 E+ h3 ~4 C/ w0 L6 j9 A' B3 Y4 R% V - }0 ]2 w' C) M4 t6 {5 v7 Z8 y
- return $data;
! r" n) }9 q& Y# q4 e5 B - }$ B. Y! Z: p7 z% z4 H) K# i Q
- /**
" }( |) u9 ?$ f$ T1 U - * 统计个数% C; M0 m% [5 o8 C
- * @param $table
7 X, E: N0 `+ y9 M1 w# r* K7 O - * @param array $where
. U/ {' A3 h! v7 y4 y3 L - * @return mixed
6 V) a% |+ n( Y8 }2 E; w - */
: x/ L. \5 ]5 W - public function getCount($table, $where = array()) {
" m8 V8 ~- }4 j6 p2 e5 w - if (!empty($where)) {0 U) z" h* I0 m
- $data = $this->database->$table->find($where)->count();
, B* _0 J. k" R, C, ?: F. H/ }' C9 o - } else {
6 G% H+ I, u" @8 K, I - $data = $this->database->$table->find()->count();
8 x8 @9 r' x5 d8 c - }
' w$ @, d8 N/ [9 ^' O6 N2 ~: v( g& M - return $data;
3 p0 L g& c/ j! [ - }
4 N: B4 c9 H4 a) q/ ]- w - /**
* }( E1 C V2 E% g4 W. d - * 直接执行mongo命令
9 j6 \( K' j9 `$ x# a" M: A - * @param $sql
R7 F! _$ {$ R) e- x F - * @return array* Z8 e' v; p1 G( p5 [9 }4 @4 y
- */& p1 m) S7 J3 o' N* z8 F% K
- public function toExcute($sql) {! q2 G( C. B% W7 }9 k {( K) j
- $result = $this->database->execute($sql);
) a! a: L t @ - return $result;
& E6 r( N* t! F6 I8 H - }& |; H0 @" p% H; j! K2 p) I2 O, K% i
- /**' }3 W& Q0 R, t; r
- * 分组统计个数 U6 n5 \! M {3 I% r
- * @param $table
5 S, z6 L4 v$ _ - * @param $where
3 u$ l* [, t4 X8 _ - * @param $field# \' B7 z/ U* o( w4 J
- */) {# p" ~9 ?6 i+ `, G
- public function groupCount($table, $where, $field) {4 C; Y2 W# _ A# [, f7 O
- $cond = array(
& p! D# `: p2 }1 I5 \( B( c: K - array(3 g! p3 P2 u4 ]% Z
- '$match' => $where,
+ U1 C m1 h' f; k9 E) I) ~ - ),' h: S1 j7 l! V0 P# C6 f( E
- array(
' F1 Y% R4 a9 ~, u$ W - '$group' => array(
- X( I# E8 e# K - '_id' => ' l! W; \5 [3 h4 f5 K `
6 S' d: P1 b5 S' [- . $field,) ]8 t. L6 K5 b3 R+ n) `: z7 f# f
- 'count' => array('$sum' => 1),
4 k) l% t0 t( j/ B* r- p - ),, Z! ~* }3 e8 c$ N' u2 O
- ),+ |! U& b0 T# o: j6 u8 z
- array(
. s* R/ p' w, f; {) ]. U, |2 i - '$sort' => array("count" => -1)," z& l+ q ~; ^: I8 U" W, c5 i
- ),! l' W8 f! \$ w& i
- );1 x# [) v7 }) f7 T1 _" b
- $this->database->$table->aggregate($cond);+ S7 z9 W( n4 Q- t4 p# D" ]
- }* _# A7 G$ c* M
- /**
+ k( I' B+ C7 Y; T* y: K - * 删除数据
* ]9 X1 ]4 W- S( ^5 r) c% r - * @param $table
' K* }2 @' ^7 c! [ - * @param $where ^8 }, l0 h) s# ~- P; E
- * @return array|bool p p; C9 D" i9 ?2 P. X
- */+ M) J% {: E9 o1 [; ]2 L) T
- public function toDelete($table, $where) {% C9 q* @1 \' z0 f+ W+ w) T
- $re = $this->database->$table->remove($where);
0 p* D1 U( _8 `# E8 z8 S - return $re;; V* t- Y4 {& J" t0 h
- }1 s% Z; e+ @ c% t1 z
- /**% H& q7 D% C4 E8 m! s9 U2 }7 W
- * 插入数据
5 C, C3 b- Y1 z - * @param $table
( P6 L. o; t3 A' C8 n+ e - * @param $data8 w, e4 Y7 S+ t) k
- * @return array|bool
- W8 @, |6 @7 |2 z z+ X* @3 H - */
5 W/ q+ ~. N$ X: s# M+ g3 z - public function toInsert($table, $data) { u" A# q$ X9 n/ O+ |; b
- $re = $this->database->$table->insert($data);
, _+ y3 N- N( d2 B/ z4 C& }! H - return $re;
& @9 a6 y8 U* _+ k7 Q) b ]0 O - }
2 Y) W# u* d* Q: X! k; P - /**: [! t3 v8 K- S4 {8 F+ `
- * 更新数据, G' p% i$ T: s6 w0 r z2 ^
- * @param $table+ B8 `+ e& f2 A6 _
- * @param $where, V/ @* b% f5 p; A
- * @param $data
! w/ a! |) J% w M: q! @8 B - * @return bool
) N7 G: g' a: X. u& |) Q - */
& D U, ^0 O' X0 K7 h5 d& V - public function toUpdate($table, $where, $data) {; [& }7 x) I: J
- $re = $this->database->$table->update($where, array('$set' => $data));
3 i) Q) U5 ~( R- b5 D - return $re;2 B$ U+ k, X' S
- }2 g9 e# M* \& Z2 a$ R! P
- /**% ?8 t/ H& |' t4 z: j
- * 获取唯一数据
& Z7 J5 `. e/ h$ q4 \ - * @param $table
0 G$ W) _6 i( @* H' b5 q2 u - * @param $key# X) B# E: @1 i: ^& N$ n+ j1 J
- * @return array( q* o8 z( m( A+ u& t& F3 I f/ o
- */
! x' p- U: A) w) I$ j8 ^ - public function distinctData($table, $key, $query = array()) {& S7 S; H- T2 ]. E1 y* W6 i
- if (!empty($query)) {
# H2 n$ G' ^' s) L' |1 ?$ e+ } - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
3 P5 I' b, }: q" Q3 t0 l3 L5 t - } else {
' X5 ~4 h. W2 |4 o( E; G - $where = array('distinct' => $table, 'key' => $key);
" j# v2 A0 i1 }7 z7 C) N - }
+ H; J( ? Y. m - $data = $this->database->command($where);% b! _; K) i& v. Z2 H( s
- return $data['values'];
: X9 o7 F5 k* E3 X) A: ` - }
3 G# r' f! J' N: ^7 U& _. \ - }
3 Y. f( _4 _7 K; w0 S - ?>
复制代码
, \: Q+ Q A( p1 m4 E M. P
1 g5 s1 L/ l+ B$ {$ N. A& d/ ^* G/ t0 D |