|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。1 N" s* Y0 z7 `% f3 ]/ U5 p
模式自由。8 s7 T4 i' |- X( x) d. `
支持动态查询。
# x( j( p; l* H5 p2 Z6 y支持完全索引,包含内部对象。
, w5 ^/ b0 U! |. C. g2 L. P3 Y支持查询。
0 S+ O. b- w' ^9 M/ {( _' ]支持复制和故障恢复。6 c; n( @9 k/ S
使用高效的二进制数据存储,包括大型对象(如视频等)。
- Z! A! G n" I8 @, U" D8 f自动处理碎片,以支持云计算层次的扩展性7 V- J- q& ^. S- {! L1 O) Q8 V X, J
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
7 z) E# F8 T+ q9 Y0 F文件存储格式为BSON(一种JSON的扩展)
9 c- e0 s+ `$ n3 T/ K: ~可通过网络访问 所谓“面向集合”(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
9 t( G. q' U: G( p3 J - /**0 C% U9 R# S$ y+ Y
- * PHP操作mongodb数据库操作类
# u* f" L, \! z: L: i4 P - */
$ o% U% z" f, o0 I7 ^7 h3 ` - class Database {& W3 @4 h8 I4 j% u
- protected $database = '';
7 e0 j+ u+ x% X' ?& B& I' b - protected $mo; J2 K! k% m6 F7 b" x! N
- /**
9 D" G0 E% L4 } - * 构造方法
2 \/ [, x" d a8 T1 Q, n - */
1 L( z6 C$ p. q+ s N - public function __construct() {. _+ `( M" `( h- n; A& u
- $server = DBSERVER;
* Q3 Z: V& I8 V0 K4 @6 M, d3 {6 ? - $user = DBUSER;) _% J% l3 c D# H) `
- $password = DBPASS;
# g* @0 n: ?; u" V - $port = DBPORT;/ H6 Z9 D% x/ w# U
- $database = DBNAME;9 \/ e: B4 S/ q4 J6 }6 M
- $mongo = $this->getInstance($server, $user, $password, $port);
% ^# y; s9 k2 x# D' E) Y - $this->database = $mongo->$database;9 f5 r7 A3 G5 V" m
- }
, C3 T9 h: L/ N; B - /**. w, w" ^0 P/ A& u9 o+ d
- * 数据库单例方法/ o' @) F( d3 _
- * @param $server
6 _8 G9 e* |# W$ m) Q) z - * @param $user
( r) n; m; v( A# L - * @param $password* e5 A8 d k+ c+ a' v+ U
- * @param $port% E& N0 D0 N3 H# Q
- * @return Mongo. L) W* s* m9 e6 j0 r" B
- */( G- q+ m' d3 n n" T& @& {
- public function getInstance($server, $user, $password, $port) {
! v2 m! x# D* ^; _; M0 o - if (isset($this->mo)) {
1 g* k* P; n- m6 h9 _ ?8 T - return $this->mo;! h8 B6 h5 `" v
- } else {
) I% h( t& u, R6 i) \ - if (!empty($server)) {7 E1 M$ D& f u( g
- if (!empty($port)) {
; T; X2 D8 d9 Y( _+ G - if (!empty($user) && !empty($password)) {
1 I3 ?- x1 S, n - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");' P U* b. W L9 y: t4 E5 ~$ V
- } else {
. Q! w' K- l* l - $this->mo = new Mongo("mongodb://{$server}:{$port}");! H& m: B0 z: b6 L
- }
" E |6 s: X- e0 Q, Z3 m - } else {
5 A8 v _$ L) B/ Q - $this->mo = new Mongo("mongodb://{$server}");# y' x# `) C" } ?$ C
- }. E, z3 ?9 h0 {3 |. f2 ]4 e$ y# W
- } else {' }" O7 d9 f" S+ t5 L
- $this->mo = new Mongo();
# @/ O. c, j* I, ]* Z4 F! B - }4 v+ U9 u4 K* O( F3 _
- return $this->mo;7 Z! C5 q+ |4 d+ Y, s3 {, \4 ?( k0 z7 C
- }; ~( p0 | ?$ }. T/ u
- }, ^6 {; N- ^( H; f! n' F r
- /**9 R1 I# |7 g( I; d7 G
- * 查询表中所有数据
}) g% ^( t' a2 f - * @param $table. {; g2 Q: n4 O. p6 X# n2 }
- * @param array $where
/ s: t B* a1 s; X/ z. v - * @param array $sort
) a0 \" z7 o) W5 n) }0 Y2 Q0 \ - * @param string $limit
1 I" I9 P( r! F! Q1 b6 L7 l( f - * @param string $skip
! ?, f3 F2 {$ }5 y - * @return array|int
* \7 }0 Z8 j) P$ m' _7 r, S& U - */9 F7 n5 o9 B9 v
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
. P6 @" X, q$ U2 A; z& M7 E - if (!empty($where)) {
) d, V _" L9 ]9 X - $data = $this->database->$table->find($where); m- s+ X8 J, \, b# V
- } else {
% `/ o! [. v, x$ @ - $data = $this->database->$table->find();
6 |6 ~+ Z3 e9 A& n- [8 w k - }
8 A. L" ^- ?% ]6 G; ~! V/ e - if (!empty($sort)) {
2 x( [& Y. }; [' G: ?3 l - $data = $data->sort($sort);% |& h) _ j" {' I( r
- }! m" y# L: M( F/ _
- if (!empty($limit)) {; ], ]" f7 ]' m8 ]7 Q% I
- $data = $data->limit($limit);6 m5 ^# ], G. L0 G" U- A+ ?. F+ P
- }; }5 x+ O; X# ~$ A( `* l. c
- if (!empty($skip)) {
2 N- n7 i# X$ {: p5 q - $data = $data->skip($skip);
- H" `# Q7 u5 I- v4 c$ e2 ^* f# Y - } n: Z9 H! S" V
- $newData = array();- S8 u4 J3 T3 y& p6 z
- while ($data->hasNext()) {
& I- M* y# w, M - $newData[] = $data->getNext();
$ R0 s! z5 P0 g0 }$ j - }! w$ E# w4 }9 r* h% l' q
- if (count($newData) == 0) {
x9 X+ g) ]6 S+ V$ M1 @' I - return 0;
& `5 { P+ J6 g: E$ s; M - }
- @. X5 ]* S7 ~2 ?2 Z - return $newData;' f6 N! x; R2 `* |
- }
* D& A+ M: q+ N% |0 | - /**5 h- a+ ?- _/ x5 S& k& B
- * 查询指定一条数据% l& Z8 p" O* {& |
- * @param $table7 T# R( v3 c5 n5 E5 c
- * @param array $where& w; ~# b% \. ]! G2 k$ ~
- * @return int
7 c9 C* S' S. F- @9 c - */
4 i8 Z+ h# @1 j4 u2 H - public function getOne($table, $where = array()) {6 A* }2 K o% Z/ G: O7 ]! U* Q0 t, o
- if (!empty($where)) {
6 R# k% z/ J" N, D4 U$ y+ P% o - $data = $this->database->$table->findOne($where);& l4 r0 b% V! @
- } else {2 p0 d$ `0 }' s. W0 [6 f4 b
- $data = $this->database->$table->findOne();4 T% R* L. B3 {6 l
- }
3 o% {& w: a# N7 u0 y - return $data;
3 {* e4 S& n- C( U% h- w - }
( U( ?( r5 @. M! m - /**
. z$ G! [3 ]( i, D - * 统计个数
* g* M" W% [) r% }" l2 L$ S9 A - * @param $table! n$ s. z* J! U" _- J& @
- * @param array $where
+ ` ?# N+ \* D8 i* u - * @return mixed) B' m* ?2 l" A& r3 W
- */
9 `8 r3 | Q3 n5 z% {+ o - public function getCount($table, $where = array()) {
# D% u) [; C! p0 D( p, c/ t, \ - if (!empty($where)) {
" T* t. y% K- O H3 v3 F% Z - $data = $this->database->$table->find($where)->count();6 e+ @+ L2 B- a: T
- } else {
( A8 R' a6 a4 e( y6 P+ L - $data = $this->database->$table->find()->count();+ `# R8 J$ S6 I' p, l5 L
- }
4 K+ s' Z0 B# }8 ~9 E b( z' ? - return $data;
2 O9 y+ A* g/ @' T - }
, A7 |0 m# |; B3 |( i! _2 s! Q7 L' X - /**4 Y& ]. o- P: K7 L9 D3 L/ p
- * 直接执行mongo命令
0 k& i+ q B" ] - * @param $sql
5 F+ J1 j9 x1 m$ [! c+ G( W" b" x - * @return array* b" K, n* h* y& C" a! {
- */
9 I' N {1 I4 e8 o- W; O" N' J* t - public function toExcute($sql) {
j7 r: m; i9 u/ G. W g" {7 R - $result = $this->database->execute($sql);! n0 s3 H: v% _* j
- return $result;
* U; [% M5 C$ Y6 K* j5 v$ T - }) ~2 D0 d0 E: g% n" i
- /**
. o0 a# f* C' Q4 o - * 分组统计个数" B# j, n: d5 [
- * @param $table
1 c! O1 H' `( o5 G! U) I+ r" v - * @param $where. }, j- W7 s, l; k; v v- @3 T
- * @param $field
, {& \8 i/ w( F5 e7 @3 E - */7 @9 Y; H$ U. K/ E# _
- public function groupCount($table, $where, $field) {
% P( \4 G/ E W' z - $cond = array(3 V0 h7 q' g& f% Q7 _( a
- array(' w. k _+ i3 h5 l4 V1 |8 C
- '$match' => $where,, u) n1 O* m' e* c: t' u
- ),; R* J' Y# Q8 a9 S
- array(- f- W: m$ Y: }, U6 c; ~
- '$group' => array(" A9 Q* t. g) U' V* n
- '_id' => '2 X5 g# _- C* ~+ J
- t0 i, ^3 D' J$ t5 b2 g/ _# f( I
- . $field,# l* q. L1 x" e4 D2 Z6 c1 V
- 'count' => array('$sum' => 1),: U6 q( s k9 h" p3 c; K
- ),
; G# ?( t, \2 K2 k. J3 F - ),; A0 N8 Y) d. |" N9 h- U
- array(4 ~4 L. `6 i- M. M% V9 W" U' Y# j3 `
- '$sort' => array("count" => -1),
9 @) R* P3 r( B9 C4 h M4 W5 X - ),# a7 `. v3 X8 u, a& L4 A# y
- );
1 y; v3 S8 _5 T2 I' W9 D$ l - $this->database->$table->aggregate($cond);/ M7 {3 c. F7 i ^2 U- n
- }
5 | Z0 K1 t P( T2 K# [' Y) d - /**; M+ U. g1 R& B
- * 删除数据& G! P: H u+ N0 l% g0 n
- * @param $table! ]& C! u9 S0 `. I
- * @param $where2 v/ X8 E6 T7 }1 Y) ~# ], X
- * @return array|bool
% X% x& C$ g' Q$ R# j8 S, f9 x - */. l/ d L$ ]7 t- o) r& m1 {
- public function toDelete($table, $where) {$ r6 Y# ]# ]1 ?
- $re = $this->database->$table->remove($where);
6 X/ R3 { R& ? c: p - return $re;/ ~9 ^6 T$ ^1 n, q2 }
- }
2 E1 c8 F( t2 k% Z! o# M1 j - /**5 u- K2 b% W4 @1 v/ ]
- * 插入数据& n+ y3 L$ t# Z' ?) e3 \) j' i
- * @param $table
; O3 |) ~. Y1 S8 b - * @param $data
2 O6 M! c9 ^/ g; c - * @return array|bool
0 ~& i( ^- U+ F- f1 u# I( @& f - */: \' v& N" l+ U5 k# A
- public function toInsert($table, $data) {
7 ~" V3 O$ N- S) g. v. P L! ?0 | - $re = $this->database->$table->insert($data);
) {' A5 ~5 B h( u W - return $re;
0 G7 |- K1 {1 G2 r: v7 ? - }
4 Z. V5 I" R; d8 A" z. j4 Y9 L+ N - /**, x8 t7 M" v9 z4 Q' ]
- * 更新数据
, P: ^9 d. [ M/ { - * @param $table+ f8 {2 F7 T1 j$ R1 b4 ^8 u" s
- * @param $where* Z9 C$ H; q1 O/ R- I
- * @param $data
& p2 I8 o' o8 {3 C4 L: d& R - * @return bool! `& T, B' S0 O3 B
- *// R/ k g6 F3 W' D7 L
- public function toUpdate($table, $where, $data) {/ N& Z( @/ A: L- n6 C, z9 F
- $re = $this->database->$table->update($where, array('$set' => $data));) ^0 U, a6 w) s& g/ j, O
- return $re;
* e5 \: {% G5 ~5 E( p; u - }1 u' g: i2 @4 v% f* X0 Z8 {* z
- /**
) \% F6 p7 O+ F- n9 R; i - * 获取唯一数据
5 S- v& P$ W, z! x% k% ?/ r7 D - * @param $table
w' X/ e) V; v6 d - * @param $key2 c9 N5 G& \* ~5 G$ r+ }& B) L1 ]
- * @return array, @: u( u. C) \4 G4 N
- */
8 A b, h6 \3 J' w - public function distinctData($table, $key, $query = array()) {7 \: m9 t2 V1 \( r% E0 Z
- if (!empty($query)) {# z0 G! |; i6 K4 s. H
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);8 q1 F7 a( U, ]# Q* @
- } else {; D$ Z' k/ _ m1 ?" ^
- $where = array('distinct' => $table, 'key' => $key);( ?5 |0 b' O; B; ?
- }
3 c' l* T) K8 S9 v& F5 l - $data = $this->database->command($where);1 i' g8 E& l {3 C" d
- return $data['values'];) J5 g* `- h5 z. [* [3 O
- }- O4 O$ o9 c; x3 `
- }+ A6 ^- c9 j n+ p0 M+ T, W4 q% T _
- ?>
复制代码
( F; t5 [# Z& k, h1 \ d& T6 D/ z Q6 Y; L3 |1 ^
|