|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。3 _, Z; v4 N" y' G) M# _9 j5 E4 U
模式自由。9 o* C/ z4 _: a: ?2 t! P4 y
支持动态查询。4 r: p3 C9 I c0 k; ~' y
支持完全索引,包含内部对象。( }. ]: @, a1 ?4 E
支持查询。3 Y8 Q. ^! F; U; `9 H# |( B8 `
支持复制和故障恢复。
9 V0 ^$ Z; N8 s) w- g$ {使用高效的二进制数据存储,包括大型对象(如视频等)。3 V3 a q% W( H; D- W
自动处理碎片,以支持云计算层次的扩展性) B! i- i n9 [2 e5 H1 ?! {9 X. a* o
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
" a4 C) G3 O0 U9 B3 O/ U文件存储格式为BSON(一种JSON的扩展), f; g5 j' P% K1 V
可通过网络访问 所谓“面向集合”(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
$ X7 p5 m- ?5 e& `# G - /**- K _% ^& ? ]9 O7 N, S# f
- * PHP操作mongodb数据库操作类
8 F0 e& C/ x: A - */
1 x: E# E ^6 [' N' h* I( h- [ - class Database {8 A* R, y+ l0 v; ^5 Q
- protected $database = '';! Y% ^5 T0 Y B, \8 U& e
- protected $mo;
% ?4 v4 C$ m/ j6 V6 X# f - /**: l8 ~) r$ l( k/ Y* \% ^; O8 S6 }
- * 构造方法
6 y4 R" w+ O+ m, \ b3 Q - */
1 {6 q+ B0 q6 v! r& ^ - public function __construct() {
5 G- [; b/ x- C8 d* n - $server = DBSERVER;) J. u# R8 G2 q# I2 i4 s5 @) m& i
- $user = DBUSER;; q" z! ^/ a4 X- ?" T6 \
- $password = DBPASS;7 S& t7 d3 A2 w# C* R- N1 l
- $port = DBPORT;
- z5 G; {0 r, R& T% R - $database = DBNAME;
+ s) n1 C3 Z, B5 d& J4 y" q) K - $mongo = $this->getInstance($server, $user, $password, $port);! i i9 j, t) g
- $this->database = $mongo->$database;
5 @( s: U) G5 R% \) ~& H+ _1 a - }
9 O. j* w. Y- N - /**! O# k3 P: O U( e) h
- * 数据库单例方法) c- H+ V4 m" T, W/ p
- * @param $server
4 C) t* G: i5 L$ d0 q' [ - * @param $user5 o! T) q3 X I' x
- * @param $password
+ W- Y3 `7 l6 h5 a - * @param $port: U4 r" K3 O" q2 R
- * @return Mongo
; ]+ s8 E6 Z) Z% a6 O. S9 J - */
& a; h: Y% B3 n - public function getInstance($server, $user, $password, $port) {9 Z2 l \" T) |
- if (isset($this->mo)) { P: ~0 l; |5 K: Y
- return $this->mo;8 f/ I4 T8 Q% ^" e% H
- } else {+ G9 L6 U* t- y) W
- if (!empty($server)) {
5 y0 F% I$ d, U; O0 j3 o - if (!empty($port)) {, k$ O% R: e e6 T& L+ R
- if (!empty($user) && !empty($password)) {4 L+ R3 q8 b# ~ h! q
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
$ m `" R* l4 p% Y( x& l# K - } else {& |4 U1 m ~2 G' G
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
1 H: U, Y" [) W4 @1 { - }5 D+ Q- D2 j | j+ f( X7 z
- } else {$ w+ B4 Y- N) R u/ u- `
- $this->mo = new Mongo("mongodb://{$server}");
2 p3 ^3 G4 _, N - }
/ S) ]3 w% H/ h6 b: @ - } else {# p# n! o) ]! f/ _
- $this->mo = new Mongo();
v. }; f* ?2 N3 }' b - }
% |1 k* W1 C3 {+ m( q- Q7 O8 Y - return $this->mo;
5 L: h- J6 @/ N6 Y$ B- e - }& @: y( H0 e) x) _5 T1 u" c9 B
- }0 y5 P3 t& x' Y: t' G+ ~
- /**% m. O# b$ Q/ z% y
- * 查询表中所有数据
" Y+ |: x# N9 `6 T3 |- V - * @param $table
8 Q* I# ?" V- b5 z/ |- R6 c9 X - * @param array $where* `2 @4 O( o9 m/ g
- * @param array $sort' \+ [9 p6 A8 l' f4 q6 {1 w3 i9 R
- * @param string $limit |/ [( Y3 a. _6 x2 A. \! L
- * @param string $skip% h$ x& `# [4 @2 {$ y
- * @return array|int* ~/ a5 Q1 ]) S7 P
- */
( @0 T E. E8 ]: D$ j. S5 N* u - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
0 v& N' O. {, _' n3 i& H - if (!empty($where)) {
, W+ q+ t5 b: t" R' Z' d, g$ p9 ` - $data = $this->database->$table->find($where);
7 v# T) k( P- Y7 \; I5 w) f - } else {0 q6 d$ E8 E( }. t2 U
- $data = $this->database->$table->find();
3 |; ~2 {5 z. v9 H' Q' U6 `$ c6 A* D - }
5 R" E) H9 U: f" T$ I - if (!empty($sort)) { E) s- p6 B0 w- x2 K
- $data = $data->sort($sort);8 n: [0 N! v' h: d! S9 B
- }* t9 w( p6 J O) _ X
- if (!empty($limit)) {( g0 c; [% a- P! V8 J
- $data = $data->limit($limit);
/ q% G7 ^/ K& ~$ e0 o1 y$ e - }2 A4 x( d, V% f$ _" p! { s% G
- if (!empty($skip)) {
9 Y6 i$ t5 C: _! v5 j - $data = $data->skip($skip);9 v$ w; f, r3 o2 j
- }
" b5 H# G7 T5 V7 j. j - $newData = array();
3 P, S% \: |+ h+ [8 u8 W; D9 E2 T - while ($data->hasNext()) {8 A/ Y. T$ o+ l# d' P
- $newData[] = $data->getNext();
5 i. |' u( X9 B( P - }
, `7 ~ y6 O8 {% S: B- Q1 u - if (count($newData) == 0) {/ V) f- S* i& {/ [# S! n
- return 0;! S0 l/ _+ H h
- }
9 T* i- X! K, q! X9 X8 D' Z - return $newData;# Y- S& [9 ?+ T* H) ~1 m U
- }
9 g0 J- U c- f( g: I! f$ A V8 {) l - /**. j& {5 X d, h, a! z1 C: _4 b
- * 查询指定一条数据8 r( n$ J8 }6 `/ u5 a1 K6 E
- * @param $table
" U2 R% d6 f6 ?& k% D6 |; F9 u - * @param array $where' d" i7 e8 Y5 {/ X1 N9 q( k* R6 `" V
- * @return int1 p6 [8 C1 \5 ^
- */
6 ?5 p' h" [! V* L3 c - public function getOne($table, $where = array()) {
/ S; F4 Q* U+ x5 L - if (!empty($where)) {. J2 T% V1 x8 c
- $data = $this->database->$table->findOne($where);
. y) ?' h* m. w* V( Q; s - } else {4 e- w, T0 f( z# @# j3 l: Q' x
- $data = $this->database->$table->findOne();
' H% K2 @! j" i2 d* {) Q - }
/ u7 m& a+ E' ^+ c K - return $data;1 ?7 i" n1 b; Q5 |/ m5 m
- }
7 a+ |$ ]- _* E! q - /**1 |5 ]; o' a% Z/ U% p
- * 统计个数
+ i# o7 s, N' _: P0 r1 _/ N - * @param $table0 U! K9 p7 y: q% x8 U
- * @param array $where# L% ]. J6 R# b
- * @return mixed
6 Z: g: v6 G0 j - */) z+ z9 k+ q* @+ c7 W0 ?
- public function getCount($table, $where = array()) {
0 ]. w/ f# O4 d - if (!empty($where)) {
4 L' k) R, D' i - $data = $this->database->$table->find($where)->count();0 g" K# z4 J" |3 X
- } else {8 C4 n7 J+ h1 @1 m) D
- $data = $this->database->$table->find()->count();- o8 y) f0 \/ S& v: W$ x
- }
9 M/ r" [% g7 G; E - return $data;8 F6 @0 I" U: A
- }
" O- s$ V& q5 x: Z - /**
1 y, K3 y, v4 p2 s: m& P - * 直接执行mongo命令" I7 a% |9 X0 [6 `4 Z2 K( a4 i
- * @param $sql
' C w% O+ l" J: w( K2 y* f8 b - * @return array' P M4 y$ r; d4 T1 u$ ^) p
- */: X6 W2 T' M8 Y( ^
- public function toExcute($sql) {
. d" [6 G% o* e, U3 ~ - $result = $this->database->execute($sql);, e( H) B' y$ v
- return $result;0 W! t3 z6 h2 x1 T) o
- }
& U+ @7 l; r: M - /**- x& l0 d. L: N V
- * 分组统计个数' a" {6 F0 H1 y
- * @param $table' q' z* c* u8 A1 ]: Y0 @4 P5 E3 Z
- * @param $where
/ C; c4 P% b" V6 X - * @param $field- r/ P& G. d% Z0 I9 |
- */
5 k/ f% Q/ j4 C9 n8 L9 ^ - public function groupCount($table, $where, $field) {
7 u7 h1 k Y; C, w7 Q - $cond = array(
A) j9 @/ u. r - array(/ h7 H2 R' E! t
- '$match' => $where, X. i. U9 `9 M( P. x1 c* Q
- ),5 d6 X2 `! P* o$ j4 i6 m
- array(( Q5 B% K# @ C
- '$group' => array(
/ c/ h1 a' W! R' h c: K - '_id' => '& n% c' q) m+ n- q/ a
- ) u" s3 ^( @! O+ s4 f
- . $field,& c; N2 [8 r( Z& a
- 'count' => array('$sum' => 1),0 C, z- n3 E Y2 u8 y7 s: z' ^
- ),
7 E$ O$ }5 J2 W& z5 x6 `4 l1 c - ),: P+ i1 h- r' s1 a9 p+ x; h# [
- array(
+ f' T; X( F* X! C3 ]9 Y$ k2 K+ s - '$sort' => array("count" => -1),9 Q! G# `- {3 h7 r3 h
- ),- b2 U: I0 |0 } I2 } E% }
- );5 y/ P& E" g$ {2 D# b8 f
- $this->database->$table->aggregate($cond);
6 o) w, P% M- X& Q, H - }
' I" L- X1 G; U9 S - /**
& E. u2 R8 D6 P6 a, G - * 删除数据
f r0 A6 a* c; b - * @param $table
U: i( b% Q3 h' g+ n7 Y - * @param $where
' e) p# R/ ~3 c) @ - * @return array|bool" t2 r+ Z6 m* a# n8 {1 E2 `/ Y* j
- */
* y" a* e% ~4 d* Q; t- A0 R( P - public function toDelete($table, $where) {
1 P0 C4 W) N K - $re = $this->database->$table->remove($where);, I9 f8 L& I6 M/ Z& @+ `5 X; Z
- return $re;' j8 q1 C0 d( j% X: s& y
- }0 Z5 p( n8 K( R
- /**4 |3 I& G& V2 T$ n. L4 B$ b) B2 O
- * 插入数据
) Z4 {, s0 y0 ?6 ]4 A( [( i+ H" y - * @param $table" H) S2 z7 M# n1 q; u
- * @param $data* A0 s7 e/ G% N s. w" J
- * @return array|bool4 T/ e$ J: G# X: o
- */' R7 U& v9 v9 X* E+ b1 a/ g% v
- public function toInsert($table, $data) {
& M3 j- v9 b+ @3 E, A( z F - $re = $this->database->$table->insert($data);
. h7 A" g: T9 B% m - return $re;
0 z/ r9 Q: C1 O& N9 j, G8 D - }
o' M7 `3 S3 L! {% ^, N - /**# {2 B! Q' z* @* u6 I$ }- ~
- * 更新数据
; ]9 U. y0 f% `2 y9 f0 ^ - * @param $table/ R/ ^% z# u0 Y6 z
- * @param $where2 d% d2 S+ w& P9 v% G7 s# h0 K) x
- * @param $data! }! k( u0 f, E
- * @return bool
* R+ K( c% w8 y# R. V - */# _9 a2 V1 r- r
- public function toUpdate($table, $where, $data) {/ \3 h9 E" ^! R/ n2 R; l
- $re = $this->database->$table->update($where, array('$set' => $data));( t* M' L" e3 _3 B; D
- return $re;
: Z2 v7 g5 ^2 P% @5 T1 ~+ L - }
5 }2 F6 O8 b1 y, x& J8 p3 \ - /** L4 T- N* n* S$ n* Q
- * 获取唯一数据
7 P& Q, F$ ~! A( |/ A$ p9 g - * @param $table' s9 v7 c2 c) X+ ^
- * @param $key
# ~# w- o# r Q! S - * @return array
0 o S3 I: y& Y4 |1 ^- j/ T7 e: C - */1 r! e4 x7 p$ e- e4 J, Z$ w& j
- public function distinctData($table, $key, $query = array()) {
6 t8 ]& x! p8 c9 F3 ]0 L - if (!empty($query)) {
. C1 ~) Y# Z0 b" X1 t4 R: \7 g - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
7 U6 D* y# x/ G |* L - } else {* s# q2 N* l$ u; d2 x# `
- $where = array('distinct' => $table, 'key' => $key);8 j- v! U1 S! u0 W! i, k/ l
- }4 _' h# Q5 T$ S# a5 V+ b% {# ^
- $data = $this->database->command($where);2 e$ @; k+ ^: H
- return $data['values'];
3 @- W4 W: ~6 `- ?8 m% M8 n2 Q - }) S2 _; | D+ X* J( @
- }
6 p1 `5 K* u- B# d9 | - ?>
复制代码 & }0 Z6 x/ v' Y' q) ]# u
+ G$ \: P/ G( U; h1 Q9 H/ o9 z |