本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
k _5 m9 P" \& Q- r7 k+ E8 E模式自由。; j( b& ~3 M+ A" T% w8 H J
支持动态查询。6 K+ L, \* D4 C$ r0 L4 S s
支持完全索引,包含内部对象。
+ {' j) G s( K# H7 ^支持查询。
6 c5 r* f x. C6 v" F0 e' M支持复制和故障恢复。( }2 j/ _# k$ b- w
使用高效的二进制数据存储,包括大型对象(如视频等)。
# b' R4 ?8 D# h自动处理碎片,以支持云计算层次的扩展性" ^7 a$ W' l" L. l9 c$ h
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ l7 Y8 L) G, i0 n1 W) w6 J/ P, c文件存储格式为BSON(一种JSON的扩展)% g$ K* Z+ u6 f7 \% X3 S
可通过网络访问 所谓“面向集合”(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
. D; r9 ?8 ?3 [8 o3 O' ]% o - /**
$ L+ M8 z9 @( ~# L/ S - * PHP操作mongodb数据库操作类, X$ _8 M3 k0 Y% s* A# w, D7 k( K
- */
9 \' ~9 y, J- n( z5 | - class Database {
1 z. n6 R$ g; P6 `. L" ? - protected $database = '';( I1 f" m- `% ^! r
- protected $mo;
4 u7 @+ n6 K) ?, ?+ q P+ y - /**
' e H8 S r3 t0 f8 a - * 构造方法
/ z5 ?( X8 |1 n! Y; j5 ~- Q - */
0 @+ }7 Q9 i) d - public function __construct() {+ Z! |& E, R9 |! ?# h C
- $server = DBSERVER;
1 j7 N: f2 D$ ` - $user = DBUSER;
" M) f& x c( q9 z3 n- E% C - $password = DBPASS;: G; ` Z, [: m1 v
- $port = DBPORT;* U6 J' z) ^, l8 m2 X6 @0 t
- $database = DBNAME;- T0 W3 Q# w; s/ J% L5 v
- $mongo = $this->getInstance($server, $user, $password, $port);4 C: o3 F: }7 D, g1 [4 j
- $this->database = $mongo->$database;, x! }* O. x/ N5 E0 }' k- m
- }
) w# b0 c& m- r" A - /**
2 ]7 @% @! _; w( \* ]3 ? e9 N& y* o - * 数据库单例方法
, L3 v% t( G% }& a- m - * @param $server
8 q' L: i( h# Y - * @param $user
$ o; Z5 e% G0 d - * @param $password+ ?' u% n) Z: [9 e. c
- * @param $port/ l3 y% Z1 O5 `: l6 o+ U/ G
- * @return Mongo9 p1 x; l' `& ?6 b! e
- */
0 ^/ m: M; g8 E$ j - public function getInstance($server, $user, $password, $port) {
, c# i7 Y. k& \. @* Z# ^9 X5 y" [ - if (isset($this->mo)) {1 |) a @! b7 ?& U5 b
- return $this->mo;( i M9 W" k$ J, L
- } else {
- z! V( h0 o4 ]- J* k4 O - if (!empty($server)) {
h5 o& ~: m7 H7 {" o# a - if (!empty($port)) {+ B& } p2 G& q' c8 Q% S
- if (!empty($user) && !empty($password)) {
0 v% O) l: L0 F+ p0 @ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");; [0 N Z3 M! D* O3 B, V
- } else {
) J! b: e% e: G! O: E S6 q3 t! U - $this->mo = new Mongo("mongodb://{$server}:{$port}");" ^" V5 U5 ? h# j" g! F
- }4 _$ a2 I) k* z* }
- } else {: D* s& }6 C1 y6 c% B9 E2 f
- $this->mo = new Mongo("mongodb://{$server}");
" e# y/ K( R" j! N1 }9 q - }/ p; h% L7 U7 `
- } else {, w n; k. M6 G3 X+ }& W0 n: a
- $this->mo = new Mongo();9 J8 v# r# q1 N9 D* Q& L$ u9 V
- } I; w4 X a% _1 U( ^
- return $this->mo;
0 P; G( M' b8 X! ]& J - }
7 M+ l% Q: g' |) a - }
8 ~/ T) }. @5 i7 n$ I, |3 h4 G M - /**# @0 o. J7 r0 L, r. [
- * 查询表中所有数据
% q( ^- Q- z( u1 S; h - * @param $table
* T6 D& C) r& q8 A' [6 d. k - * @param array $where! N; g; ^ D+ D& n. |! u
- * @param array $sort
9 i9 O. `7 n" k" H8 {+ V- L - * @param string $limit9 u& h; i# J7 ?3 L! |7 A7 E% f
- * @param string $skip0 E# P' f t7 v5 g9 E, N
- * @return array|int; F( c9 ]! C+ Y) _ z! }7 G2 P* f
- */% A6 }9 r! w- T) C
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
/ ^0 x9 o# _0 R- H+ d$ T! T4 O - if (!empty($where)) {% H& p" m- J# u- M- d) N, Y
- $data = $this->database->$table->find($where);
: a9 i& D* d _. K y4 u - } else {% N& ?/ P& U( w6 o2 ^* u
- $data = $this->database->$table->find();
" m! s. x8 F* u. p - }! g' t% ~& B6 k+ K# w0 h' t9 W5 |
- if (!empty($sort)) {
$ r7 v2 s) i( G& s) W: Z) ]1 i - $data = $data->sort($sort);2 ^5 \$ m! q( T) k8 c/ J* u, w; o
- }
! Z3 v$ u e& |9 Y% Q - if (!empty($limit)) {* J# [3 H s. l5 p
- $data = $data->limit($limit);) D+ [6 I0 f) l' a* B! A, V
- }* Q% I# _8 C9 P; _3 {
- if (!empty($skip)) {& f3 V s7 z6 R$ {
- $data = $data->skip($skip);: x! O. b4 ?* {" ?1 U
- }
4 K3 o. L- n- y! N% | - $newData = array();
4 D* y/ V' G) \4 i' J - while ($data->hasNext()) {
: f5 {1 M: @# [" c$ f - $newData[] = $data->getNext();$ o" G/ X! [" p: U2 l+ C
- }
9 L2 F# T5 M6 ?& Y - if (count($newData) == 0) {
3 }0 i: [3 d+ v, y- M+ ?* r \ - return 0;% F$ X% N+ t" t& m9 Z
- }. p* \: U$ G! `" d. m
- return $newData;
+ T$ e( ?7 k! D9 z6 f- y - }
1 I2 M3 E# M/ b* a; o4 W4 M, I - /**
) `/ k6 m* r, C4 p- X% b - * 查询指定一条数据
; C! j% Q2 i# q0 Z7 M" q6 R - * @param $table$ G8 L, G* U8 t2 ~/ W: `# d; c
- * @param array $where
5 ^7 u3 {( G. i - * @return int* u7 z' @! v' W5 H" E1 U
- */
0 I" L' }6 p) l5 v - public function getOne($table, $where = array()) {/ F8 T# e/ h4 q* Z: y) }: x
- if (!empty($where)) {) o9 h/ {) T9 U4 C
- $data = $this->database->$table->findOne($where);
8 l0 P3 j: h& h, g - } else {; V) U. P; f# x0 J. q; V |8 {# i
- $data = $this->database->$table->findOne();8 ]; e I3 \1 Q1 e( ]4 f0 U4 b
- }5 f2 a' l# R1 |9 P& u+ ~& M6 t* A% W
- return $data;
) `7 H, s; W8 p( Z( n7 \1 ]3 { - }
# |" z; z9 \* N7 v: ~( D4 u) q - /**. ~& Z( o+ }/ n5 Y& |5 l
- * 统计个数
. _& K6 k W1 f+ r- A* f - * @param $table3 L* A O1 T4 n* i" o4 \
- * @param array $where* V4 w8 Q3 k5 I% |9 _( W/ M
- * @return mixed
/ L8 [, E( G; k; l% N+ d4 Q- D9 a0 n3 t) { - */+ P8 H7 F. r4 e8 W5 c. ?) x2 i
- public function getCount($table, $where = array()) {
% V% z( G1 H' T X# J+ o - if (!empty($where)) {
6 U o0 s+ t: y' `; O - $data = $this->database->$table->find($where)->count(); D. g& l9 ~5 ~% @- B
- } else {
1 n! v& ?; c5 j. W5 z* u+ K" \# Z - $data = $this->database->$table->find()->count();( Q( _) I7 \# \
- }3 n- K! _6 d# t
- return $data;. T; u1 d" Q+ I8 }' V, R
- }/ j" N$ v5 z# u: x( I9 I
- /** V. ~2 h& r! Z9 U" d, K3 }" y
- * 直接执行mongo命令1 t7 G5 |) k" f, d6 Z
- * @param $sql
. Z8 H+ Y" [* Z+ s+ e' P/ X$ H - * @return array
! r0 o% t* j' {7 e" V* T) h- H - */8 h/ v6 f$ a. f4 W, F" C
- public function toExcute($sql) {( r5 w' U) m [
- $result = $this->database->execute($sql);. j" Y% D# m* b9 G" v' L
- return $result;
: s1 Q, x7 n# k, k - }# f: E9 }' l: [3 U3 p" n* Y+ ?
- /**
& j+ h1 n: C3 h! J* w0 N - * 分组统计个数% W2 g Z" D v2 M4 V: [
- * @param $table3 p6 ^: y, C/ i! U% t, y* j( `
- * @param $where3 o! a: t- `! q4 S
- * @param $field9 l; S) Z8 u8 a8 L8 e
- */; J* {8 N9 q! S
- public function groupCount($table, $where, $field) {
8 W) R" i1 m8 E( v5 `6 b, P - $cond = array(# y5 Y) i) Y7 a4 r9 H, _
- array(# M; w$ @& {& L3 _( V& l6 u
- '$match' => $where,
5 v. u/ ]; l7 _1 O* Z" K: t - ),
, d9 K7 u/ q- p4 v - array(
, m9 m* I: V( m9 k3 Q3 l s: g - '$group' => array(
3 l- w& ?! J: }2 d - '_id' => '" x4 T3 q9 x1 T: {
# o1 q( ^" u; |- V1 t- . $field,
- g+ ?. W* \8 u' n1 F4 G0 u - 'count' => array('$sum' => 1),& c9 p& L3 X" D7 f: H+ E
- )," b0 Z$ z/ R" n, E6 U1 Q. E
- ),
( o( w: L: q) u( J' z) r; y5 |+ L9 ^" g - array(: ?: w5 r; R' Z- o1 l
- '$sort' => array("count" => -1),
5 _, j5 k6 e' I; J - ),
5 v% \2 v1 f' W% q8 z - );
0 a: Y" Y% {, s/ s! _ - $this->database->$table->aggregate($cond);
9 Y- G0 ^& o3 u3 I4 t' d - }. m# S' v, _: W1 n Y
- /**
* A% Z! H r2 `3 N- s+ F - * 删除数据+ ?! J1 R8 V4 J4 }5 v/ u7 b( S
- * @param $table; y* H/ }; p @8 o- f- o+ H
- * @param $where
9 q- }7 U/ |0 M1 ]9 k! } - * @return array|bool4 G3 y5 E) W0 a$ [0 G
- *// q0 G6 v1 @8 h* s, ]! ^7 d0 r
- public function toDelete($table, $where) {2 E/ O! j( c# o3 g
- $re = $this->database->$table->remove($where);
0 Q1 D, e" G& l - return $re;" D$ `3 e& I: W' G2 k' @
- }3 B1 R7 d. L% z0 ?
- /**- e$ D/ Q& }6 L# K! `! r
- * 插入数据
- n$ J4 j: K- y& R# r - * @param $table- B- o0 X M/ | F% t( u
- * @param $data( ` H2 h5 G4 w1 K
- * @return array|bool8 T( p% |0 j; E: n; K$ l
- */
. x0 e$ d' g5 n& a% ^. U d - public function toInsert($table, $data) {
+ B% a4 _* @% i! k/ o) ^8 Y - $re = $this->database->$table->insert($data);
6 |9 }1 ^+ z' g$ [4 N3 W3 g1 ~# R - return $re;
' z3 a: h1 {( ~# r0 S- l* d' v) f - }
" l4 q" s, n7 a1 ? - /**$ u$ ]2 C. I2 D5 c
- * 更新数据
0 \5 O! E! T% d" [ - * @param $table6 B! `' K1 P& j
- * @param $where
2 Z" l7 s5 }5 Y# u i" N* } - * @param $data
% r5 q7 s' g2 I8 V% ~ - * @return bool
* x3 ? l2 }2 f$ U; N8 D% I - */# X9 {- U! ^" Y, y4 }
- public function toUpdate($table, $where, $data) {
4 ]2 o* {8 l7 o: r3 R0 ]* _; i f - $re = $this->database->$table->update($where, array('$set' => $data));
! j) r0 z& o9 n. V# j8 C* Y - return $re;0 P1 C" x) \' G: s i+ t
- }0 F% f( R- f. |8 h, `) u& ?
- /**
0 D7 K9 P" v" {8 M - * 获取唯一数据) J5 q# i- B5 L
- * @param $table
: }6 z1 n! X( k% K/ t0 |$ ^; w! d - * @param $key
' S0 P- T2 h. u! Y$ y& _! Q ` - * @return array
; c( H. \: E' ]6 ^ u# C - */" f7 a' I; l6 _# M# L& o
- public function distinctData($table, $key, $query = array()) {
, g# O' i- P' O$ n - if (!empty($query)) {5 ~3 _; I0 i P3 `
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
' X) n# ~. ^+ o9 a - } else {
$ N" B8 G* T5 m. n/ K: t* n - $where = array('distinct' => $table, 'key' => $key);1 B( V( W- g, Z( C. Q
- }8 u! H: C6 q$ |6 k
- $data = $this->database->command($where);- g) X, U8 ?* i3 u: a4 o
- return $data['values'];4 c4 o |( F: {3 @( Q) [& P
- }
& p5 L0 n* h; e; a1 P - }
: y* W8 @$ o& f0 g( n - ?>
复制代码
3 a1 D$ t# z" R+ x1 m Y0 M
; U1 p- m9 l. M/ L3 e( O5 `3 N |