|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。1 [- _4 U n0 c5 J9 H& ~' c _ x9 b
模式自由。! m0 f3 a# Y/ g. X4 q" k' `
支持动态查询。7 x: l% b3 G6 i: |
支持完全索引,包含内部对象。
- q. q' y' @) t- K7 @! E支持查询。% X+ u# H* ]. w9 X3 \* j
支持复制和故障恢复。5 F) P5 U" w7 E: b7 N7 b
使用高效的二进制数据存储,包括大型对象(如视频等)。1 U1 M/ V$ Z& C& g; p+ f
自动处理碎片,以支持云计算层次的扩展性0 |$ k* c# l8 E5 u
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。. }% v0 r$ j) c; E
文件存储格式为BSON(一种JSON的扩展)) h l* H8 \* Y% G
可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php5 `8 a- H! V3 ~. ^9 }. t2 q
- /**( D5 ]* m9 o) }% e6 x' Z
- * PHP操作mongodb数据库操作类4 ?0 W) S9 G' A* h) ^5 `
- */- C- F' A. Q- |) `, l
- class Database {4 d9 F' G3 [$ j0 k$ Y7 l" y N
- protected $database = '';
+ g$ g W0 |7 K! C* q - protected $mo;
$ \1 Q% B' \$ g) f+ E# P - /**
( {8 R6 G, `5 z - * 构造方法1 \; r. X& l6 G$ H7 T" n" `/ O
- */! @- j! \/ }1 `
- public function __construct() {* C! ^9 t/ Q' w3 p) i+ v
- $server = DBSERVER;& x" t. b/ Y5 `' o0 l
- $user = DBUSER;
2 ^3 J/ M( _5 M' k- |# I6 { - $password = DBPASS;* j; l V: a! x" l- E6 y
- $port = DBPORT;; o4 b. Y! b9 L }7 Y7 t
- $database = DBNAME;) D; e' ] V9 W/ F
- $mongo = $this->getInstance($server, $user, $password, $port);( o, k4 I8 L1 K; k4 j$ e
- $this->database = $mongo->$database;
4 q7 F& T; ^$ h9 x4 I - }
7 [7 R% E( T0 Y1 j& \3 r3 G$ d - /**
, H9 l" X/ w2 A# o+ ]1 x! P - * 数据库单例方法
8 f" ]' O+ U8 Y1 d0 ] - * @param $server
$ Q* n; S, N) ~: v7 O- b - * @param $user
+ J9 j s, r, m# \ - * @param $password: f4 S k+ [+ }5 b! W0 a( R# X
- * @param $port
* M4 b) ?3 V4 X; z/ F - * @return Mongo
/ D/ i ]6 M; o9 F0 y - *// c5 k3 W" D+ M V+ u
- public function getInstance($server, $user, $password, $port) {
& q2 h- E- }$ W" l8 c3 O" S - if (isset($this->mo)) {
9 R! g ~, M0 H9 s) D( l* c - return $this->mo;. H. U; X' l3 G* n% N
- } else {2 q, M1 d, v; I! \
- if (!empty($server)) {
* H6 [" E. t. W% s- x1 x - if (!empty($port)) {/ m' f, t- L& b/ g: X1 _
- if (!empty($user) && !empty($password)) {5 g& F+ u" v3 \8 A3 p+ v# B" v
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");$ R& ~/ m, g) m2 e) C
- } else {! ~% k" P8 s Z- A8 d
- $this->mo = new Mongo("mongodb://{$server}:{$port}");2 @: } _* H! L$ H" d
- }
, }: J0 c" X% a# [% i' J4 b - } else {
0 V0 d- E! M3 n4 T. S) s - $this->mo = new Mongo("mongodb://{$server}");0 B* j# |. u, n! e% v
- }9 e4 N N) p7 O9 q# c& L' ~
- } else {
; b, d6 |8 i, J6 b3 { - $this->mo = new Mongo();1 x5 c7 }, G9 ]/ p3 `# x8 S
- }) A/ a+ v% [6 P$ |
- return $this->mo;
( x U" e- z& D6 p; s$ t - }
9 `- a0 t5 | t; }, J% @ - }4 K+ n& W8 i: N9 U4 B
- /**) o) Q, b4 F( C% `: r8 {7 F0 I, F
- * 查询表中所有数据- a2 `& V, I" R+ A h
- * @param $table
/ l4 V1 k" e2 m. N% q' a; c1 E9 w - * @param array $where
* X% d1 N) g* W+ R/ @ - * @param array $sort! `+ B; s6 t# z( l/ U/ d4 S
- * @param string $limit6 W4 g! ]* s4 }& F# \' x# U
- * @param string $skip
% J; B& _ B8 h& b - * @return array|int
5 r$ f# Q0 {. U# n# f, l7 C& @' I - */9 @7 @! K* a/ j6 `( B! ^2 I
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {0 v5 Y0 O5 @7 v1 f3 j" q
- if (!empty($where)) {# F8 y9 g0 ]- F( } p
- $data = $this->database->$table->find($where);
. E- x; A! k) J+ A0 v U7 t - } else {
, L0 R( R7 H5 F - $data = $this->database->$table->find();
; I, e0 ]* m6 @- n3 }% _2 B - }
- A1 n* `) K0 P* k - if (!empty($sort)) {
5 r) z g6 i* ~7 N2 n - $data = $data->sort($sort);
! m6 [& T) z% D; i# U" z( Q s" j1 B - }
& }9 V3 W# P; n, k, u* X - if (!empty($limit)) {" w- D' \" S3 t
- $data = $data->limit($limit);
, x" R8 O& _- U1 M- u: t U - }
' `' t! \# _2 {' B3 z - if (!empty($skip)) {# g. P4 _5 o% e1 K
- $data = $data->skip($skip);
3 X0 h' G$ O' J: R* Y8 U! R- V - }0 x! n. e. H- t4 ?3 G' k! Q7 @7 g
- $newData = array();
- F' T8 l3 O0 D$ O2 Z( X i5 \. x# [, P - while ($data->hasNext()) {9 W. A: ]1 K7 ?+ k
- $newData[] = $data->getNext();
( m2 d: P3 V2 I& L" n# \) F5 W - }
" _! j% j6 O; \) `. c - if (count($newData) == 0) {, p/ |1 ] G3 m# A( o: @& s
- return 0;4 n% |: i: u# j
- }
' h' [, B* N4 _/ {3 y - return $newData;
! W) B' D2 x5 H2 q; K6 U! m& E. s3 h - }
{0 h( o2 j% o0 @5 i5 ? - /**
& P! e% A' l% V4 O0 L6 J. m - * 查询指定一条数据
9 x+ d, ]7 o! u# R1 }% g# p - * @param $table
@# j- G. C: P3 e- i1 R) B* X - * @param array $where
6 Z% T9 r: K* a( o- B& b+ ] - * @return int( s7 R j) J/ K- A; F7 [ k6 K: c
- */
- m; X' @+ e! j$ k1 K# o - public function getOne($table, $where = array()) {
1 |4 u! V; ~6 ^- x r% V7 x B - if (!empty($where)) {
) ~: ]" ?4 O1 X1 \" S - $data = $this->database->$table->findOne($where);
; t2 Q W9 c( y( D$ e% r1 b8 k - } else {
+ M( s( g' J* g - $data = $this->database->$table->findOne();0 M3 U9 B, ]9 E, U
- }
3 n: Z8 _. ?/ a/ _5 v9 x9 J - return $data;
+ f* ^3 A$ L4 z* k6 } - }
* M+ n% M c+ x - /**9 ^! ?, p3 i& M' u; }* N
- * 统计个数) K$ l j9 z- H2 \9 I+ S
- * @param $table* [# _! s ~# X5 J
- * @param array $where% V+ r) B; V% k2 b0 u
- * @return mixed1 _. @* S$ Z& ^$ a0 T
- */# M7 z& m; Y; J+ k
- public function getCount($table, $where = array()) {$ a+ L6 p1 o! B
- if (!empty($where)) {6 Y: a9 B* c- O1 t; v
- $data = $this->database->$table->find($where)->count();
4 t7 S- P0 |& W# l - } else {
2 a# m- ]/ s2 q- z; I/ v - $data = $this->database->$table->find()->count();- J1 x' g# V* K8 J
- }; v ^' v4 `0 D$ \+ D# F
- return $data;
5 A- n2 w: x! x8 L - }
6 S, ]! U5 [* ^0 y6 Q: \* C - /**
$ ^( R7 ^5 `- P) y - * 直接执行mongo命令
+ m7 E$ ]. e1 Q, w3 o8 j% m - * @param $sql
. A) V, }% k" ]9 Q" e7 t - * @return array
8 ~% `3 W# F& M$ `6 \2 | - */
8 V, b% z, D- s( z) I: s/ `% S - public function toExcute($sql) {
* J" d# W' I) Y: V' b& | - $result = $this->database->execute($sql);
1 o4 w! P" b" z; g+ j - return $result;
9 h& ?% c! {% T0 t" a) S8 B - }8 E4 m B* s! E: N$ S/ H" o
- /**+ H t7 k y( |- Q. }6 L
- * 分组统计个数
- j/ P4 V( O% \ - * @param $table# y9 Y( s i5 O7 o K7 ]. o8 c
- * @param $where6 f: z/ m* Q7 c* c
- * @param $field
; ?) Z4 K5 K1 X: r - */+ F( Q% f" A K/ W0 s6 `1 n
- public function groupCount($table, $where, $field) {
- D# }6 J/ W7 p - $cond = array() i }) u5 _1 |3 M+ {2 ^
- array(: s/ C/ i7 I& V& I* g) k% t
- '$match' => $where," Y: \! o$ A, |% Z& G! i$ p$ B! E$ M( c
- ),
' a- \( q3 }0 t4 t2 i+ p# l - array(" k* b* X' A: C$ ?; P6 I( A
- '$group' => array(
2 _' F3 @/ U3 a3 T+ n8 C - '_id' => '
9 x2 {- B7 h$ f5 Y: A
6 @% T1 g, p+ g, A& j- . $field, b; F8 i: e0 n/ @' G
- 'count' => array('$sum' => 1),! @+ X3 F0 t8 O: J& _
- ),
# A" W) P* ^& R+ [, z+ ^9 Z8 Q p2 w - ),
8 {9 Q) s, k+ {, k1 W: f - array(: I/ Z2 s! E) w2 W. e
- '$sort' => array("count" => -1),5 s7 `3 X- q0 ~1 s) i
- ),
3 f2 b" E3 P+ J6 S: G6 W - );
1 w- C+ G3 X `& J0 a/ l - $this->database->$table->aggregate($cond);
5 c" @: O" E2 f+ K! L2 P - }
/ R# W2 C/ r6 O3 K2 `, ~$ T5 s - /** X5 u0 ~; [$ O( K- v. R% H
- * 删除数据
$ f( {0 t1 P: J* a: ^: E - * @param $table: o) V; c6 k+ l2 T( w D6 l8 t( J
- * @param $where
* E, X0 U; z4 C - * @return array|bool
% u" n2 W5 G; c3 Y - */
9 y2 `5 C6 B# d - public function toDelete($table, $where) {8 p" m0 F& r& m2 L* U2 z8 \ n* T
- $re = $this->database->$table->remove($where);" J% G Q1 k( {* R. Q$ W+ \4 f4 P1 r
- return $re;+ k4 J6 t3 R; t8 v! P, J, H
- }
! Z. u$ m8 Z" Z' x6 w% Z6 h6 ? - /**6 X8 x3 q& f% ~. {" D# Z* J5 V- C
- * 插入数据
0 O3 `2 t: v* {! d - * @param $table0 z% P/ \, O6 c/ Y
- * @param $data; {' J0 s. d( {- ?6 B/ x
- * @return array|bool
1 w; J# h9 K Z6 j8 N1 S8 H; _5 p: C - */
+ O% F( J( u% G) ~. ^6 e9 @/ k - public function toInsert($table, $data) {
+ _+ J$ x. V5 ~" M- N( B* K, g - $re = $this->database->$table->insert($data);
& X5 [. g0 _' r: m" X1 t - return $re;
! ` t( y: @+ M5 d! O1 { - }; x' R5 S3 t; P! W
- /**2 x2 P+ s1 b M4 j6 q8 n
- * 更新数据
: Y! {& V. ?5 K) C7 s/ x6 m - * @param $table2 l8 s' d) s" c( A3 E( \
- * @param $where
- T; J9 A( P) @1 B - * @param $data
3 _8 C E: X. U - * @return bool8 T. W' x1 w c! F
- */
, o0 a. X; [) g - public function toUpdate($table, $where, $data) {
& f# m! U3 E; r - $re = $this->database->$table->update($where, array('$set' => $data));% l$ j0 d4 o* d2 N- }0 U* X
- return $re;$ ~6 i m) R! N
- }9 z: x- W- W: {; y# Q
- /**
! V( I9 G+ [# I8 i - * 获取唯一数据" B+ n3 B+ G7 ? s
- * @param $table
* D2 y0 Z. p! X: z [( D5 @; E6 Z - * @param $key
! |- u+ w% x4 g9 \2 d y - * @return array U3 R' ?# p+ J) [
- */6 e( E$ x* f. H5 h( _! e% h7 j( H
- public function distinctData($table, $key, $query = array()) {
. B' `3 r1 q: y& [1 r - if (!empty($query)) {" \# f1 l2 J5 ^) `- B
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
1 Q% z4 J9 a$ H7 o) M' H - } else {8 A" {3 f5 m7 C' j! j! }
- $where = array('distinct' => $table, 'key' => $key);
( s3 m- A8 x+ ~' _6 Y' z - }, d; t. L3 F S) m
- $data = $this->database->command($where);
/ B5 S+ y! e# l- | - return $data['values'];
0 \2 Q# H; Y3 K) |0 r4 G$ B - }! E/ }+ `3 c- O* `! G
- }
7 X3 |4 g5 o: m+ D - ?>
复制代码
: k- P& b. ^ a8 u j. U
2 h0 F# c: D! H |