|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。0 V5 x. V! v: |& Y( j9 @: Q
模式自由。
) X( M" j! C, Y J+ {7 `支持动态查询。2 w" R* T/ F- C: u4 h) }4 p
支持完全索引,包含内部对象。0 Y; \. N9 O, b& O
支持查询。
z& o/ ~6 |4 A; V支持复制和故障恢复。
# _- }( ?6 j+ w1 z使用高效的二进制数据存储,包括大型对象(如视频等)。
* ~& t2 m% V/ R8 Z5 F自动处理碎片,以支持云计算层次的扩展性
/ p. Z$ O( U& P$ F1 k/ O# Y支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。/ i) }3 k* ~- f0 C4 Z
文件存储格式为BSON(一种JSON的扩展)
' P' _+ ~/ G3 E8 _可通过网络访问 所谓“面向集合”(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. m. s1 i: |* B& Y
- /**' v# i% P; i7 `1 f
- * PHP操作mongodb数据库操作类
' E6 C- j# Y, I$ [7 X. [. N - */
% j+ w$ B2 U! D$ C; l; k+ c2 n ? - class Database {
- O7 O2 G, d( J, ] i - protected $database = '';2 H% ?9 K2 b- Z* V, ^2 K) J
- protected $mo;- ]/ h4 X0 f D0 e
- /**" y: R* b' Y* |: O+ i9 q
- * 构造方法& \" ^' \5 ]& L0 U3 I7 \4 s% J9 r
- */
. U6 U: |! f/ R6 i2 J - public function __construct() {
) o! ], C6 {' X- V" W$ M - $server = DBSERVER;
; d e) N; V4 d7 |/ z# S% [% H - $user = DBUSER;$ W$ Q9 g6 l/ \6 b
- $password = DBPASS;
; @7 l- Y. X0 Z7 _' Z( T' A( i4 w5 g - $port = DBPORT;$ X" @0 |* D& d
- $database = DBNAME;) \- [% R2 O q) g1 l# W
- $mongo = $this->getInstance($server, $user, $password, $port);
+ B" X2 k' b( W: ^. u) a: a5 m. P- U - $this->database = $mongo->$database;6 F" v' |1 w) s3 D4 M. p! K/ ~
- }
" n8 Q8 R: v8 U6 |( g - /**
. N! q+ M( G8 i3 R - * 数据库单例方法% n ?% l) ^& x9 b# A$ j& S
- * @param $server
$ c H* q A9 ~6 M6 Q$ K - * @param $user
3 X" L+ _1 S9 ^ - * @param $password% d- x. N. P2 h/ v. O6 I3 I
- * @param $port
# l; V3 X! }1 r) d6 X8 ]7 i' T6 v - * @return Mongo
' @. \5 f1 K% \8 i+ R& F - */
, _7 l6 _1 K. S+ R9 D - public function getInstance($server, $user, $password, $port) {# |; O- M6 j' G: q; O
- if (isset($this->mo)) {
4 [9 Y7 x- e/ L) a6 [7 O, _ - return $this->mo;; d8 N# r: Q( S$ P v
- } else {
; Q4 I$ Q1 q, {$ y0 z - if (!empty($server)) {
6 D) O; c) J) z; }& R - if (!empty($port)) { b; J' M* G# v9 q
- if (!empty($user) && !empty($password)) {+ k4 j, A- Z9 f3 J4 W9 p, i
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");1 A s3 k" f, e6 h: q3 U# \" Z
- } else {
6 F9 u1 Y& S' | - $this->mo = new Mongo("mongodb://{$server}:{$port}");' }- p( Y* Q( F$ a$ y
- }+ V& _; Y/ x% P/ t2 Q% Z* j6 Q
- } else {/ k* @5 R* p: g0 A+ h7 x
- $this->mo = new Mongo("mongodb://{$server}");
2 U, U9 a6 J& l! }0 e! v& P# b - }! F% C* U3 L: {1 M- z: t4 b4 k
- } else {
" w' }8 I4 @' c. f- h1 J - $this->mo = new Mongo();% B' p) X, I0 Z# a* o
- }, V! V. D- x* e& f% b2 U% f
- return $this->mo;* q9 {7 i4 `' `. G; D( p2 p
- }
) w' L. j$ b5 D+ Q; D( ~- @ - }
( m! ^) F" Y# `( X - /**
7 n5 x: r. G/ [ - * 查询表中所有数据
( j& o* B; d- q* y* e - * @param $table
5 W s* Q3 S- B4 |/ [- ]" \* Q - * @param array $where
V" ~% }! T/ N! [4 J" B - * @param array $sort V1 D9 P# ^2 i/ ~! w
- * @param string $limit
1 |2 J! _+ {+ i' d9 Z - * @param string $skip
, p+ F- J8 N2 d5 N/ w - * @return array|int
* `* T3 h& I* O, \! B3 ^" d - */
( j, g' g( \, c- Y7 Z. f - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
; @' B7 E* p; z8 y- r - if (!empty($where)) {
! E) z7 E- j% `/ a0 z/ i - $data = $this->database->$table->find($where);% l0 X8 E K1 |7 l7 m2 u0 b I
- } else {5 s( N% N5 ^7 \" F, A
- $data = $this->database->$table->find();
6 x# C: @) A2 R1 w - }
, m1 r; i# J9 Q& M4 b6 o: c - if (!empty($sort)) {$ ^; m" N4 w$ V c0 R% h
- $data = $data->sort($sort);
8 q' k! z+ F' M- t - }* f& c8 W# G4 i2 D
- if (!empty($limit)) {
+ S* Q6 u1 O }6 @8 A# v - $data = $data->limit($limit);# g7 M4 e; Q0 j0 F4 |
- }2 @; T" U. r# m0 J9 H' i
- if (!empty($skip)) {+ {( ?+ L3 S: I
- $data = $data->skip($skip);5 P- W8 O3 B9 D; w4 o& `0 _
- }+ t* B" C3 f9 w$ G1 i/ |
- $newData = array();$ u( B6 I5 ]* p* j! ?% b5 S
- while ($data->hasNext()) { v& j) y4 f W4 P' [
- $newData[] = $data->getNext();
5 }& B3 a) J6 n - } i/ W1 b/ c$ \% m- r
- if (count($newData) == 0) {4 P/ g( a; L5 X; p1 x& h1 D
- return 0;
6 t9 k9 B- V2 d5 G0 W4 N0 L - }6 z" Q9 _2 P: K% C
- return $newData;
( V' d$ e9 H5 R& x" W) n& @ - }
- h( @. U, d1 ] v2 s - /**- q/ E0 f* @, m$ `
- * 查询指定一条数据
9 r% P8 g( h9 ]4 y7 |2 t - * @param $table
5 d& x( |6 Y" a6 G7 d - * @param array $where
6 d+ M, k- W" f6 C Y - * @return int$ r+ Q b: {9 @: s5 m1 M# N
- */; _4 \2 |+ C/ c; Y
- public function getOne($table, $where = array()) {
$ c( J/ y4 j/ F) f4 J( ` - if (!empty($where)) {0 p# s$ \) M/ l# w; v; D C z
- $data = $this->database->$table->findOne($where);# v7 s0 N% V1 m+ L1 h" z
- } else {
; J; T; M5 t' B& c) [9 n - $data = $this->database->$table->findOne();
# j0 {0 m% X( T; f- Y7 Z4 } - }2 \+ I4 v4 D* M: x0 ?4 c* M5 Q
- return $data;3 ~3 J6 i+ B. d" v) i
- }1 v/ y- e$ B' Z& {2 P+ z C8 I
- /**
" J3 b6 l( Z3 m4 ?" ?0 n7 R/ m - * 统计个数 A1 k& j9 }' w
- * @param $table
: b& @. O. s; M) n# n6 s! L - * @param array $where
' l* ?7 @0 E1 F5 w - * @return mixed5 H5 V' D; J4 T# ?# I
- */3 C3 R w* @8 p% J) x
- public function getCount($table, $where = array()) {- c7 U# p% P- r% |
- if (!empty($where)) {
& Q3 u- ?' \. n8 Z - $data = $this->database->$table->find($where)->count();4 F# }2 p0 N: z' B7 L
- } else {
( [9 V2 {3 t' ^* H6 ` - $data = $this->database->$table->find()->count();
7 h/ l) j" w2 ?: Y' n4 L - }
8 s5 A7 K7 h8 r2 T$ M/ [ - return $data;, D( k. ?5 B% u& z+ x0 j" F
- }
1 f1 F) t- m O8 \5 { - /**4 w% p2 j" \) ]: x' w/ n7 L
- * 直接执行mongo命令( [1 a0 x6 l6 u8 t1 I
- * @param $sql
1 v% y ^3 h, a# R. [ - * @return array
+ N# b+ }% {- p4 \) }6 A: F+ k' n - */5 X9 a# ]# V& w& ]8 k0 ]% X5 O
- public function toExcute($sql) {
. e/ Y7 ^3 Z N1 h3 C3 y - $result = $this->database->execute($sql);0 m8 @, E2 M, J3 H) a8 ]# j3 |
- return $result;, {+ O! m7 C) \6 y4 q$ \: ?8 v
- }* F' }9 f& `3 `: ]
- /**
# q4 `# p0 l2 K9 g" i0 P$ B - * 分组统计个数
& c8 Q: ~& k9 g) g" K - * @param $table
3 C; @4 W _; V+ y+ L - * @param $where
; a t3 J5 ~8 c4 o! X+ R C - * @param $field
0 P5 I( r' w! h3 t. Z4 n3 M0 H - */
! [/ F5 s( Y1 ?3 D: ? - public function groupCount($table, $where, $field) {
2 f: {, J( ^) b( T# I - $cond = array(/ ^6 H& t$ d) l+ E3 j
- array(9 \2 l. m1 I( u2 |9 d, z5 G
- '$match' => $where,
7 C2 C, I0 {5 g - ),& S" q' w1 G2 C
- array(
3 e4 B+ M/ `7 F: N; Z - '$group' => array(' @2 O7 A7 P M7 K! c$ D# t
- '_id' => '
; [4 `% ?2 ?0 U7 Y7 J - / I) X( Y1 T1 ]6 J9 _ E
- . $field,
+ ~& N: z# s m# b0 ~) A9 W6 ?+ S - 'count' => array('$sum' => 1),% r: i4 {9 u( B3 p J
- ),
5 m* {* N) \, h - ),
; y v( w3 K" I; |; \$ M - array(0 G! ^# Q4 C/ _1 \! q9 `4 S3 ]
- '$sort' => array("count" => -1),
+ @. f7 t: h: H0 B4 r# K - ),1 k+ e0 p8 g9 t
- );+ i9 g# p) A) ?1 f) E
- $this->database->$table->aggregate($cond);: @( N w* l5 X# ?7 Q4 {
- }
% y9 k: }" x, j. l$ ]/ _( l2 B - /**
8 H- E2 S0 q ^- i) X - * 删除数据/ u! {' X, |# X8 ^, ]. n- I& o, I) Q
- * @param $table
4 L: H9 h# a, p6 q3 }4 x - * @param $where! h9 @: r: Y9 ~3 a) F7 Z. j
- * @return array|bool. V7 e8 E4 s/ E! f2 c
- */1 |3 h, x- M0 m2 P* i" X
- public function toDelete($table, $where) {
* {4 ]: d2 x# o1 Y4 K0 a/ o* @; X - $re = $this->database->$table->remove($where);$ L. `0 H+ n% p& m3 A& M
- return $re;! C3 Z4 a' K8 v5 {8 W
- }
! w/ O1 H6 _6 q% ^8 }# D+ a - /**& H3 K( I3 [+ r; g6 h3 _
- * 插入数据
0 T# ~" I5 ^8 r. K; Q, C - * @param $table
$ d. g6 c r6 ^5 i - * @param $data H+ q# S1 G* @) n) v( c
- * @return array|bool( M; I9 q. x; c# m! v
- */4 W4 T! k# ?3 r& ?
- public function toInsert($table, $data) {
+ g( c8 D b3 s: B - $re = $this->database->$table->insert($data);
6 e6 }& j0 D1 ] - return $re;; a- F1 r+ P" y: d5 h" `
- }
0 `8 S# h/ A d8 X6 V( Y - /**
% z% q& s7 \' K4 k, w - * 更新数据/ c- j' u. a# o& C- s
- * @param $table+ M7 Q! W7 i% e/ n1 i' h
- * @param $where5 K- h( ~: n& ?2 j! X* J- K
- * @param $data
0 D6 P3 n6 p" ?. a: D6 J) l9 W - * @return bool& s4 T8 y( t* d& ^
- */
0 v; d( p3 P5 P* I$ A, n3 d - public function toUpdate($table, $where, $data) {1 H: T' [- f3 t& v3 g2 @2 q) b
- $re = $this->database->$table->update($where, array('$set' => $data));% Z0 K6 V8 R% m+ Y
- return $re;
/ B0 T6 Q2 T9 L% n+ \ - }
$ l1 V B& B2 d. ~4 M - /**, p5 y: h E1 {# c; v
- * 获取唯一数据4 c# o* u7 ]+ }( f- ?
- * @param $table
$ I6 ^) K5 V+ x3 e - * @param $key7 y; i; C* Q, X; s+ A& H7 ]
- * @return array
7 A* @* u% b& s5 w: F1 R* e5 B* } - */
/ u1 l1 c7 r- ^# `# U4 \" o' B# o$ R - public function distinctData($table, $key, $query = array()) {
) f# _5 s2 ^, W/ U5 d. W) N7 _7 a - if (!empty($query)) {
# F- y" w( R2 i4 F - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);: A, a6 n K, t& {% b8 d! Q5 X
- } else {) b7 A2 B! g' ~6 D' [0 S
- $where = array('distinct' => $table, 'key' => $key);0 R) n( M. n& u3 ~
- }
3 u+ e8 [& r+ Q0 H - $data = $this->database->command($where);- x" ~; z n! W0 R+ u
- return $data['values'];8 J4 A2 A2 c5 I8 n7 y; k
- }6 x6 u& H$ H0 @
- }
8 ~' N& k6 t f$ [& L. G2 q! | - ?>
复制代码
4 J, c8 ^0 q! |$ R# n- e8 R# H8 V8 m4 O9 q; s0 y6 J( p
|