|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
* o0 u, x% y- H: q" Y* F模式自由。
- S8 D% r" A, G% Z- j支持动态查询。
4 x9 U+ s5 w# L, X3 o支持完全索引,包含内部对象。* f6 F; |# c$ \! [9 |" ?! n
支持查询。- X+ A2 K' T; x+ ^0 R) F! D
支持复制和故障恢复。' |; _% w# b, A/ h% n5 B% x
使用高效的二进制数据存储,包括大型对象(如视频等)。' i, O1 X* s# A& H
自动处理碎片,以支持云计算层次的扩展性
O, [& I9 q: @+ J& p支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。' `. L' R$ x; F9 q0 O% e
文件存储格式为BSON(一种JSON的扩展)
/ x; _7 F" d+ H可通过网络访问 所谓“面向集合”(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
5 T! q' z- r: u* e, |; c6 b m - /**
; H7 `2 B! W m* F! E$ | - * PHP操作mongodb数据库操作类
2 D/ _$ K$ ~* `( R: I. Q. j - */
' p: D9 i. D0 A$ R" z) q, @, d" _; L - class Database {' Y1 C3 J% T# \/ b& u! h9 A9 L
- protected $database = '';
5 Z8 e) z$ Z) q) |4 A - protected $mo;1 t0 D4 H( N) O7 ^5 \
- /**
4 K* |8 t- O- M! N9 q' | - * 构造方法
3 {; x6 k- y1 ~ - */2 ?/ z2 d _" T" K& e6 N3 I
- public function __construct() {
. V4 i# C- {( s - $server = DBSERVER;% @5 v# v$ J3 |% w; i
- $user = DBUSER;
9 W3 U* K- D% g/ ~# | - $password = DBPASS;
* B6 J* v! p2 q7 g3 m - $port = DBPORT;. m- q/ ]$ C' A' q2 _5 z
- $database = DBNAME;
! r5 B" W, ~/ b Z" c - $mongo = $this->getInstance($server, $user, $password, $port);
7 d7 L- X( @* [ - $this->database = $mongo->$database;
3 R4 V, S2 B7 Y2 @& \ - }# X% C' z4 g) j
- /**
! N: h3 \4 `& U0 ~# u1 {, ]! O# h0 l - * 数据库单例方法
N7 Z' L. y2 v: l4 F - * @param $server
3 m |+ A; w0 k3 F/ y+ p - * @param $user
8 j) e/ @% U4 J7 ^% _$ [8 p - * @param $password
! |( N7 u0 O( u! B - * @param $port, ^) K2 A C! j" ]: H i; i% ~
- * @return Mongo- [ x) f8 k9 l' Q3 g
- */7 A" m& Z' _2 e& e; K
- public function getInstance($server, $user, $password, $port) {% f6 ], ^. R4 J8 [* w, v
- if (isset($this->mo)) {
2 e! @5 N8 W3 X2 Z3 ]& i - return $this->mo; g" \8 A# M) [. x, T- P5 W
- } else {2 [7 A0 j) N6 n
- if (!empty($server)) {
" w4 K0 X3 K t+ X+ j* Q - if (!empty($port)) {, H- z0 Q$ j' O$ A
- if (!empty($user) && !empty($password)) {8 I- d8 V( k$ L3 L9 y8 Q
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
+ ~" [ b) U- l! M7 Y& l - } else {
6 q% x" j( p/ a4 k+ M9 Y" [ - $this->mo = new Mongo("mongodb://{$server}:{$port}");3 Y w+ X& s9 K5 D: H
- }9 H3 |: a- R$ j$ h# W# l7 n
- } else {
$ T. N1 a9 }( c: s/ ~ - $this->mo = new Mongo("mongodb://{$server}");
2 v. P/ q8 L7 ^' Y6 i - }$ ?6 Z5 M8 `9 E* C
- } else {& I2 E* }5 l8 c( M2 r, ?+ i' Q* j
- $this->mo = new Mongo();+ d ~( b/ s! E- u% N# e1 i. t
- }9 k+ E3 E: Y5 ^, P% L9 D
- return $this->mo;
* [4 _. X( R+ P! U! z- R - }* X8 v5 U$ X5 I. A
- }
/ v0 M0 O! x+ h - /**2 x; {- q, Z# G2 q
- * 查询表中所有数据) m; O0 v: d& o. h
- * @param $table% p8 U; k* U5 d$ N( m4 }1 @
- * @param array $where2 R* V& M: k g
- * @param array $sort: o6 Z2 F" O: Y3 N0 F ~8 h
- * @param string $limit: t" C/ `* T1 Q4 \
- * @param string $skip
8 j% i. N. M- C' G; ]6 ~+ r - * @return array|int
0 B4 G" Q; T* V5 G S - */) S# G8 q$ \' Q v7 I8 G
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {6 l3 ^9 h+ i8 N Y$ C
- if (!empty($where)) {0 }: ^! [% c4 D* V5 C; W
- $data = $this->database->$table->find($where);, o2 O7 S- }8 f. k0 Q
- } else {
! W$ B! m% a& m( W# H2 I5 @. `# u. k - $data = $this->database->$table->find();- O. e1 x8 w' V+ x6 V
- }
) b% r+ m' j# N/ W( C - if (!empty($sort)) {% i# d/ x5 y( A6 e3 i7 b5 J
- $data = $data->sort($sort);; Y4 H; W7 k/ i2 O4 b) `- {3 o
- }
( X/ C `! V& u# e/ R8 f5 \! x - if (!empty($limit)) { }7 S/ o5 C4 U7 b: O- Y# X7 S
- $data = $data->limit($limit);5 w2 j! l2 z$ j7 s9 ^; B3 E
- }
! K- o- i$ O% t6 A9 b* w* p - if (!empty($skip)) {
. j2 l% Y3 j7 y2 Z+ i, T9 A7 \ - $data = $data->skip($skip);& S( J/ X4 F! U" A" \; ]; X0 Y
- }( U+ v7 v. ?" u" ]+ n1 v
- $newData = array();
6 }- v$ T* Y( o- |: {7 P - while ($data->hasNext()) {# f0 S3 F2 a2 Y, H7 U! G
- $newData[] = $data->getNext();
$ K- d5 B4 w2 k: D: k" a# Z1 s& K - }$ o( n9 v: u% R! l0 A+ V" s
- if (count($newData) == 0) {& m3 `9 \6 {& ]8 V: p8 g
- return 0;: Y0 x3 T( M D0 Y
- }
" i/ X% V; \: v0 e" D$ m. b - return $newData;& {6 n: u% Z( [; r+ V' r% u
- }) A1 l7 J, a4 Z1 h z
- /**7 P% T( L2 k: z& j" \& D" E
- * 查询指定一条数据2 B7 S f# x4 \- E. K
- * @param $table A( q( L( Y4 }5 G$ ^' G6 Q9 o& W
- * @param array $where
/ C8 A4 l {, i; q. i/ H- U - * @return int9 x. ]& d7 [7 {, `3 N
- */
4 ~- ^( T" O+ S, |6 Q8 X# A - public function getOne($table, $where = array()) {
/ o+ \/ O+ S" m: L - if (!empty($where)) {* {3 B7 h1 ~( ` l4 V5 ~% }
- $data = $this->database->$table->findOne($where);
+ O' ?: t: v O, c8 c" z: Z - } else {
4 {: _5 R' p; S. c% U: q$ r - $data = $this->database->$table->findOne();# [! V' s( J) O. P" a5 W
- }' d7 V8 \. t6 l7 l9 @9 c
- return $data;
& Q) F, l. C" v - }
* j5 P8 `+ l6 P: z - /**
0 {# t M8 M( s - * 统计个数( v% S; A5 B, g% b( Q
- * @param $table0 t0 C- i' v& q' M4 g
- * @param array $where
; e, w1 x+ u5 i& u2 d& S L - * @return mixed
, B* Q0 r- O$ O7 C. M1 j& S - */& |# _5 P% T" d+ ]3 S
- public function getCount($table, $where = array()) {
" B, e: Q, a/ K& X' w6 w - if (!empty($where)) {
- y" B9 h3 Z$ S - $data = $this->database->$table->find($where)->count();
" v2 c7 \# v" x - } else {
* y" Y- u4 W. [5 W - $data = $this->database->$table->find()->count();
3 N% p' V5 }$ d# |3 I - }8 _8 r" u8 n2 F, E
- return $data;8 ^: i& ^2 z5 b. j3 o
- }
% j1 K" M' Q/ }0 M- ~ - /**
. V$ d2 ]2 K/ W$ b6 f - * 直接执行mongo命令
5 b4 S* [5 `/ q5 | - * @param $sql
3 B: K8 }5 `. h( c4 p - * @return array+ |5 Y* b2 T. `' W
- */3 P! ^3 b B; V# o& x3 o- y
- public function toExcute($sql) {
" z. |* V! K# {, |, J' V' m9 z - $result = $this->database->execute($sql);: _ c0 s3 i, x; N- S
- return $result;
( t- _1 _' k; S - }
0 M$ d4 G* Z* w7 F/ H - /**; l y: D* B7 M' h8 m, _
- * 分组统计个数( n) O9 U1 T9 }2 z
- * @param $table
2 ^# G. `5 S+ U9 ~6 _ - * @param $where
$ c6 k! e: V4 O. c p0 q - * @param $field: V3 K# c) I+ [' W3 Q
- */* _' ], U3 |# r/ [2 P1 y: {" x
- public function groupCount($table, $where, $field) {' Z5 d1 B e* u/ c B
- $cond = array(
+ Q6 k5 L. }4 m - array(, n& M. l5 I) G8 A# Q, I
- '$match' => $where,
' G! p" N. \: f) o7 i4 g) h - ), ?( @ U5 Q" C! L2 T- `5 w
- array(
8 c1 N; W/ H8 L1 c0 C - '$group' => array(( o; g6 D* n- S, r; f
- '_id' => '3 J) h* W9 u/ G; a4 K9 Y( g/ z
- 0 N! w: @2 B5 l( _8 U
- . $field,# r6 }8 n, ~2 B, l/ C
- 'count' => array('$sum' => 1),2 v/ c2 @5 o- w3 k0 K( I
- ),
* ~5 r' y; d$ m `% M - ),
, C( h1 a( T" B* U( G9 a% s - array(
3 s$ {5 T8 h) W8 d; d - '$sort' => array("count" => -1),
5 i9 q) z3 p7 n" T( Q% \, [ - ),
6 ]: w8 a( _! J/ v" I6 g: j3 n4 s - );0 Z/ p! D& N6 @& L) F* K$ F0 ?
- $this->database->$table->aggregate($cond);6 @+ P5 z8 D9 h' |
- }
3 d& z& l/ J- n& ? - /**
, m) S3 g( L7 I3 V1 N% w - * 删除数据8 {3 r8 _5 v8 ? r
- * @param $table- i! t5 ]9 A0 p( o' b
- * @param $where
6 m* U& `& x$ @; Z( _ - * @return array|bool
/ T3 I B. F1 |6 M - */
5 w v7 R( W* U: s) U - public function toDelete($table, $where) { r8 W! J- u" C4 o; a
- $re = $this->database->$table->remove($where);( D8 O9 q" X+ t3 A/ Q
- return $re;- ?" a+ B9 }3 a" h8 ?3 b
- }
- N6 b, w m1 z' F* ~/ \ - /**% ]+ r1 o3 P9 y* Q' c
- * 插入数据# y5 C& x( z' O: H& F3 Y& s- m$ N8 N
- * @param $table, g' _: W: k( P. v+ V+ a$ s
- * @param $data* D, J2 C$ K' ^0 h% d- c1 v+ e
- * @return array|bool
5 Q9 o) O5 C+ C( C5 b; [4 P - */0 V9 _/ u! h" d; a6 \
- public function toInsert($table, $data) {* k7 F# e; c3 J2 {% i5 [' h
- $re = $this->database->$table->insert($data);
: l) i0 `* I5 n/ a. K" B - return $re;- v9 ` a8 G, m7 W* P
- }
6 }+ s* c! _8 \, Q - /**
4 v) m4 o ? C7 r# n& ~( M, J' P - * 更新数据
' B4 ^6 i6 M/ \0 N4 ~3 A9 e - * @param $table. s8 Z/ e% w ? G7 V" Y5 X9 L
- * @param $where# I& f* b/ s5 O& E
- * @param $data/ j5 @* B1 J4 R8 B ]1 E
- * @return bool
9 J6 e7 `) [/ q% D2 s# B# { - */
+ Q1 s. ^7 R' V - public function toUpdate($table, $where, $data) {
+ X7 R$ g( Z$ \; r( F @# B4 E - $re = $this->database->$table->update($where, array('$set' => $data));
& |( E, P4 Q6 z% ]9 _7 P - return $re;
$ T# G9 g+ Q3 {& b) x' J- h4 g - }9 I; n7 n. V$ _ A
- /**
8 Q& h3 g+ d- J: t+ k* I: \+ ~ - * 获取唯一数据 ^8 e4 l, _+ p( o
- * @param $table
5 N8 r- R5 J1 g - * @param $key
+ R) Y. G) w& g+ T a+ g - * @return array- r( J, L2 ~4 C4 B" u
- */& j; ^' E1 K% A+ Z
- public function distinctData($table, $key, $query = array()) {6 W( M: u3 ~8 b) _# F, o% r* E
- if (!empty($query)) {
: i" n4 M+ K$ D* [: a: K2 |: E - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
$ ]8 A$ {4 e8 G d - } else {3 d2 [# S( _. H9 Q
- $where = array('distinct' => $table, 'key' => $key);
' b, U) ?# Z8 ~) D! X' X! j; C - }+ z. I- O+ a4 x5 D- _$ w% S% |* _
- $data = $this->database->command($where);+ V$ R: ~# g) j4 V. {
- return $data['values'];/ V1 q1 H5 U& g; i' w: I! e
- }
r% t8 I( f" Q: L - }
8 E- Z5 s& ^( i; D - ?>
复制代码 & a# O7 ?" P; J4 {5 N) ^& @+ [* y" v
6 J: b3 I% o) K* Y
|