|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
. U; w. H- j- W& u6 ~* q5 \' p模式自由。! _; }' c% b [4 F7 q2 Q. Q: V
支持动态查询。2 s c x3 u$ F; T0 D2 J3 N/ p
支持完全索引,包含内部对象。% b+ O& H" Q+ s+ j
支持查询。4 Z' z6 k. F' d1 J
支持复制和故障恢复。3 ^0 C' d3 c, q% l
使用高效的二进制数据存储,包括大型对象(如视频等)。9 Q9 r C, m2 |4 T- i
自动处理碎片,以支持云计算层次的扩展性
* O$ G1 D& t3 u& a支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。- [ O8 ^- C/ W" k- q
文件存储格式为BSON(一种JSON的扩展). B" F( U& a5 G- V
可通过网络访问 所谓“面向集合”(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
% ~$ ]7 W7 ]* j4 T; r: q2 V - /**. {9 K1 O, b) j% U
- * PHP操作mongodb数据库操作类" ?% k' \! b% K. b! S
- */
; P0 L' `7 }) b0 V$ v - class Database {+ Z/ S( U+ s! h M; d8 u$ r6 G
- protected $database = '';2 {; p$ x% c, t2 D& q# n; o/ H3 ]
- protected $mo;% f" M9 q& e9 @' t
- /**
) c! c y E0 n, w- r* k0 X7 R, F3 A - * 构造方法
% k' i# F% u7 w$ W& d4 w' k3 c" x - */
) R* u5 J* ]5 a' }; z; K" ^ - public function __construct() {
% X" F4 ] P8 J - $server = DBSERVER;$ R7 }+ W. r/ ?$ a# B
- $user = DBUSER;
# O1 U1 P5 n; ~7 X! z - $password = DBPASS;
! a# k1 X) B6 g2 l% x2 l# Y - $port = DBPORT;! p! V- Q" W V
- $database = DBNAME;
8 ?& E g* f7 m" E( } - $mongo = $this->getInstance($server, $user, $password, $port);9 }5 I& l3 v# [. ]) y `
- $this->database = $mongo->$database;# i \/ k9 A# ?9 R3 @ i
- }
! y5 s8 _# g6 t0 }: V - /**/ @7 r1 q6 p3 c, \
- * 数据库单例方法
" h& M. W& d6 J4 Y - * @param $server
: V7 ]& e E& t9 Q& e% k - * @param $user; r! l9 x6 W) N
- * @param $password
4 p. I: w4 [/ c" \! V* T0 A - * @param $port
/ O; r6 r. O& H* b* S% U5 E: _9 Q& ~ - * @return Mongo' K' m* K- U& j. \: u5 P
- */: r n7 V- U) N. c- M
- public function getInstance($server, $user, $password, $port) {
' u$ _' w6 V! L H, ? - if (isset($this->mo)) {
: v7 {- U" @1 x# Z+ e4 ~+ O - return $this->mo;
9 \3 X, l# c4 I. i, M - } else {
3 Q4 X! g$ S' E- ]# @6 Y - if (!empty($server)) {
+ ?$ ?. _1 n$ r/ y - if (!empty($port)) {3 r J$ B' b3 ~/ L3 R0 x
- if (!empty($user) && !empty($password)) {
, K' x( E4 [' y% h. N1 N - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");/ f; O& U+ h/ M' i. t. G
- } else {' h6 \! M4 G. u! v5 C. }3 r7 ]+ F9 h
- $this->mo = new Mongo("mongodb://{$server}:{$port}");' \2 W* Z3 B) G0 X1 E
- }
* L' l# {0 \% I* [0 l! f4 w - } else {
; x: d& B8 x9 n% Q( w N - $this->mo = new Mongo("mongodb://{$server}"); I) `2 q* C2 E
- }
- G. m7 B" w9 i" G& J6 y. P! m - } else {
* T" r$ `% L: W, L- l - $this->mo = new Mongo();
0 W* L" X; d$ ^% }/ C O8 }$ F - }
& O: [) [' x$ b; O4 b' S& w - return $this->mo;* O @7 W* d' G! L( c% h9 Y: @
- }
! D! K( g7 q; K( i - }* z2 {$ h- s; g9 q7 ~/ D
- /**# y, I8 ~/ K; N) |
- * 查询表中所有数据) M0 l$ B7 ` K( b2 O
- * @param $table/ t8 o. w1 N& ^ p9 M' e7 X( m
- * @param array $where0 {( Q7 w+ w! v% a( s: {& {
- * @param array $sort' s& m/ @) I4 ^4 ?! }! ]
- * @param string $limit
+ R; h& ~0 I, [( o - * @param string $skip N# R( X0 g$ y0 G9 y) \
- * @return array|int
+ F. ~1 q/ {1 k: V - */
7 _: v. t) g" G4 @2 F7 ], w3 @0 a - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
! X7 _- T( t3 H* N7 R y5 {2 A - if (!empty($where)) {: y: g* k( ?6 q! f1 z" Q
- $data = $this->database->$table->find($where);
& z0 C& Z _3 @3 }& d0 H; N Z - } else {
$ e! S4 d' O- N) S - $data = $this->database->$table->find();
( g. o1 B; ^' @4 }' z6 ^& ~ - }$ }0 ~' r! ~7 k& b( m$ `
- if (!empty($sort)) {
9 }2 u3 P# W' Y# g4 C1 V - $data = $data->sort($sort);
) \. c8 r/ J; c) o% o' ?9 l" Q - }+ j0 y( y( F7 O
- if (!empty($limit)) {' j2 y/ v8 L( c' |" L/ \
- $data = $data->limit($limit);
4 v" C+ Y; D9 Q% U - }
1 ~. _5 H- K2 o( T0 f - if (!empty($skip)) {
4 z- `; b' B5 q, \. z. ?% X4 W: z - $data = $data->skip($skip);3 L$ E, ]0 u5 j1 t. V" y9 q
- }
" `8 o. x4 l0 }4 S3 ?6 H0 R - $newData = array();
7 `, C5 H d7 X% Z) }. Z - while ($data->hasNext()) {
; z# Q/ {( A/ i - $newData[] = $data->getNext();
+ [* b1 t' Y( I: Z( ^9 C2 A - }/ b4 N6 [- a+ n2 Y1 \% [3 ]
- if (count($newData) == 0) {
" g5 d8 E) g0 L, Q+ b3 V" q9 z6 O' m - return 0;
/ B0 k9 ~. S2 `0 z# V# M - }- E$ p. c7 p4 B$ ~
- return $newData;4 ~& C3 t& y3 L( A; R
- }
, c; C9 ^3 q: c c - /**
3 U! O+ b: @- Q9 k - * 查询指定一条数据
7 e9 L, T, B) V, @; A+ d - * @param $table/ Z( c+ L; b, n
- * @param array $where
/ g7 B4 ?' J, A+ z$ c+ ]" P - * @return int; B) d K) j* E# X% `
- */
( l2 b* r6 S! R# Q8 d - public function getOne($table, $where = array()) {
/ K W# C1 u- f' L/ J- G - if (!empty($where)) {
6 f+ a( }7 h$ j - $data = $this->database->$table->findOne($where); \. l6 o C8 @- H9 q# A8 G
- } else {) {& J4 Q( k8 K: a/ j+ s
- $data = $this->database->$table->findOne();
- K0 l4 q; z2 \& n; U7 i - } _! {7 T% s i
- return $data;5 ^- d" q% X2 S7 B/ I
- }
8 H9 [9 u2 c/ m* ~: \2 W$ ^, G( _4 F - /**9 o* r) [3 \9 P6 c/ H4 \- ~
- * 统计个数0 D: e4 {# x" v/ ]
- * @param $table0 s' d; y7 a6 ^7 r- G
- * @param array $where
$ c# m: i# x" M - * @return mixed
! l2 H# z( g5 v$ O8 ] - */$ p: U D4 _& s
- public function getCount($table, $where = array()) {
0 y. ~1 O/ |( u - if (!empty($where)) {
6 @2 V9 {+ r* ?5 u - $data = $this->database->$table->find($where)->count();
* ^' o: }1 }- i$ b; }: | - } else {8 V, l$ N2 ^ h7 ?. {5 L ^& i
- $data = $this->database->$table->find()->count();( R3 J/ a; w% I% Z! J3 h% Q
- }
! |- V6 B/ w4 p4 ~; ^& F) s - return $data;
! |- @! [1 q- _- r - }7 \& Z: ?6 R8 u4 x K
- /** z) p C+ d% ^% H
- * 直接执行mongo命令0 G+ X4 d- N& ]5 ?( W
- * @param $sql6 ^& f; f) b0 A: i0 Y$ E. h
- * @return array
$ z- T! ]9 S3 U4 v( m$ R# e - */6 }# g2 [( t: l3 v! N7 J
- public function toExcute($sql) {" }: O- m7 @# C
- $result = $this->database->execute($sql);! D$ c" y j7 ~. f/ w
- return $result;4 z4 {1 z0 S$ Y* \$ k, t J
- }# c5 G- U: P |1 Y
- /**
3 ^1 w! U% ^* u4 P. V$ H) S6 ` - * 分组统计个数
+ W* o) m/ t0 S+ \6 v - * @param $table
' `! \" r# }1 A7 |2 x) o( g - * @param $where
& Y/ `$ J) }$ b8 r# v! w/ d - * @param $field
1 c1 k* A* c+ O( }. I0 t) Q - */
$ o; j, _: k, n' [; Q& l - public function groupCount($table, $where, $field) {
6 g+ S& @2 C% {3 p - $cond = array(
- E ~, w' I$ m9 }, ~- S O, I - array(
8 ~* q! @& c% c - '$match' => $where,7 C+ {; G. c# c$ i; a+ o
- ),- ^1 T6 z# ]1 Z, w% H7 X$ O
- array(
0 e. U/ b3 l c/ u - '$group' => array(! W' S; {6 x' ]2 i
- '_id' => '1 F( W3 M( x6 l H
4 M/ ~) [+ _/ U- ?% i4 O2 C- . $field,
1 R2 J2 v! e8 U+ w! R R. r1 a - 'count' => array('$sum' => 1),
9 L" y: _0 y6 N% N - ),
4 [1 h+ D8 b" P8 P. m - ),) k, z' \; m5 H- {1 M3 I, z
- array(9 r% {9 y9 @5 ^$ I3 ?2 K; y
- '$sort' => array("count" => -1),
- L" E. ?1 }3 E% {/ l; G/ \ - ),
/ H. g$ b$ T! l$ [; P1 A - );( |& k. z% L- b
- $this->database->$table->aggregate($cond);
! d4 r$ M9 K5 C5 J - }( E1 I3 ` W% e1 |( O, t5 J/ N a
- /**- Z9 x3 r1 d# Y7 Y
- * 删除数据6 g- |# F* n9 }/ B l$ H4 A+ ?& c
- * @param $table' M5 S+ V: ^/ }/ E" ?3 w* v
- * @param $where/ g+ N6 Y; D, `% B2 J7 E% ^1 r
- * @return array|bool) O+ N9 O* \7 a, e3 X8 G- \0 K/ N+ ^
- */6 u/ t% v* K$ @
- public function toDelete($table, $where) {1 @6 L9 @: u3 ]7 [, n' }, u
- $re = $this->database->$table->remove($where);" h) u& U8 M! [/ b v8 V6 v2 [
- return $re;
4 X9 d3 I; K* e! i1 j; q$ e: v - }
1 C! U: ?/ A8 ?) e/ V/ D7 B3 r - /**
0 k. t0 W* ]2 y- t" ` - * 插入数据6 `' u) Z( G. V4 t) p! M, H
- * @param $table& o$ V' g" L: _( v5 ^/ f4 Y
- * @param $data' d0 v# g5 r' ~# L* Z
- * @return array|bool
$ Y) r: V" r4 O M0 q$ G$ L3 u - */+ F4 _" i9 E; T" p# j
- public function toInsert($table, $data) {4 }% X; O( h9 K. ?
- $re = $this->database->$table->insert($data);
, `1 k& G |0 O! ]3 \( S) N+ o - return $re;! C2 p( ^3 O: ^; g/ M
- }' H) _6 a* N' p4 L& Y! G9 V; \
- /** e& y! W8 s7 A% u% L! S' Q9 d
- * 更新数据1 v) p, V i+ R; ^( P
- * @param $table2 ?( }/ U% l9 Y/ @( P8 W) T! y
- * @param $where
2 t& }9 R. ]% k' b+ C+ i& ?" k - * @param $data8 V) a/ M4 F4 i) y- a" t
- * @return bool% o) G9 V9 l! u, c; E* O* @7 _. N8 ^2 \
- */, `& l8 m# Y) y- I
- public function toUpdate($table, $where, $data) {
" H7 e, I4 A# P - $re = $this->database->$table->update($where, array('$set' => $data));& _% [7 n7 {* Z \2 f- X: r% X+ ^: q0 ^6 B
- return $re;4 b5 q: f7 O/ |- t: i
- }7 s( }# t4 H$ M% C
- /**
7 t! A' j+ H( r4 S* |: s - * 获取唯一数据
- h" \0 l) P5 u. ] - * @param $table
5 h0 ?6 X- q9 J! @, _- P& q9 a - * @param $key
% x0 z- E, H% |- a# h. Y% N - * @return array
+ l2 b0 v; F1 O8 I8 G9 F9 ] - */& m& L8 O8 h- H8 d9 b; C+ N& S
- public function distinctData($table, $key, $query = array()) {8 a3 {* w; x. _/ y
- if (!empty($query)) {4 d1 a0 L) [& O2 K2 [6 v4 {
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
& ^6 B% V5 Y( ` - } else {
! r0 x6 A- ^+ n3 f- @4 r - $where = array('distinct' => $table, 'key' => $key);
3 P1 I: F& r! A. B - }% T0 b U% h9 B9 t; U& y
- $data = $this->database->command($where);
* p( i5 B1 |7 {1 F5 j8 w - return $data['values'];
% V7 P- }' b$ Y - }6 F7 b) X+ W' y8 @0 d( {
- }' a5 f" E' m$ @4 C, y7 ]
- ?>
复制代码 ' W a0 r3 |# m! a% }3 C+ Q. {
|' p7 u M9 W8 f! R, f
|