本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
& j9 ^8 @# P, J! k( m* B$ t模式自由。9 H& l* @- g0 v
支持动态查询。
7 P F; _, P1 k支持完全索引,包含内部对象。
6 ?6 b4 j' {! q* d9 }% R, ]3 ^支持查询。
4 w1 ?1 c* z. `4 h/ O. X支持复制和故障恢复。
- r) K% x- N; K5 {+ n- F# u* `使用高效的二进制数据存储,包括大型对象(如视频等)。
3 H' f' i6 O' a, c& d自动处理碎片,以支持云计算层次的扩展性* m+ w- }9 a, h1 y! j# O" t3 S" H; V
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。( w6 T; `$ D8 T% J: f
文件存储格式为BSON(一种JSON的扩展)
5 D9 Y9 K0 c c% z可通过网络访问 所谓“面向集合”(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& D3 L. {% X- [3 Z# ?! r5 s
- /**+ m: ~* N' H; _7 j
- * PHP操作mongodb数据库操作类
6 a" q0 e# [+ X% }! J - */
/ p, U0 g5 T* \+ C+ n: ] - class Database {
8 Z, v/ T. T/ }( k- l - protected $database = '';
2 y) Q! U. c$ f) ~, ?$ U - protected $mo;
+ X5 l3 M$ z! `4 i - /**
* v9 r0 J5 a4 l$ y" n3 v - * 构造方法
4 T7 ]/ I) R3 b, j7 u1 [! X - */
& l7 h: V( c( @2 D - public function __construct() {
! b" u6 p" p% _ - $server = DBSERVER;
8 N( V9 u4 Q3 P" r, z! ] - $user = DBUSER;
0 _* g, `, m, D2 a; K+ \5 u - $password = DBPASS;6 S6 |% G8 y5 J2 ^! r/ x4 u
- $port = DBPORT;* q& i4 t, R$ A* x+ D, A2 h* r) u
- $database = DBNAME;
0 ~$ h2 v# M+ z: x - $mongo = $this->getInstance($server, $user, $password, $port);) u: |/ n) I: u# c( x" Q
- $this->database = $mongo->$database;1 K: U2 c: x) A) L# v. @
- }
( C- W! h! R0 Z* P2 i* w - /**
7 L" {6 {1 @) v - * 数据库单例方法/ {6 g* Z- E9 c+ H( c2 `! U
- * @param $server g( ~/ ?7 k0 v
- * @param $user
. d! I6 [: {$ j$ h# d9 `7 o3 s - * @param $password4 m2 J. e; _+ H# M! w
- * @param $port8 o9 J3 I: j1 r* ^3 j6 f
- * @return Mongo
9 @: O9 W6 }' N+ }& _# _2 D) T - */: ?* P) `: I+ ~ w
- public function getInstance($server, $user, $password, $port) {$ ^' M' x# B7 E
- if (isset($this->mo)) {2 K8 D" F* c, j4 M/ A
- return $this->mo;
) s2 [% E3 d x) q: H0 ]0 p - } else {
2 {* x# p. [ y. b - if (!empty($server)) {
; W% W; \! K1 A" C6 Z: Q - if (!empty($port)) {+ O0 ` N/ B! f4 S" g
- if (!empty($user) && !empty($password)) {3 Y, Z( K i* S1 ^3 H5 E# S
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
' s5 m# {$ a- M+ x8 j- l - } else {
2 v0 C Y% p+ |% s3 Y, F - $this->mo = new Mongo("mongodb://{$server}:{$port}");/ A* `2 s! t3 D
- }
0 ^$ x3 d# V+ d$ Z* T - } else {
+ N- `/ u4 R3 R9 \5 q) O# @6 S# m - $this->mo = new Mongo("mongodb://{$server}");: i9 Y' {; b, j( A& ?1 F- P2 W
- }7 d$ \" t. _& q6 I# V
- } else {
9 S2 }" }6 R. Q% d- Y T - $this->mo = new Mongo();
( G/ o( o" F! |* Q% r - }
8 `! |0 O9 t8 j: C. \- i - return $this->mo;8 d, X5 P' N' B0 ` ]& R! s
- }, J5 h6 z" o& F$ W$ `3 X; Q
- }7 h) s) W }4 b4 \( G3 U4 i
- /**
; o/ e1 V9 |& l - * 查询表中所有数据
2 w! m/ h: x* r* p6 l9 _8 v; l - * @param $table% q4 a2 m' T6 s
- * @param array $where- Q, e2 @: C9 ~9 V+ I
- * @param array $sort$ { n/ ]: |' L) a$ |6 a( q
- * @param string $limit6 b& _2 p- s( {' W5 \
- * @param string $skip
/ N% [5 s6 [( G" E8 i - * @return array|int' a' J0 W9 C) a9 T5 i- g2 a5 y
- */
( O, X2 y# l$ V* ^# y& M9 n - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {# F. h/ c2 Q1 m0 l0 N
- if (!empty($where)) {
_: r( J' L. v$ n - $data = $this->database->$table->find($where);5 t2 X5 K" }, X+ N8 k5 y, O6 H
- } else {
8 q# _) W" V2 ~# ?* K1 A - $data = $this->database->$table->find();5 z1 d" f& |& G9 m
- }
" ~* C1 Y+ v- T2 {9 w$ | - if (!empty($sort)) {
8 r2 z2 S" \) C/ _ - $data = $data->sort($sort);5 p$ J5 Z. _) v$ ?
- }3 w; N! p8 T# \( U C
- if (!empty($limit)) {: x7 m" \# L8 e0 @( a% p% U
- $data = $data->limit($limit);
) [5 |2 B* ]) ^7 u* @6 b+ p( v - }5 o0 w7 U( J4 I
- if (!empty($skip)) {& Z- ]% D' K2 |2 V& \# Z' U! X7 K, |
- $data = $data->skip($skip);
E- @' F6 Y9 F! w3 O# z - }1 w4 S: r% ?8 ?( g* y( S
- $newData = array();( r7 J$ y5 _6 z- q
- while ($data->hasNext()) {
# `# p' f0 \: j# V - $newData[] = $data->getNext();6 b9 y; ?- d7 J& ^8 x
- }2 E5 j6 J8 ~: o/ R8 b
- if (count($newData) == 0) {
/ f9 X! i; d, c& a4 P8 t+ c* X - return 0;5 ^) i' s$ [% U/ K/ ?, e q" @
- }* s8 i2 m) X+ s: A
- return $newData;% @% n" ^" I- \3 X
- }
1 a N8 D8 }5 k3 Q, i: v - /**! B( f) o' }, d
- * 查询指定一条数据
" a6 h, _' ?3 j$ j! k - * @param $table
' a2 ^3 _1 v/ H* {7 B) X - * @param array $where
+ ^7 ~* j2 d! ?" u: y7 } - * @return int
7 _2 t5 F1 P# Q2 f: t. V - */
% t0 [$ W% U6 T - public function getOne($table, $where = array()) {
; d! E# N: R Z- J( w2 o - if (!empty($where)) {
5 ?9 ~) |! R3 _8 e - $data = $this->database->$table->findOne($where);& }! Z0 J8 Q% q4 U H; @# ?
- } else {
% w( L5 ~$ `. Q* `9 A7 ^4 w5 I - $data = $this->database->$table->findOne();
( \- ` K2 I9 b1 S! P - }
2 y! v2 \6 e. b$ L/ h6 `- J - return $data;8 V% o- O* X% B. ]. c9 @
- }
5 t; r1 W6 {; e# f6 ]( f - /**
# N- z+ S; V7 u4 I) ^ - * 统计个数0 R7 {8 [& Z( }; b
- * @param $table2 y7 L% q) D; M$ `/ x) o. z
- * @param array $where
3 ^! l! t+ l& H1 J - * @return mixed
, P9 V2 P8 T4 ? - */' F5 e6 I0 w7 P4 @* k* N! ]
- public function getCount($table, $where = array()) {$ _$ y/ |' o* {. G/ J
- if (!empty($where)) { [" Y9 w1 b, Y! P
- $data = $this->database->$table->find($where)->count();+ @3 w0 Z' i1 ?" _
- } else {
7 o5 E" C" f9 U7 C8 _( U/ T - $data = $this->database->$table->find()->count();
( D& |7 n/ y7 H9 [ - }+ Q3 y% T- e# C: E
- return $data;' \0 H7 Q" F$ m* i/ b
- }9 w8 x/ ]. U7 S, G* p
- /**6 Y- |) c# ]% N! C1 V2 Y @
- * 直接执行mongo命令
g, L( F) h$ K6 s% x$ v - * @param $sql
; G A: M# }9 N$ A% v& T - * @return array: e* t% m& d. @) ]: f N
- */* G) J h5 S9 D a2 y, X, H0 n
- public function toExcute($sql) {
5 l. |6 k6 B; o5 g& K0 C7 q - $result = $this->database->execute($sql);0 h [1 ^" S0 _! B
- return $result;
7 S6 H- [3 S, q. y% o& V - }$ s5 E7 F1 T1 k- m: L7 g% l' e4 y: o
- /**
: Q* `2 c) |. y( K G" G, P - * 分组统计个数0 T0 k! h8 t& w; T' y Q! \6 O' [
- * @param $table! O$ ?( x0 h1 C
- * @param $where
3 f% U# r4 {6 V) j$ L - * @param $field8 E5 m0 k' x% j8 W- E
- */
4 F9 p! k( u* ?+ {2 V+ n$ X8 y - public function groupCount($table, $where, $field) {
7 S) y$ J9 i) w: {8 v a- h' r - $cond = array(
' w) w) u; x1 F6 k: J# v( K - array(% t7 @) b. \) b' E# S
- '$match' => $where,
9 v: X1 B; N ?3 f3 w7 G3 } - ),
. ~0 H6 r7 a% u" s9 T) O - array(
+ ^& S3 b& q$ H0 q/ X/ ~' d- ^7 | - '$group' => array(; R9 G, Q8 D; q+ X9 O
- '_id' => '
$ k2 h( u/ ~ k. m
* ~. {4 \8 X* o# V. l3 @- . $field,
, a0 W r4 p. V - 'count' => array('$sum' => 1),
+ ]# M7 u" I- H$ w9 n$ A - ),% ]$ ?: G, E" Y/ y1 _+ a7 t/ v
- ),' p: S" Q3 G/ H. u) o
- array(3 J! n4 i) R& u9 W7 N/ b) C7 g$ a
- '$sort' => array("count" => -1),
" X5 E( b _* s9 x7 r - ),5 r# ^2 w( r8 H1 Z: j* C9 C
- );$ i" N' S, a0 ?2 z
- $this->database->$table->aggregate($cond);
! v4 Q4 r* m$ v9 f/ \2 a - }
& H+ [+ y' H; S9 t) K1 } - /**
) \5 D. v7 [; x4 B - * 删除数据* {0 i/ ~" v5 I4 ?; _
- * @param $table5 d) u9 j- s% D
- * @param $where
2 Z3 S2 ? e$ I* v" T5 y - * @return array|bool
# {2 ?( p' n# m) K5 s - */
' J; I8 @% u) D2 O - public function toDelete($table, $where) {
4 C# [" J0 J5 G4 a# e- M) [' b1 B - $re = $this->database->$table->remove($where);1 i7 }5 o8 \3 h1 [, l( O
- return $re;# A9 k* {; k% v4 o! f4 r
- }6 u) K! ]7 v% |' `
- /**. L a, c; L- c
- * 插入数据& p5 d2 I1 p' d# m- y5 n
- * @param $table' Q% ^9 C0 p* ^+ y; b
- * @param $data
% X4 X* p3 i# ?! { - * @return array|bool9 r* v7 Z, h5 Z* j* ~ f7 b9 t
- */; ?, V6 p8 l- m- x( p$ {6 K
- public function toInsert($table, $data) {
% [ D7 O: w* J9 W+ @ ~2 r3 |' Y - $re = $this->database->$table->insert($data);$ C' H9 J* a. I+ S! u9 R0 Q
- return $re;* \1 ]) K+ n5 F
- }
. @: k; J0 {6 ?9 o6 X, \ - /**) {2 x6 k; D. P1 `
- * 更新数据
: w: w$ \/ ]+ |$ Q6 L - * @param $table3 n; {3 g) }# v
- * @param $where9 H/ v! W, S f
- * @param $data
6 g6 g0 R4 o7 N - * @return bool
& H: |1 [, L9 {/ r9 v - */' B) {3 s6 L& v
- public function toUpdate($table, $where, $data) {" S1 I; L6 O% V! q; g/ ^" Y
- $re = $this->database->$table->update($where, array('$set' => $data));
8 l8 R, L* N9 `9 P0 |/ t - return $re;
) z* q1 Y1 f! m1 N* P - }
# w$ L3 H% [, _9 l3 f. K! s# ] - /**& g) X3 H6 g4 y+ Y
- * 获取唯一数据) W) S5 J8 o' h
- * @param $table, `$ ]9 Y1 p. K1 v9 b
- * @param $key
% f) @& e4 X, l, m - * @return array
- p2 p) }, Q, [$ L1 m9 A/ [ - */3 o7 j/ E" ^2 a# `9 K1 `. v8 {0 N$ U
- public function distinctData($table, $key, $query = array()) {1 ^% ~& E2 a" X- F& N
- if (!empty($query)) {; o3 m/ d! T; L: R4 h
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
# @$ [( s, j0 B! ^/ `) e0 K1 b - } else {
3 A' j E' A2 J2 G3 N - $where = array('distinct' => $table, 'key' => $key);
* u+ M% H- G6 k% o2 | - }
6 \) B1 z! N8 |2 k0 D: F - $data = $this->database->command($where);2 y n3 W4 x. n+ v* a9 S- n/ ]
- return $data['values'];
, J6 g* [' v' ] z1 u8 e' | - }
. H/ g& D/ l6 ?0 h; b/ g - }/ c9 C( z8 h# r" W1 X6 l; k" Z4 r
- ?>
复制代码
- B& R- Y' x, x" E- I9 O3 Y$ m
3 E# t! I! s& D0 w7 u5 [ |