本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
/ j8 R8 U7 K$ K' i( F/ b9 A模式自由。! }$ y; {* ?( B8 k- b
支持动态查询。
' F, n! t* |, S$ O1 ^! `5 t+ a支持完全索引,包含内部对象。
, h6 w% h, f2 F; t; U9 Q支持查询。* f3 L7 ]( L5 j: B) a
支持复制和故障恢复。
5 J1 P8 H4 H8 W9 P使用高效的二进制数据存储,包括大型对象(如视频等)。
0 H+ j1 P; s2 U自动处理碎片,以支持云计算层次的扩展性! j! O. |( f v- D* P' T
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。. F8 m2 L# c$ v$ \9 l% v
文件存储格式为BSON(一种JSON的扩展)+ S) x! _- }- x6 S3 }& t
可通过网络访问 所谓“面向集合”(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
) ?; X6 l- Z4 v$ F- s5 c: o' f - /**
" q) _6 f9 v K! P- `9 O - * PHP操作mongodb数据库操作类. y. j7 w: e/ a8 N8 z
- */5 q) E2 ]' p9 f4 b8 |* _
- class Database {
4 J# Y& `* D a% ]0 n3 i - protected $database = '';
* G- N) i+ [1 D6 ]. j - protected $mo;
" A5 P7 [; ^' o - /**
: L* d( O" ^( X: i7 y, U - * 构造方法
! s- U) K, d# j) d7 I! ~& O# T- ~9 D7 I - */9 N1 p+ B" x7 W/ v. c V
- public function __construct() {; H4 Q7 N" P1 r$ @9 e
- $server = DBSERVER;, T! w- f3 p% B3 [( j
- $user = DBUSER;# _3 B, N3 H7 [& b& Q( O
- $password = DBPASS;
, x' }& j5 L4 s& i0 ]( C - $port = DBPORT;
; c+ ?3 y/ W9 g$ |" P2 D - $database = DBNAME;
! i1 z* d7 e' F! C" k4 k7 M# b - $mongo = $this->getInstance($server, $user, $password, $port);
" I3 D, ~1 N x: }* \% u/ ~ - $this->database = $mongo->$database;
) \1 \9 G+ n' I - }
( C8 j# D, z/ B- i* O - /**4 o7 d5 ?% @: n/ k) |
- * 数据库单例方法4 N$ T5 b Y& N" e: U
- * @param $server
! U8 W4 Y5 N7 I/ t6 H+ w" ] - * @param $user
9 J5 ~7 u b, | - * @param $password) M0 _" U$ i2 U# Q/ M& O! b4 t6 I9 Z
- * @param $port
. a+ e# y0 u. B \ - * @return Mongo
& ]: S: `" e8 B0 u) `0 F) P" {1 c - */
& s+ x9 Y" r7 N3 x& S - public function getInstance($server, $user, $password, $port) {
, U ?% j* }0 _6 a# T+ r - if (isset($this->mo)) {$ s+ C1 j, S# n' u- m( r( ~: n1 _" a) j5 ~
- return $this->mo;
/ T, ~; s X$ E& p' }: K - } else {
! ^2 [1 b& ~# h/ B - if (!empty($server)) {3 H, q( r' s4 v! R
- if (!empty($port)) {6 B# m* y5 k; C5 g
- if (!empty($user) && !empty($password)) {
& o6 Q, l8 [( a2 ~ - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
& o2 U2 @/ X6 p f% l' \ - } else {
6 ?, H" ~ g# u, N0 [8 ] - $this->mo = new Mongo("mongodb://{$server}:{$port}");
+ q5 M2 l# W9 v6 W - }
' h8 p: V' l* Q2 T7 P. x9 R" V" s+ N - } else {
2 k* g# ]0 V: A! O/ K" r" ` - $this->mo = new Mongo("mongodb://{$server}");0 Q+ {; t. {( H8 i! y6 ^
- }" [* _, v; n) ]9 e' Z% W- V
- } else {7 C- u6 a7 w6 w2 I0 M% r0 n
- $this->mo = new Mongo();
) q. J- V8 o, g( V, o1 w% @1 W - }
" G- N& Q0 e! S& ~ - return $this->mo;+ W/ W2 d" [* D' o6 {; R/ d
- }0 \0 G+ ^/ H; D9 ] L7 |6 p
- }' P W! k* d# B3 ~: i
- /**
1 R y* T1 [+ p+ n# ?5 B - * 查询表中所有数据
) U/ Z; r* k. q, E! u - * @param $table
g% R" S9 [6 T; p - * @param array $where' a" b& [! R( K* [9 V; q& g0 n
- * @param array $sort( y* c0 [% ]7 ]" q, T) Y6 w- K7 p
- * @param string $limit, q3 P8 l1 Q, j$ }- P/ Q! M
- * @param string $skip2 u5 Z& A' V" e- x' g" ]/ N2 ^ \
- * @return array|int
: Z- g/ w2 y" F7 c - */. }$ Y% T8 i' n0 P: B: i3 y9 v: W
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {* U3 z9 {! q( ]; D: g' \. n, ?5 Q9 B
- if (!empty($where)) {
; T6 n0 Q7 E \* F3 i3 b/ d - $data = $this->database->$table->find($where);9 i3 W$ U! z+ X2 b; [, V
- } else {
; F0 T3 F A& j! N* A - $data = $this->database->$table->find();8 q3 L1 [0 |& u
- }
+ I9 F. A5 T" r8 z8 ~) X D - if (!empty($sort)) {) K9 p$ E0 B& P; f
- $data = $data->sort($sort);
0 d2 i, U/ x5 S9 A - }
: v0 g7 A) J8 a b3 Q! o - if (!empty($limit)) {0 o P) l' D, q. t9 j- J* F6 K, i
- $data = $data->limit($limit);7 G5 N! q: k( D6 J9 F- I$ N
- }
/ p2 [! g2 b8 Y: s" t - if (!empty($skip)) {; ~* P! u- ^* T+ Q" j( f
- $data = $data->skip($skip);
) L3 s, t" e. {, t - }: ?7 p0 X( R. d9 D7 \- r: y
- $newData = array();% J6 Q0 G5 G( L D
- while ($data->hasNext()) {
! O, ?' J( C+ c& n7 \& P - $newData[] = $data->getNext();
7 q. p+ {, \2 D4 S - }
5 O8 a5 o( j' Q- V5 o m8 H6 c - if (count($newData) == 0) {
! D, U2 P: J& u# H7 e# q K- I) [ - return 0; J$ o8 F0 q# J, j
- }5 }- p6 ~1 r1 I0 [
- return $newData;
) C$ ~ H6 Z4 J! X2 O+ h - }3 I7 A8 Y+ ^* R" u7 m9 o i
- /**
5 m0 g" M ^- y$ x7 N - * 查询指定一条数据
+ C2 f- D6 F' {0 k5 }& B2 f0 ? - * @param $table" t1 F4 l" q0 x3 i; V, @* F0 ~
- * @param array $where% z6 n! h; y0 N v8 V
- * @return int
/ N% T- t( ~, R& f( t! F4 a5 G - */& q- M) \7 _' o [0 b! Z
- public function getOne($table, $where = array()) {: c! G0 i% L O' ?, C% B
- if (!empty($where)) {
9 y% T+ T, L3 V( u7 h - $data = $this->database->$table->findOne($where);
! I/ J* u9 _+ P: {" n! _5 F - } else {1 K; o" P5 }; C
- $data = $this->database->$table->findOne();; H! i% H8 w6 g0 k' K: C% r# i% _
- }, P+ C! R& K" I: K: r3 [
- return $data;0 j% j9 C7 s: F" c
- }
! @3 P8 [9 ]* B* n - /**
/ u; g2 b% [5 \0 u - * 统计个数3 J" y& y- Q8 y: Z4 G2 P6 W ^
- * @param $table
& T& V% m$ a0 I3 {7 A/ u: g - * @param array $where) B9 [, Y0 Y! B; y X; @& Z/ A5 X3 K7 n
- * @return mixed
6 v: C5 L/ B' O - */6 c( [& N! b2 f& ~6 I# t$ ^
- public function getCount($table, $where = array()) {% p, A4 z) V# S, _
- if (!empty($where)) {) W5 u" Y! g( R, A0 x5 B
- $data = $this->database->$table->find($where)->count();0 c V% C1 X& L) X( \
- } else {
, T4 m. L" x% x3 L- b" ~. G) q w8 I0 @ - $data = $this->database->$table->find()->count();
: T8 g: Y# U' _' M: R! o - }
. o- G( V+ W% v - return $data;
+ K/ T, [( b; ^$ m1 j& ` - }7 \# ]! \: M1 q% [- N
- /**
+ @, |# j, g9 N }! M/ L& [( K: P - * 直接执行mongo命令
1 x" e* L, m7 d/ N' T# u( f) v - * @param $sql
: u! a1 `( `7 R - * @return array: d+ y8 W1 U& |9 D* i
- */
" ~+ b5 I( x! Y. d/ i - public function toExcute($sql) {8 ^* f3 T) ?7 F [
- $result = $this->database->execute($sql);
4 V# i. [1 C2 O6 H5 t+ x - return $result;
. ] [7 V" \! }8 J' t - }
; J$ S* O' j* E# y - /**1 C; y, p* _+ l$ U
- * 分组统计个数4 W/ K2 Z, C2 y2 t& c, `
- * @param $table% ]! v; v: Q: E" \
- * @param $where1 {; T V( V: Z- E. ?1 `- I
- * @param $field9 k, W! i+ q3 r/ f
- */4 Z, {$ l- r+ r I9 u% ?7 [
- public function groupCount($table, $where, $field) {
% m+ y* v* P- V4 H! o. p9 H, I - $cond = array(5 T0 A/ `( Y3 T' z
- array(( E5 q) U! a- p$ R6 U
- '$match' => $where,- |3 J0 M6 ~7 {9 X+ c! }, s
- ),
. g( h/ b ^5 Z1 | I - array(
. `0 i, }5 W5 A - '$group' => array(
4 k: N+ x+ d k) P - '_id' => '! G! V$ | C7 {
- 7 K- Y+ g3 d- A5 D0 J
- . $field,
/ u$ k# o, P0 \+ X - 'count' => array('$sum' => 1),( u+ a: n& g7 x) q- u: j7 c, r6 ]
- ), W! n1 O/ ]# X" b) o, p' p
- ),0 Q/ t d3 j5 y# X* ?9 t2 i) U
- array(3 c5 Z3 I# H# v- f/ A! S, R6 p
- '$sort' => array("count" => -1),+ ], \8 c' } f) n2 O1 p, N; p& k
- ),6 R J7 M7 u" E3 K+ X, f2 D+ A
- );
# K B! v2 \; M3 |. G. }& N - $this->database->$table->aggregate($cond);: Y5 i* s. ?) s r+ g
- }# W" o3 F7 H6 N7 |) R
- /**! V' p. r2 N% x. W! N$ q- q
- * 删除数据
5 O/ \3 M0 k, x2 O$ Y1 s - * @param $table. ?) p( l& G% r9 u, p* u
- * @param $where2 N6 i' f5 W- t7 ]: E6 ^# Q
- * @return array|bool
; u, c% ~% g: k+ X - */
$ ]9 I7 A9 F' ? - public function toDelete($table, $where) {
; A7 S6 O% D& U8 x! a9 q - $re = $this->database->$table->remove($where);# I. z( J) `# o! Z- V" `! i2 q
- return $re;2 i V: Q5 p3 Y6 Z% I& r7 v
- }4 B, |) X" z0 X$ c' j
- /**! I( c. y6 g- |' w! X% r- X
- * 插入数据
8 i/ G x3 ^. F - * @param $table
# h9 X9 n' V5 h( q - * @param $data
3 E# H# g2 m! p* ^: z - * @return array|bool+ ?( Z' Y5 j$ Z6 B$ z: V/ Z5 V
- */3 P% o. r9 N' o" b1 u
- public function toInsert($table, $data) {
6 p9 G. P# V5 x: N - $re = $this->database->$table->insert($data);9 \$ g* ] q4 O3 H. J9 c" I8 [5 C+ t
- return $re;9 q& Y* l4 u3 n/ N8 _+ |# e ^* n) P1 A
- }* T. I% b* ]$ X" r O6 j
- /**3 L3 T3 z! `, c$ E
- * 更新数据
! \. j% e* A" ]3 U' F7 r& E& O - * @param $table
5 {6 T% r! H7 q4 U- k: Z - * @param $where
/ t$ \" r5 f5 Y) N/ t - * @param $data+ N6 Q5 V3 @+ Q
- * @return bool
' Y& C" Z5 ?, F. c2 _' [& Q9 p4 ^3 Y - */# ]6 e% Y8 s9 |+ H2 M. w5 {0 Q
- public function toUpdate($table, $where, $data) {
" c$ B) O% z4 i5 t2 _8 x - $re = $this->database->$table->update($where, array('$set' => $data));
3 _$ }7 R. Q) k - return $re;4 n8 i' ?" ~2 j/ H
- }. ^, t7 w, m4 z2 ~. f0 g& S
- /**
$ z) l1 r4 o. Q" R( l% m - * 获取唯一数据
. j: c; Q0 S$ G! s* u" c: h" a) {) @ - * @param $table! [* s& D3 K% x2 B( L6 X
- * @param $key
, E- R5 V) i0 h# G6 z1 } - * @return array
7 u- P' ?2 x& N7 F; Y - */8 a1 b* i8 U7 A( G0 q, u$ |
- public function distinctData($table, $key, $query = array()) {
% b i2 P* @1 V: l3 y m - if (!empty($query)) {
0 Y# H/ x4 \, d( \2 @ - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
" d$ A ]7 z. L' l; u+ U - } else {
- U# W6 e1 Q5 ` B - $where = array('distinct' => $table, 'key' => $key);' q7 R% \- F2 T/ B5 r/ w4 P. n+ z
- }
, K8 E, {1 X6 B- F: h4 W0 v - $data = $this->database->command($where);
7 C6 S" B) q. n - return $data['values'];
- ~9 A5 N3 M0 Z# n - }
# l) X" r- U: t, R8 { - }
# ` f% S' n* N - ?>
复制代码 6 l q+ ^7 `4 X. ~
7 {0 X) I: k# _+ Q! A! C) @1 B
|