本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
! @2 n. L b! |模式自由。- }4 j5 j. i6 E# H- r, P
支持动态查询。
3 i/ Y( F, ~% @& e- y支持完全索引,包含内部对象。+ p5 Z3 s- f* W
支持查询。' A7 X8 {8 r1 X6 z
支持复制和故障恢复。
' c& G) O- ~0 K; ?9 p7 d使用高效的二进制数据存储,包括大型对象(如视频等)。& ^; b; X8 J: t9 F! s( @0 B `
自动处理碎片,以支持云计算层次的扩展性
, Y1 a2 s6 P5 t) R0 v支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。, v# R( A3 }" R, |: k9 m3 {/ T# f
文件存储格式为BSON(一种JSON的扩展)
+ e% k/ j% }, r$ e% ^# p( 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数据库的数据库操作类源码如下,仅供参考。 - <?php8 I2 K) x2 k0 ?8 ~9 k
- /**
. d, P0 u; S: @! t$ B7 y' N - * PHP操作mongodb数据库操作类- ?4 @( Y9 s q2 Z7 e
- */; s+ D `6 I7 D
- class Database {. L) k S T. R8 Y3 S
- protected $database = '';+ e, m( ^4 j4 f) Z7 ?. A0 I8 n+ d
- protected $mo;
9 W& B5 q [. G+ m - /**
# a e( c- N- L - * 构造方法
* }! Y0 D: k6 t! h" L3 ^ - */
2 ~" C* `+ k/ G4 {# o P) k - public function __construct() {
! G0 i; E2 C- d$ D( E. ]; Q - $server = DBSERVER;1 B1 C* j0 ?! _$ {
- $user = DBUSER;, y: z) r8 @+ ?" P: r* d( q
- $password = DBPASS;8 p* ?/ M* K) J2 Q- Q8 x
- $port = DBPORT;+ ]* {8 J$ ]! W. x4 b( t ?
- $database = DBNAME;0 W9 }" D& Y& D2 n; O
- $mongo = $this->getInstance($server, $user, $password, $port);
& y. Z: m: ?6 Q1 C - $this->database = $mongo->$database;
/ n9 y* N0 a- {. Q3 x6 y# X' y - }9 A# X, S8 J$ H9 h3 k
- /**2 l% ^' W" z% z# B2 l0 U
- * 数据库单例方法, U9 J7 L# h+ b3 M& `5 D) N
- * @param $server1 w' m5 J6 I7 q6 s+ P, ~9 t& O
- * @param $user' R' P6 {1 s1 h* b
- * @param $password
. C8 T7 C/ ]5 y - * @param $port5 C+ P; G: J$ ~
- * @return Mongo
) s8 E7 ? w9 W/ J! Y) @( d0 m# F, t - */: Q8 T7 a7 `* Y* J& w! s
- public function getInstance($server, $user, $password, $port) { W# c' r/ E. u0 S
- if (isset($this->mo)) {
) {# D; V0 U) |! h - return $this->mo;
4 K- a' D8 r' v9 \, f' A7 e - } else {& @. R2 u" {, S3 u- O8 Y+ Z
- if (!empty($server)) {
' ?5 i9 X9 E3 ]" l$ c2 o6 {+ V - if (!empty($port)) {
, U7 a$ Y. O0 p0 T" {$ O1 E - if (!empty($user) && !empty($password)) {) q/ m3 P, `' n5 C* n6 v
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");1 e9 f: m0 T/ T) ?! d
- } else {6 G, D7 c: u1 Y! l ~8 \ C
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
! x7 P( O; Q# J, n, ~' S - }! }7 J9 [& [2 N% Z0 f% Z( P3 }
- } else {5 t% A# u: t0 u( X1 }' I2 ?
- $this->mo = new Mongo("mongodb://{$server}");
& O; {3 k+ O7 j Q8 G2 q7 s! l - }/ v. n# u8 Z! S8 ^( I m
- } else {, w% J3 r% F- W8 C0 j
- $this->mo = new Mongo();
0 A r1 v- u, Z( Z; i$ q2 u! y7 E - }! j! }8 T' ~* U* }4 P7 N& m
- return $this->mo;
- ?# n; B6 i# A6 E- ]. |8 C - }
- k- e) a/ x8 u, _+ b# R( D, K - }
) i6 q' i5 I+ N! d - /**
/ |. K6 Y; r- J$ r! T - * 查询表中所有数据8 W; i t7 T6 q& M4 a
- * @param $table- f% e: P9 }5 z7 ~
- * @param array $where
1 O( f5 T* C/ N6 P, }# q+ ~ - * @param array $sort' r- Z3 {" Q0 p' \+ w1 |! d
- * @param string $limit
3 ?; N+ w) j4 e$ w, l* p9 x - * @param string $skip6 ?. J1 e P- j z
- * @return array|int* s, m9 p& d$ B: [
- */8 i. h* S0 ]( @- B- j- o8 b
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {; H l% h9 c1 g
- if (!empty($where)) {
/ o4 m* A1 R' N3 Y2 w6 t - $data = $this->database->$table->find($where);
. T: ]1 N8 }- d; [3 M - } else {& P7 |/ z2 O: i/ N' V @$ {; g
- $data = $this->database->$table->find();
- ?3 h2 n I. M7 x* H- `8 ?4 N - }2 }& k- c" g2 t8 J1 r+ w
- if (!empty($sort)) {
/ ^/ G% F: l1 g9 e4 O h& _2 V! D - $data = $data->sort($sort);9 @6 C3 _# X W4 v
- }" a4 A4 V. k! v) D
- if (!empty($limit)) {
& k; t5 X) a# F0 T( G$ j5 H8 B! P - $data = $data->limit($limit);) ^8 y/ X: E+ ?1 P7 D3 e
- }9 }4 r; Q2 {9 x/ Q
- if (!empty($skip)) {* L F9 w6 \2 M& G( D
- $data = $data->skip($skip);7 U- B( m) A+ G+ p' \! A( H
- }: |( \, S w0 P1 u% m$ _9 D6 e) h
- $newData = array();
# d# w1 q. I, \0 |, [ - while ($data->hasNext()) {. H5 e8 e/ {+ i% w9 C& l
- $newData[] = $data->getNext();
% f- b9 l. e1 _- K - }- L% L% P# g" X+ n$ @. C6 }0 F8 c
- if (count($newData) == 0) {
9 O) p2 }' t- O" A0 _* ]) D - return 0;
+ I0 i' r7 {: ~3 y! k - }
+ ]2 f4 t" W: D- k$ W - return $newData;
: i' [# a! h0 B7 D - }
# X5 P8 }8 E: n& Z7 Y! p0 A - /**/ M" E7 t+ L6 l' k1 F& S& D
- * 查询指定一条数据, m% K! B& c! `1 ?
- * @param $table3 I& |* Z4 U8 N0 S
- * @param array $where/ N0 x2 n8 \; U4 R! y
- * @return int
& u0 |$ M9 M6 y: N% A( [1 o - */. r" Q q% X" |" Y/ J
- public function getOne($table, $where = array()) {
/ x6 h: M& H, U( L - if (!empty($where)) {
3 i2 t2 O) v% }3 h+ _ - $data = $this->database->$table->findOne($where);) O- y0 X' p4 X; R1 f% u
- } else {! h: N8 i' a) d% {! y4 i
- $data = $this->database->$table->findOne();
& `# `8 |) b, x - }0 W4 P9 T* R& {. g) q3 }: M% `2 {3 o7 G
- return $data;4 g7 O; r% ?" e* y4 v9 K1 j1 R
- }5 D1 a3 S8 y4 v; A3 [
- /**
/ A) c! D) S. Z - * 统计个数2 N @+ G% ]8 L6 ?' `9 f7 K
- * @param $table) p& S: u7 U$ u1 N
- * @param array $where
+ x# j+ q2 I! c( w" O8 v - * @return mixed8 S) v3 ~% [ R2 M1 N
- */3 [8 ^: h2 ^6 N7 y9 }2 X3 [
- public function getCount($table, $where = array()) {6 _* G. h0 v- O' C( J7 @9 I
- if (!empty($where)) {, n6 @/ M1 _, i( ]9 p% D( |) v V
- $data = $this->database->$table->find($where)->count();
- }1 y0 }8 K. C0 E - } else {1 s$ ?2 V: H/ s1 j1 e2 ]
- $data = $this->database->$table->find()->count();# Z9 D7 t( y9 ^8 g8 K8 f
- }) m" e8 B; ?7 t- i3 x9 t* H
- return $data;
0 A& m2 Q3 O- L! S& ? - }
3 k. X2 W' v) Y. M- _0 P' S - /**$ }! w, I; k' j! {. L
- * 直接执行mongo命令
' b0 h$ g, v+ @3 J+ G - * @param $sql1 p( s9 g9 ~$ E+ @1 O( Q! P
- * @return array/ p, x Q3 q8 P* C
- */ G w- v. v! s+ t/ b8 u
- public function toExcute($sql) {- F, ?' u7 O3 ~7 b( @ W9 Z
- $result = $this->database->execute($sql);9 [+ d5 @. O! e# K) a
- return $result;& X7 ~2 h. i- ~
- }
/ Y* o! x6 u8 F6 r - /**9 J7 s9 D& J4 J! _
- * 分组统计个数2 j( j V1 N2 N5 K
- * @param $table- O) `" D) G+ A! x* P
- * @param $where
4 f* |$ `+ y" w' x% Y) Z - * @param $field
8 r3 G( R, G) Q+ r0 k - */+ c" I" C* [! \7 C8 ^8 J
- public function groupCount($table, $where, $field) {( n" ^: s4 }# I0 F& b# F9 b+ n; R
- $cond = array() s% u$ D- M5 ]3 \
- array(" O9 u! l% H* C7 I5 n5 o& r
- '$match' => $where,* M K; c. c. |4 e+ o9 W
- ),
0 b. j5 d% K# |1 y - array(! @/ {" B9 i' d# o A) ]" }/ H! g' n
- '$group' => array(- }( K [7 ?+ t& i3 {
- '_id' => '5 H0 l* q/ z) I! ~1 e+ j& B
: X' D, j# A# N5 |8 d- d, ^5 M7 O& f- . $field,2 P3 f" q, ?* d9 ]9 U+ S- R" F/ i8 q
- 'count' => array('$sum' => 1),
u9 w5 E5 a$ n% z5 E$ g1 X/ F - ),
6 D9 I8 b# C7 h T; X, x; U - ), g9 D5 e/ y1 l9 a' H
- array(1 o1 G. a& C) ^6 `# @. G ~* O8 ?4 I
- '$sort' => array("count" => -1),
: a2 t7 t, @1 Z# [" r( a - ),
) |' r& ?3 ?( D$ i - );. P2 g6 G. Z* X6 f8 `
- $this->database->$table->aggregate($cond);
]& L9 G2 g2 L2 p+ j) r - }7 X4 f8 ~- a& U/ K+ x4 p
- /**
& g( e: x* I2 y$ a( x! a$ m - * 删除数据
# t, Q' v$ [2 r7 K/ b: D5 d6 d - * @param $table
2 L7 K' Z! L- ~$ f4 ^3 K - * @param $where* i& {0 a- s( T" I
- * @return array|bool: q( d- @( C9 o# G( ?
- */' N" y! @# E9 J% U
- public function toDelete($table, $where) {: f2 H) }1 U2 H& `$ z; }# L2 @
- $re = $this->database->$table->remove($where);9 }: t& R4 B% m) R
- return $re;0 g1 {' ?( U: V
- }
2 r/ C& V6 t: T0 @& u - /**
! a9 L; z5 w7 r% X' L7 X9 p - * 插入数据
. n; v2 p# p( r8 c% g, S) Q* n - * @param $table$ a* a! q. v/ _/ N6 W3 M, S7 t
- * @param $data, e/ t3 Q" O/ m
- * @return array|bool
4 R+ X: k2 }6 D7 k9 V - */, R& z' B, h" D6 R$ ]6 N1 v
- public function toInsert($table, $data) {
( g0 ~) \. E- s* X% [( D7 C8 U0 L - $re = $this->database->$table->insert($data);' B/ }. w% I. X) l4 O
- return $re;
0 I$ S6 R; x4 q. M. e4 f' k w/ I - }
n1 G4 g' J6 s' I7 S - /**
2 j3 [; `& U$ F7 z' P: s - * 更新数据
1 x7 f' b1 C0 J+ [! A - * @param $table
4 f# i$ `! T; x5 t - * @param $where& h' E0 _- B2 v6 b) F; B$ b `, P' e
- * @param $data0 F" M: L1 ^" g# {' h6 e! b3 B/ q
- * @return bool' n: f' q8 A- j- ~- z* V
- */8 R+ \9 d8 j; M/ b5 B; K7 j8 l0 L3 d
- public function toUpdate($table, $where, $data) {8 \# ^" L+ U1 d
- $re = $this->database->$table->update($where, array('$set' => $data));# ^: k! u- J2 C- @1 V
- return $re;
! _, j g; @# N% I7 \ - }
; |) ]4 n8 ~' d" y2 i - /**
8 _/ U9 P8 r: B. e - * 获取唯一数据/ y! M c& u( |5 s% s q, p0 r
- * @param $table+ o$ ^9 p( G8 M+ Q M# E$ F
- * @param $key1 m7 b m+ R+ X* w% Y. v
- * @return array [( L; {+ {5 _: b& {! a! {3 p
- */
* J' O$ P4 [( I - public function distinctData($table, $key, $query = array()) {
: ^( n& T- l$ \8 [+ H - if (!empty($query)) {
9 ?7 p4 h; C+ n8 n- d$ H. y% h - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
/ W! v7 w5 @2 c- f9 y: l# V( z1 i2 X - } else {
3 J( s+ c4 {1 K3 K* X2 W$ r' ]. X - $where = array('distinct' => $table, 'key' => $key);
4 p$ ?) X# _$ t e - }
- M# ]# M" M" e) V - $data = $this->database->command($where);
, A" R# ^6 T2 J b7 H& { - return $data['values'];
3 h2 i( J/ Q3 Z4 E, w4 s/ V - }( p. W8 W! j4 f
- }* n5 M# h. \& x
- ?>
复制代码
8 g: T/ ?8 d& W% H. A! g# Z
" q4 c8 l# g" u( r4 F |