|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
8 c4 x; H) a( V3 ^2 I- L模式自由。
% l% s, H; ^' L+ U$ Y4 Y. T1 j支持动态查询。: F4 ~; N @$ d( j. e5 n3 w
支持完全索引,包含内部对象。! R, b4 B" _2 d3 {% Y( U
支持查询。
3 v. K4 o5 i! `! K [支持复制和故障恢复。1 n1 H8 O6 m, C' _ e
使用高效的二进制数据存储,包括大型对象(如视频等)。
6 M% S' d4 ]1 K9 `+ D) I自动处理碎片,以支持云计算层次的扩展性* Z- d4 i, p- L& u! e$ I9 G$ p
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
9 u$ v( ?+ J* j4 {6 l文件存储格式为BSON(一种JSON的扩展)
" w9 J5 N$ z. x4 S: e, n& ^: [可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php8 C& U% c9 m: E# N$ X9 l, Y: [
- /**- m u' x" ^' g* C& l# M
- * PHP操作mongodb数据库操作类
2 }3 ~! M, N: q% g - */' F+ Y, R, |" `4 t' v9 Y
- class Database {
) \% ~' g; d- Z: |7 L- K Y* E, P - protected $database = '';
+ ]. F9 Q% l& [. v( E8 I9 P - protected $mo;
' q. I. `2 e% \- U% V5 \$ W - /**
6 x7 N8 X' H6 j+ F9 z - * 构造方法8 e# X/ h; ]2 f8 o v' k, @0 T, K
- */) V6 ]0 c* C5 V! w/ e- M" g. N
- public function __construct() {# t/ ?( E- @+ Q7 k$ a- P5 M
- $server = DBSERVER;1 n) L" E3 B$ ?0 r4 M! }
- $user = DBUSER;
1 ^2 \3 a1 P* Z$ }% D# ~ |6 A - $password = DBPASS;
# O( ]$ X1 i/ X: i2 D8 f% s1 e2 v - $port = DBPORT;. e# F" }* x2 `5 c0 Z
- $database = DBNAME;- F* P* H6 `$ w* i; k; E
- $mongo = $this->getInstance($server, $user, $password, $port);
m. w; @* u% _; z* s. d8 o - $this->database = $mongo->$database; {% q: ?) i- K7 B
- }
k6 |/ i8 ? f' V2 V4 Y+ q; d$ W; C - /**
, T0 ~6 \" w( @9 v2 ` - * 数据库单例方法7 q2 @( e+ X4 Q: w3 Q: b( D& A
- * @param $server
1 ?% ^. d: {4 l$ o; [! T4 x - * @param $user
* S+ D, E: r% g3 C; b - * @param $password
1 W0 O- B1 ?, f+ s - * @param $port" R h" S- g4 J' h2 L8 C
- * @return Mongo) D; w$ K% L, z" x H6 T- B1 y
- */
; m4 k; i2 C. g" ? - public function getInstance($server, $user, $password, $port) {0 |1 a% ?% X: Z; R ^5 @
- if (isset($this->mo)) {6 j4 |; m7 [) W" X( H ^! b
- return $this->mo;
6 `; C- _7 E* R( U - } else {6 |* J6 Y2 y# I7 g; S0 |+ c( o
- if (!empty($server)) {
5 k5 Q+ T& m5 d! \/ x - if (!empty($port)) {3 t0 n: B4 Q, k" w+ O
- if (!empty($user) && !empty($password)) {
: N& j/ q% k$ e- a - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
7 m; n0 `1 f. X0 }$ ? - } else {
$ r9 M# \- F% y. E6 u - $this->mo = new Mongo("mongodb://{$server}:{$port}");
& q& B5 e L' v! ~ - }- C9 E9 ` l$ w( f8 _
- } else {1 L; P9 Z$ P/ t" ]
- $this->mo = new Mongo("mongodb://{$server}");& v; k1 d, }4 b4 l/ X) V# t
- }' p4 ]) l1 X; e3 E' C$ S
- } else {- b6 F9 s1 h& J1 y8 c2 n( e" Z: C" q
- $this->mo = new Mongo();
2 [; t) a% z: ] - }
: V4 z r- `5 h& Z/ J - return $this->mo;
# y" L, E \9 ~' t; `) G. m# o) v - }
* C/ W9 i5 p4 n, [ - }/ Q. R0 N: p6 G4 r5 a
- /**8 P0 l0 N3 t# v! ^& q4 v
- * 查询表中所有数据
- `4 w6 O) q# m$ F - * @param $table
/ e8 K9 U8 x& h6 o7 Y - * @param array $where' F7 n7 w8 u* ~' F1 m+ q. j' {
- * @param array $sort! {1 Y( E8 T& N$ b1 t6 T
- * @param string $limit4 \5 J+ I% @/ Q2 O
- * @param string $skip3 ?; b z2 i! \; w
- * @return array|int
N' P+ u% p* { F - */
$ c8 m! Z& n& p0 t8 ]7 B - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {6 B3 N7 L% p. T2 \1 @: R
- if (!empty($where)) {
8 X) i' K- U* f5 W) o0 ]# B; S - $data = $this->database->$table->find($where);
# z; s4 r. l1 G& t - } else {
- A. S$ u" z9 N1 V - $data = $this->database->$table->find();
5 A) x5 ^/ e3 e- d! s# } - }
E: M$ |2 V4 _7 N, s" @+ G - if (!empty($sort)) {
. S7 k( [4 w! S/ v - $data = $data->sort($sort);
2 F3 g% h Q3 g+ S: Z! H9 V. s* _, s - }3 x$ j7 ^- F: [6 T
- if (!empty($limit)) {
9 K; X$ i+ Z1 y8 R4 K) ~2 ]+ r - $data = $data->limit($limit);2 T# M" O- a$ x' e [
- }2 H! |. _0 f7 R1 @
- if (!empty($skip)) {) _' B8 `6 `; j% v: @5 ^5 {5 n
- $data = $data->skip($skip);5 l1 Q; B$ x( p4 r
- }9 B; r6 E6 {* v8 Y: Q2 R
- $newData = array();3 H( n0 Q7 C' J) f! @, v
- while ($data->hasNext()) {
$ U' v2 `+ _& S8 g5 B - $newData[] = $data->getNext();
& n: }# y, C5 k! z# }& P - }
' y- h7 g3 N3 b5 k0 @1 k8 |1 w9 A' F - if (count($newData) == 0) {
3 N/ J6 S- n; ~5 S# C - return 0;
: y/ I$ D3 U0 { - }: m- y5 g4 w: z
- return $newData;
" B7 @% n6 Y9 M& z, m9 L* C( C - }3 Z+ N3 y p' [! G) ] U6 h/ [
- /**
+ n/ V4 E/ j: L - * 查询指定一条数据
' O3 }, v; S0 j4 [9 W& W. N! G) Q9 m - * @param $table
% r; M1 b8 k7 f' A) e' ?, D - * @param array $where
1 B% a, S, l- c - * @return int% W, p% L* `8 R+ q
- */& o( g3 j$ L' @8 g
- public function getOne($table, $where = array()) {+ {$ c$ o# S7 _/ D
- if (!empty($where)) {
/ o4 Z4 C0 d: r: b1 L3 V) V& T+ Q - $data = $this->database->$table->findOne($where);- G v+ p" v1 H' D
- } else {& n* q" ?4 E0 G) v! [" s9 p( f* e
- $data = $this->database->$table->findOne();8 @* Q9 W0 J2 I0 m! P" w
- }
2 L4 B) k" x P# H - return $data;
% o7 D0 \" `2 K U - }! y8 n, I% ^) s3 w" b( S& j1 _
- /**
# T& S5 D, f, _2 ^, p$ n - * 统计个数
. Y! r2 n3 S0 x3 d" i& m1 ?; B) p - * @param $table
9 W3 T O! c; H5 d$ m - * @param array $where( J: K1 A$ c* W% P2 h( B
- * @return mixed/ G# N' }* M, v! C
- */
5 `4 Y" R2 A1 I$ v+ _) t' w, | - public function getCount($table, $where = array()) {
8 F$ T1 b- C* _0 _1 ^7 U9 P - if (!empty($where)) {
5 C+ l3 C% k! H5 o* L$ K5 g - $data = $this->database->$table->find($where)->count();
( b B0 b$ ^: Z. A- |- t% u - } else {
6 J& {0 D2 j# `; R - $data = $this->database->$table->find()->count();
, l! U! H" _1 [9 ~ - }
" O/ v0 j( ?( F1 b' K$ ^ - return $data;5 {" L7 r' m# e# |
- }& z% R$ d) l: s: {3 q
- /**
. a! h" _7 z* f' D, o! ?) D: c7 d - * 直接执行mongo命令! k6 C/ u+ I; f; S( N! E
- * @param $sql
" x% `3 D1 v: z. K. [& ]1 ? - * @return array% r( J) w$ z0 }( Y8 K3 {) I
- */1 c) s2 F) U/ Q) [6 x
- public function toExcute($sql) {
4 h$ m3 F S9 W( I2 m5 y - $result = $this->database->execute($sql);+ I& X Q8 a- H# Q8 ~6 J7 ~
- return $result;; I5 f+ J0 s- o% s
- }
* ^5 v3 ?$ F2 o - /**
. X- z/ Q0 r5 b* o - * 分组统计个数: P" n$ l, ]9 L4 m+ y2 r. a& T
- * @param $table
5 x6 T* M: @* K% T" i1 @" K - * @param $where
% b+ m3 p8 S; z+ w' d" V3 m* y - * @param $field+ C# H5 O2 e2 G8 P
- */) p4 Z4 x# m$ X3 O! f- ], m
- public function groupCount($table, $where, $field) {
+ D) T% N* K; f$ z9 S: r - $cond = array(
6 }5 W; |' v% W+ X3 d; v! K - array(
b5 T8 y; }8 E3 M1 w2 ^. F5 g8 c - '$match' => $where,' ]+ r9 l( u, E' C
- ),
8 |2 J' g" P. ]/ | - array(' h& r- O- _ W5 X' Z8 ^
- '$group' => array(# {2 h, g3 |3 q6 A# z
- '_id' => '! d3 g9 O6 Y7 T$ c; I E
- ; E- A9 z& S( h9 }% ~& U
- . $field,, v5 T. {/ M( p3 N6 \& _
- 'count' => array('$sum' => 1),. U5 L8 S, }: i/ o. T5 V
- ),
4 P+ H: [+ q7 v6 H$ I, n" H - ),, h/ C( x0 a L5 U
- array(. F0 w% W% R& S, }9 I* s
- '$sort' => array("count" => -1),
& Z( C$ k6 a8 ^" I0 o - ),, n* a# v& z( \; ]8 z
- );
/ R( s) ^9 ]" e/ K) d - $this->database->$table->aggregate($cond);% b( d2 }; g: |, p% \
- } u8 C Y9 _7 z" `
- /**# L5 _: }+ g% E5 `
- * 删除数据
' K4 S. c( O9 [- E% ^" Y# | - * @param $table
$ J. [0 W; Y* H; P - * @param $where7 f. _( y' v. U; W8 H) v
- * @return array|bool
% C% O) a& P+ o - */
; l8 S7 o* c E0 K ` - public function toDelete($table, $where) {4 |* `# U$ h' z) u3 J
- $re = $this->database->$table->remove($where);
7 T1 M' p. E$ q3 i; J8 X - return $re;
" X( j+ C& z7 L h" S - }
) i3 ^6 p3 `: }( {- g3 G1 g O - /**
* n9 R9 M9 X& s% x% B - * 插入数据6 [( P% \7 n; j% F* `
- * @param $table
/ L+ K' W( B1 ^: x2 H3 K* ^, B - * @param $data
! h* v7 j2 K& @7 ]# b. W - * @return array|bool
2 m6 l2 y9 ?# J# m4 b - */+ c) Q7 E+ l: Q! t/ g
- public function toInsert($table, $data) {$ { ^2 s m* X
- $re = $this->database->$table->insert($data);3 L, H& c: |2 v1 b M
- return $re;
; p8 B7 F# E$ r, p4 o - }
4 O5 {2 t5 ^6 F - /**9 |# \! i4 b* U1 | d2 S8 a" Z+ L# A" n
- * 更新数据
: m5 t ~+ D6 P# ]6 M - * @param $table+ J8 _8 `5 l2 x2 X) [. P
- * @param $where
+ q0 g' J8 i* Y: k - * @param $data
8 B$ i$ P- K/ W9 E! D - * @return bool
6 q7 d: A9 Z7 B* b/ [ - */$ g5 ~6 E* Q' Y& Z8 M, w' v
- public function toUpdate($table, $where, $data) {
' ?9 t0 C% R: S/ D3 `6 l+ \) A$ A# L - $re = $this->database->$table->update($where, array('$set' => $data));0 d/ F: t. D1 }( p( ~
- return $re;7 p, Q" ~# n) \ K' x0 C( x
- }# j+ [) | f- z9 D; F
- /**
7 j0 J7 \. v: y& \5 W/ _ - * 获取唯一数据
% A5 B! s. R# A% @) @, e - * @param $table
: e9 j- d* `. K - * @param $key
' _9 t2 q6 D$ Z+ z' ]/ ? - * @return array9 G0 _. e8 N0 o G5 R4 M/ N
- */
1 F9 a1 i( N, U, N# A - public function distinctData($table, $key, $query = array()) {
7 y3 L5 D' M+ ^ - if (!empty($query)) {
! Q2 D! d- C4 W1 Z) Y& t9 k1 e; T7 u) B - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
: A: W! G: F; W# s+ L& v& M - } else {
3 }- o" \- d9 N. ]3 v- H. |$ k - $where = array('distinct' => $table, 'key' => $key);
1 M7 L( O, t1 v - }# K2 B4 P: j9 C" {8 Z; V* }
- $data = $this->database->command($where);2 ]/ Q8 m9 Y" H P
- return $data['values'];
. {2 @5 v" H8 W F* J - }, {- n! p( U: |! R) p# W
- }
! H' K4 O$ \5 J" ] - ?>
复制代码
# W+ g, n _' u8 e' S" Z* \! ?& K7 C3 w9 L( k: U; {
|