本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
( m7 g" B' R6 z0 l" X. n j模式自由。
/ T5 z; f- k% D3 N支持动态查询。0 r; O6 e/ x J( @# @ `
支持完全索引,包含内部对象。
) o) H2 c" C! w3 R支持查询。5 ~, L( G5 ^$ M+ o7 z0 C0 N' ^
支持复制和故障恢复。, }4 z& L( O6 T0 }6 U' U$ N+ Z
使用高效的二进制数据存储,包括大型对象(如视频等)。
9 D8 `1 A! @2 L6 M" {: X自动处理碎片,以支持云计算层次的扩展性
3 ^& f4 L& k! Y' \" ]( d支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
* Y! `! P! ?- m: m: Q' b/ \文件存储格式为BSON(一种JSON的扩展)
. b% p# i7 q: R4 C可通过网络访问 所谓“面向集合”(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
1 T3 x% q1 V V, f& u' I% g - /**) J7 c/ U# H+ V' _! W+ V
- * PHP操作mongodb数据库操作类# P5 o' j9 U' u4 U" b, u2 R, b
- */
9 X9 @+ A+ {7 [9 }8 M: ] - class Database {
3 j8 w) g" A( N8 S1 e - protected $database = '';
3 b2 x% _: B3 Y: e! D - protected $mo;
2 b: [! ?$ |: C+ W% x% R8 W - /**
/ f0 t h9 G* D F$ q - * 构造方法
9 M4 q9 i6 I7 A# w, H - */, i, q: E0 A7 x2 d, M
- public function __construct() {# X8 F5 x2 w: g, ]5 k" |1 J
- $server = DBSERVER;- i/ `/ d% U$ e- Y. |8 p6 T
- $user = DBUSER;
! I# A! ~; U* u* L7 y; w - $password = DBPASS;
4 }5 y, }7 |, h* L+ I3 e/ Y! h+ K - $port = DBPORT;
* L6 N* D4 y7 L7 | - $database = DBNAME;; d# i) d8 _4 R$ A% r+ q9 }
- $mongo = $this->getInstance($server, $user, $password, $port);" R `8 p3 U' P# f
- $this->database = $mongo->$database;
% A/ l, O6 A4 D# L - }
1 [+ @% n% {4 s4 a) [ - /**) p. m! k# Z' o
- * 数据库单例方法. I# _! H2 e" S4 a( w4 V/ I6 Z% J# U
- * @param $server
4 N0 i) n- T) e& z1 D }$ M ] - * @param $user
( J0 @/ N0 R% D; x3 o- \9 w+ w k - * @param $password
7 c0 j! x, V" `5 C - * @param $port, y3 I2 d/ P. U) b3 U
- * @return Mongo; r+ f* T. O! @; ]( b
- */2 B* I5 V, L5 X' y
- public function getInstance($server, $user, $password, $port) {8 o2 U, N+ y3 w8 ?" r" i& v
- if (isset($this->mo)) {: e0 @$ M6 M0 k, P( G6 h7 d) C# Y
- return $this->mo;
4 n) X% J5 }( K( e; ~+ A - } else {
! K# V; w& o, l5 c - if (!empty($server)) {! t2 I2 a3 T8 J3 o8 i* N
- if (!empty($port)) {
. U- G; E6 F: {) y. H - if (!empty($user) && !empty($password)) {
6 P1 C1 _% [, w1 u - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
* ?# P! R8 d1 t - } else {
1 q9 _2 h$ A C4 M! l - $this->mo = new Mongo("mongodb://{$server}:{$port}");* t9 _ n$ o4 t: I$ @+ m* Q( u( z. z
- }
! o6 E6 C/ l1 [9 @. X* y - } else {
& q/ t% q! \3 z3 K6 B" L( S - $this->mo = new Mongo("mongodb://{$server}");0 O2 L3 L# H6 e9 ?8 H* a m- @0 p; \" E
- }
- Y5 y; v/ q5 e9 T/ z- r5 U - } else {/ q6 t1 l5 H" f4 F
- $this->mo = new Mongo();
3 ?9 B4 B6 N' H% S8 k2 j% E R1 p8 U* N - }: }+ M' a0 Z$ `3 V+ ]" _, o& n
- return $this->mo;
. A& p/ v) Q5 L) S9 m - }
- j( z3 g4 M- l& |! W7 ? - }
W+ r: h9 j' w0 J% L, I - /**9 F4 y5 |' M* d3 P7 p+ ?& b
- * 查询表中所有数据: B0 Q2 G8 f7 H* I% ^( q
- * @param $table& d5 c$ U+ a+ n, \, o: k1 m1 V* U
- * @param array $where3 ?* E5 P/ d, h& L& D0 O" @0 ~! _" t
- * @param array $sort8 w, E. v; z) ~9 A
- * @param string $limit5 Y0 r- E- I5 V# P$ D$ D
- * @param string $skip5 a8 W, {, a" c
- * @return array|int6 X! z5 h$ l. r! ~
- */. E$ J' r5 ^# X3 d* ?, ]
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
9 T p {# O/ e1 W- R - if (!empty($where)) {
$ R* M( O. \, V8 s4 d# Z2 } - $data = $this->database->$table->find($where);$ ]. m8 U5 _' H
- } else {/ H' K- }0 ]8 [. V- Z/ p* k
- $data = $this->database->$table->find();
; O6 C$ T, ]: X" V7 V - }5 m% h0 M+ C6 L% O8 l: l B
- if (!empty($sort)) {
- H3 \5 U7 `# t2 f! J2 o8 c - $data = $data->sort($sort);& N9 z1 L2 m8 x: W$ i( ~1 p6 Q
- }1 O. z# J4 Z$ E- I
- if (!empty($limit)) {, i8 @6 V8 L( H7 ?
- $data = $data->limit($limit);
, S: X2 G+ @. e - }# B- Z( a+ F) S, J2 t
- if (!empty($skip)) {
6 _3 Q8 a$ _* `! G/ x! { O5 C$ c - $data = $data->skip($skip);
+ S5 f. Y5 x1 c3 N# h - }1 u$ R4 s3 i+ j7 R
- $newData = array();' y9 }& }3 l/ h0 N/ K, I' v
- while ($data->hasNext()) {) r/ {3 s$ m- k
- $newData[] = $data->getNext();( o% a$ h% u w) a ]
- }+ T6 T' v" J* I y
- if (count($newData) == 0) {
. F8 p2 O5 c9 u1 n4 b0 B - return 0;
/ J8 d J: T1 b/ R4 c9 K& v9 v - }
# [1 u+ B( K$ q) V2 {, W5 h - return $newData;
0 Z/ E1 j1 c6 f: [5 _ - }
/ s9 g+ N! g8 r( H" l: m& t) {) K% j* [ - /**2 W+ x2 u* p1 ^# J
- * 查询指定一条数据 h$ Y* o' D/ d8 r1 h9 u
- * @param $table( C! ]. [$ Q+ B- J0 b, _
- * @param array $where
! K9 ]* o7 d% k" ? - * @return int
- x. \3 ~4 W) R0 U5 D - */
1 Q- ^6 a- i! }4 Z. C1 G { - public function getOne($table, $where = array()) {
) G9 U) g7 H y6 i# |4 O5 `/ n - if (!empty($where)) {# e9 n( r+ E7 [+ _
- $data = $this->database->$table->findOne($where);
& Q( L3 J6 O* H3 ~ - } else {
6 W7 {9 S# t/ i' @$ U& g0 ~2 M - $data = $this->database->$table->findOne();
1 d! l5 } m4 Z, I4 M& N) x2 m# j: t - }! S, g6 w/ ?- H& N( I' K% H
- return $data;# h) w) r! s# }8 ~
- }! q/ A! z+ W1 V# T. h. ~7 u1 X
- /**
& G- u6 Q, v+ P2 f - * 统计个数; h0 \ O9 j' z8 [5 v0 g
- * @param $table
( g \& K2 Q/ ]9 n1 G# D- j - * @param array $where
9 }2 C& x, y3 [ - * @return mixed8 G5 W& w0 p5 [& F0 _6 O# \
- */
" Z' m% W$ {9 o6 F* E6 A - public function getCount($table, $where = array()) {
* H- H4 D& C0 j7 P8 m - if (!empty($where)) {
3 p! [3 H; Z0 C2 N" I1 g1 P - $data = $this->database->$table->find($where)->count();& u' c) W; N( @$ S& A i
- } else {
% i/ Y2 ?6 g& R6 m6 S2 z$ O - $data = $this->database->$table->find()->count();
$ V& Y$ H& P* [ - }
7 ^7 B6 y: t& g) O9 Y - return $data;
2 Z& o* U& u' o - }1 O1 _$ R/ D3 ~5 |
- /**# n' a4 C. C: c+ m3 {+ I
- * 直接执行mongo命令
k! p' O. M+ M - * @param $sql
: h" l- ]' |) H* `5 H# ~ - * @return array
+ W; R# Y3 J' J; X& j) m" N - */* _% k/ a9 ` x, [
- public function toExcute($sql) {
1 A, I2 X7 { v6 Y% i4 j _ - $result = $this->database->execute($sql);8 P$ U W! m2 j9 Q% f, H0 A& X4 Z( d
- return $result;
7 J( n, C9 [' H) v! f/ e) p - }- c; m3 u- \6 X0 \3 {+ Z4 p/ E
- /**
, w1 n& r! x( T c2 \. o - * 分组统计个数
* k- Y) z' Z9 c6 U' x# t - * @param $table
8 r8 K% _5 A9 } - * @param $where
; Q: D- Z5 `5 q4 { - * @param $field
' g- S0 I* T$ t/ ?9 Y - */% o& s5 w4 L2 S: Z2 Z! _' e
- public function groupCount($table, $where, $field) {
# D( T5 z ]" T% N% K - $cond = array(
8 s8 x4 f; u; |4 W+ L8 x - array(; S% M. v: G! S: N; p, @
- '$match' => $where,2 l1 H O: a' J. t: X# ]: x; {
- ),# W" r, g; n: u" W" M- Z9 f1 H" E2 J
- array(8 f4 r G4 D9 l# z% {% L
- '$group' => array(8 Y/ K2 z8 a% Y7 l ~2 @
- '_id' => '
. \# ?9 R) O. }" C+ f. w ~ - % r# j* ^# X- r' z! [
- . $field,& p7 y$ K) n/ G; }( d O
- 'count' => array('$sum' => 1),
& q! ]- G" k4 {/ v# H [ - ),
4 J# g- \% |$ m. M2 g& [ - ),
# ^9 d6 ~* C" l" s6 c, _ - array(
7 ^: H! D2 N5 L) [& m! g - '$sort' => array("count" => -1),
: A3 |% N9 y' \( a% `0 l6 W - ),9 I7 Z" Q8 m3 _& \
- );
' u. @1 F6 b8 L3 c( c. C& [4 ?, z* a, x - $this->database->$table->aggregate($cond);* a2 c% `' _ w: q
- } f+ B# x1 l" V2 K- t- R$ R* S
- /**' H" h$ [' [; G% Z, I4 \
- * 删除数据3 m7 n8 Y6 C1 |) g7 m
- * @param $table$ y; d. o' n% L" k" A) N3 P& H
- * @param $where& P9 u& t3 C( e5 j6 ^: h
- * @return array|bool
& C' A: M- H7 X2 ?+ u - */
* U) G1 T2 z( u7 s( X' O$ f - public function toDelete($table, $where) {$ |* V" }7 o+ @. m% B
- $re = $this->database->$table->remove($where);4 _* d0 N0 G& f* |+ }
- return $re;: g9 P+ X4 V: Q1 g4 f6 p
- }7 j% y+ V5 o3 V) c+ O7 F
- /**
2 N1 b }7 e, E, I( u) O4 G, N# E - * 插入数据 N9 d) J1 K# w$ {) O6 t5 k6 ?
- * @param $table
* S1 o4 `8 c& u4 d4 y - * @param $data
" K8 A- g6 _' e, l* w7 @ - * @return array|bool
. `' C( k: p; F) ~( [ - */, I5 D9 B2 _2 F6 f6 H( Y4 p
- public function toInsert($table, $data) {) E* e& U8 e( O! [6 c0 z
- $re = $this->database->$table->insert($data);5 \5 I; t2 J$ i) W! u% U
- return $re;6 C I- v( z+ ~( Z3 s
- }" }3 w$ |- I/ x2 F$ d% w6 a
- /**
# f6 Q- g# o! Z0 z6 Y - * 更新数据7 f; F. I8 M! a% h- V
- * @param $table/ h) K# a6 W! u! S- F1 Z
- * @param $where9 S9 u- j4 g' P' R& F! g
- * @param $data$ X0 o1 O) l6 B, [$ f
- * @return bool# F* X, {: E% o
- */( X' u0 l# P# f u) D
- public function toUpdate($table, $where, $data) {
. I2 Q9 X, }2 x4 y% c8 o% g" c - $re = $this->database->$table->update($where, array('$set' => $data));
! I5 |- q% V5 w - return $re;- H1 w& ]* H. }! ~$ t* P; Y+ m- y
- }3 M6 a6 `" G' b+ i1 y' b0 |- e" ]
- /**
& r. H0 I! |: T4 T$ N2 h - * 获取唯一数据
8 W" ]5 o0 J# }/ [) i2 M - * @param $table
: }) ~% F! @$ { - * @param $key
, S( K/ H3 N0 I# F9 b! b2 o - * @return array! i6 k! J4 i* w( G& v- u
- */
+ M+ l" b* m5 ]5 f, G8 O - public function distinctData($table, $key, $query = array()) {
1 p( H/ w" S2 g- G - if (!empty($query)) {
/ \7 n1 h( j5 D7 ]/ z5 H3 M - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);' q$ j, d9 c. h# B; A
- } else {
: |2 L2 ]; f: ^/ K# R - $where = array('distinct' => $table, 'key' => $key);/ ?. j* ^5 t) T/ \
- }
/ S1 u4 Q8 D C* i1 v# w - $data = $this->database->command($where);
! G1 t& [: _; `" } - return $data['values'];8 L5 D: r8 z5 G, O. _9 v' u! u
- }1 V: Q; `% n9 V! `# I: Z
- }
4 V6 o& }1 K: S. K T" J - ?>
复制代码 . \: o: o. i# r* _4 l3 k
8 f- b9 p8 O8 q+ [( m
|