|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。) ?+ ^0 ?" [. f: ^' \
模式自由。
7 v$ v3 ~. r) l支持动态查询。) w6 [5 J( g. x# d7 \
支持完全索引,包含内部对象。
7 X2 ^( J) {# H; A& ]1 O" {; c支持查询。
8 H; n( f" x+ V Q3 f支持复制和故障恢复。
, ^; F4 q: @# p! [7 s& D" c使用高效的二进制数据存储,包括大型对象(如视频等)。8 B" n% `: S7 y- c! o5 b
自动处理碎片,以支持云计算层次的扩展性
4 X4 ?# D' @+ Z0 f2 P支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
: Z! O0 R# ^( D文件存储格式为BSON(一种JSON的扩展)
( q k3 M# i7 \7 E' S$ Q可通过网络访问 所谓“面向集合”(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
$ i V$ s: n7 y. a6 W - /**
1 e+ O' m1 h3 u0 [$ [ - * PHP操作mongodb数据库操作类. d; m1 O% q, O l3 ~) `" \. U
- */4 f g. n3 s6 S9 W6 G0 H* M
- class Database {
' r/ b# o l' d# j1 [ - protected $database = '';
, g. b. ~# g. U& H5 f9 E - protected $mo;' d! h" p& k9 Z% D) m/ H0 q9 }
- /**1 _8 }9 ^- w. f8 i
- * 构造方法
. i& C( p8 E/ s( e - */1 w! h+ r1 u2 ]3 p/ q: Y$ h
- public function __construct() {- s' ^3 f% P9 ~2 B
- $server = DBSERVER;
/ x- `5 ?; l$ F9 Z4 _, C* Z l3 k - $user = DBUSER;
- t; {0 v8 j& S) t# e# `' T - $password = DBPASS;
5 J5 U5 E/ {$ w0 w - $port = DBPORT;
* J% H8 q+ e# _- E: q2 m - $database = DBNAME;- {$ |9 p6 m! B* T
- $mongo = $this->getInstance($server, $user, $password, $port);$ o! Y! U$ G5 Z% t
- $this->database = $mongo->$database;
$ T$ {6 m% P7 S) ` - }
8 v8 }# |( C6 r/ ^; d2 v- r: K - /**' V5 Q: G: o6 V* d, e
- * 数据库单例方法
. H; D, P% U+ C6 V; J( L0 | - * @param $server
! }( y2 P0 t) r: Z4 { o% ] - * @param $user
" ^$ F, C6 G! {9 _' C5 ` t - * @param $password
: k! d& }- _$ l. k, K2 G5 y - * @param $port+ ]: v1 |3 F0 ?. i ?( T
- * @return Mongo& W# h0 R+ O3 [* \: E P
- */
; |* [/ k7 p0 M+ S7 H3 d# q$ H - public function getInstance($server, $user, $password, $port) {
4 V. E6 X# A( @ - if (isset($this->mo)) {# _- s# j$ r2 V) O( I, I
- return $this->mo;
0 S; e% O( M d/ e' X! `% g1 S9 } - } else {) l4 b! h3 Y6 R% ^
- if (!empty($server)) {
1 g9 W4 q8 y# } - if (!empty($port)) {
$ {- O* o5 U) Q$ ?% g2 C - if (!empty($user) && !empty($password)) {; s, y, N( t/ S0 r9 w! F \
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
' j8 p3 c3 v( C$ ~ - } else {
8 K+ u7 E) R3 Z* a5 U - $this->mo = new Mongo("mongodb://{$server}:{$port}");$ S3 k* D6 |6 L- \- ?
- }
' G/ n4 }. K8 ~% R( u7 b. B; p4 ~ - } else {7 y& J4 F( ?1 H3 x+ z, y9 n
- $this->mo = new Mongo("mongodb://{$server}");
- B# C4 I- d8 V - }2 \ V6 A9 J# Y
- } else {
6 ?6 U& q7 K# P. M8 d4 T" a - $this->mo = new Mongo();
* R' ?+ |0 c( \/ @& E' }6 P - }' O% B8 E- k4 y) u
- return $this->mo;
2 r7 ?. B. c* R- M; J% Z( U - }
) w7 d8 _7 P6 m% [3 F - }
3 u/ T" y2 f% n( u) V- S0 E% | - /**
. k' l5 c/ v, y- s4 I" m2 S5 v: k - * 查询表中所有数据
7 t6 T W6 d" L" } - * @param $table: u5 N* A1 S: V- l
- * @param array $where8 ~" u+ d% n. x) P( P. S6 N
- * @param array $sort8 z9 ~. H" R9 K. E- }+ ?0 s' n# b5 B: o
- * @param string $limit2 C: f& M; A: w8 z6 l% ]: h
- * @param string $skip% o+ Y& M0 ]5 }, K( e5 K% z
- * @return array|int& l4 b* A& m* n
- */
+ }0 {7 z. }9 x - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {9 d6 s ^9 H9 |; X- I
- if (!empty($where)) {4 E+ p* I2 N E8 a' d9 M# n+ S
- $data = $this->database->$table->find($where);
3 z! x+ q$ h) t# D- r( A - } else {$ |2 K1 l& X0 o4 o; I
- $data = $this->database->$table->find();* J2 k1 A; v' g% j
- }
P- s* p8 C7 |) @9 p% Z - if (!empty($sort)) {
' }0 Z- e6 Y& Q j; U - $data = $data->sort($sort);
9 G! s. t' o. `8 U! S3 ? - }. P/ v/ n6 n+ M( v4 w; _1 m
- if (!empty($limit)) {
0 c$ p- ]) a* S1 c6 C. h9 @9 H) C! J! O) { - $data = $data->limit($limit);! E8 G4 K" D1 V4 j+ \3 i
- }
3 i2 D1 o0 [4 q5 ?/ X' `) C - if (!empty($skip)) {
) E# R+ p* u J L; ~: i% ~ - $data = $data->skip($skip);9 K; h" j& R9 X
- }
- R3 _, P2 \. I, t - $newData = array();' l% m8 X' Z6 `: m% I
- while ($data->hasNext()) {4 s. P7 H0 `9 N. i. i; v
- $newData[] = $data->getNext();
) p$ S7 k, X6 H4 @, u+ X - }; `3 s: t1 z7 O1 H5 m
- if (count($newData) == 0) {
( }9 T: {7 [0 S0 p4 a* { - return 0;4 y9 `9 ^2 e7 r6 \
- }
2 ~3 p' Q$ t: N3 V1 V - return $newData;
$ Z( R& j+ z+ z - }2 h$ Y( ^7 Y t& V7 Y! n
- /**2 x& c/ w/ {+ |5 W. D
- * 查询指定一条数据# I& I$ e5 P* y! w
- * @param $table3 |2 z3 [3 ~+ s$ z' F( K5 m
- * @param array $where
& |; t: }* c8 }" X$ x - * @return int5 x4 ?$ Y* ]' u) B/ X
- */
; @; n% r- F4 y2 ]4 u5 i - public function getOne($table, $where = array()) {7 `) c) B* G% _0 J" S, U
- if (!empty($where)) {7 u9 q& f, n' }) Y3 T
- $data = $this->database->$table->findOne($where);
3 L2 `! @/ I, E9 b# R7 U- Z2 y - } else {
) q* B3 o/ q! {# _7 F6 { - $data = $this->database->$table->findOne();% H- z, T! K9 s, y! K5 G4 U
- }' e/ r3 \! L& ^. q. P6 k4 S
- return $data;
, U) o% G) }: V5 K8 D2 u - } _: b+ T4 E8 D$ q- o6 e2 t6 T
- /**9 _, x' ]$ S/ O9 a) Y4 F
- * 统计个数
" K. E* F% v9 c E7 ~ - * @param $table* ?+ V" o+ ~# W3 m' Y3 Z' r; I5 d
- * @param array $where
6 Q K1 f3 L/ E; s; ] C - * @return mixed
# H- b! T1 d# e: @; O - */
* ~' C; j# S' r9 Q" @ - public function getCount($table, $where = array()) {# U" A4 C6 K( m! i9 ~4 c2 E1 ~
- if (!empty($where)) {9 a2 {" j7 o* J. r% q" T" P! H
- $data = $this->database->$table->find($where)->count();& w7 n+ V% O7 `+ ?: u
- } else {
' q; q1 S0 o% [( p7 o" ` - $data = $this->database->$table->find()->count();( h% n( e7 i5 ]
- }
0 O( V I8 X ? - return $data; r) c/ X. Z/ _
- }$ C) K2 L% @1 k2 V, e3 D- k
- /**
- @1 U8 W; {' \3 K1 x: c I. p - * 直接执行mongo命令
5 I" t; ]0 n8 P3 B) i5 T - * @param $sql, Z. H7 {' U2 x6 Z, u0 \8 X
- * @return array8 |- }' C6 D+ A9 `0 H0 {' |
- */
- @ l/ }) p5 g( A8 q. o - public function toExcute($sql) {
; l2 r' V: f" a - $result = $this->database->execute($sql);2 U6 R% K6 }& b" A7 Q
- return $result;
k/ A* G2 G8 ~5 W3 E- E - }
g* R; G! K& K - /**4 D" m9 |/ ?. p9 e7 c% y
- * 分组统计个数1 h: E4 X# ^6 J, \8 J9 m
- * @param $table
6 u9 W* A% a* S( j+ P- K- J* ^& H - * @param $where5 m+ T% a6 K+ P! a
- * @param $field1 @; W. q9 u0 E0 f4 F
- */
+ D( ~# j/ ^, d4 q! \ - public function groupCount($table, $where, $field) {& n: M2 q" Q/ f& u; X6 I% L
- $cond = array(! i( l) ~$ _* S
- array(
' [) n2 i7 f/ T$ v! Q: J/ ? - '$match' => $where,' d8 h/ ^& g d1 h( N8 {! d& K
- ),
/ q1 b$ n$ s3 f8 ?0 d+ T# @ - array(1 W8 i; p9 F# O- v8 o5 T
- '$group' => array(
! v% D9 u1 v- O' w' f - '_id' => '
" N& L. {/ E( C
0 a2 P8 s" a; l6 U9 m2 N; z, j$ q- . $field, X \' u1 c, P& Y
- 'count' => array('$sum' => 1),
* i/ P& t$ y7 |0 a0 [6 Z - ),
0 |: h' e: f8 L7 G0 m, v7 X2 A+ t - ),
. q7 S6 K' a/ s6 }- h L( f D - array(
$ G3 }* O- A4 j3 U7 ` - '$sort' => array("count" => -1),) |% X8 Q4 r' B" I5 k. I
- ),
$ l$ i! E, Q% A# q l1 c2 l8 O - );( n) @7 z( B0 c/ @- a
- $this->database->$table->aggregate($cond);
+ l8 m) Q5 Z) R) y! |& z4 O - }
. e$ f6 j Z3 W1 n5 _6 y' Q! x - /**
& ~7 j6 g/ H/ W5 p; ?9 p) R - * 删除数据
4 z- X s5 P" L8 [ - * @param $table. C3 @; g& L4 ^2 V! z5 T
- * @param $where
4 L1 p+ L k9 V - * @return array|bool' B, X/ @5 k' v
- */
8 ]9 L% v# I' Y7 r+ ] - public function toDelete($table, $where) { _: |& {5 v- o2 t0 ~( q
- $re = $this->database->$table->remove($where);
+ c. {5 ]" D, C' y - return $re;* t( R# E- f2 ]+ H% ?9 Y# ]
- }
F, q; M) N; m6 q- L5 X2 w - /**6 R) o; ^; d8 A
- * 插入数据
/ e* D7 h8 W1 }' J - * @param $table5 _/ r9 w8 m2 o5 a A
- * @param $data( N; d% ^; K' A# {
- * @return array|bool
% O- F! P2 v8 G8 R! _ - */
: |2 q( F1 ]5 q( @1 a" I - public function toInsert($table, $data) {5 y( d' t1 ?* F. `) J
- $re = $this->database->$table->insert($data);
$ h1 O5 A& f. q& v) z - return $re;5 [: R0 @8 C2 J$ t2 i6 z
- }3 P& G) |% f+ a
- /**2 d- j& k: c( a
- * 更新数据) A. u, T& a7 ~0 _( M* p! i1 n9 S
- * @param $table& V/ ~4 A2 w: G3 `* w" J
- * @param $where* G) F6 F, H' B) k
- * @param $data( g1 E- _2 o. x
- * @return bool$ M1 _( c e( o5 o+ j
- */0 `9 @0 { \4 `1 ~7 K/ |
- public function toUpdate($table, $where, $data) { {/ j% A$ j; U1 F4 i: b! A( P
- $re = $this->database->$table->update($where, array('$set' => $data));( l( v/ ~- R6 K8 D! s& `
- return $re;
, x% a8 ~+ t' V7 [! v- W2 J - }
( Y" l. K2 F' _+ C1 X4 w - /**
9 z0 k' W! }' o1 H - * 获取唯一数据
; o% c) |. z# I q - * @param $table! x% z8 N; }6 O
- * @param $key
& R- m* I$ A( J" j3 x - * @return array- `9 N2 P# G( D' J+ h& j
- */* Y6 R. m' u* \; t
- public function distinctData($table, $key, $query = array()) {
$ T8 Z0 _! d4 _' S2 A - if (!empty($query)) {( V: O$ T) Z2 M) L2 V' L
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
7 `& {: D; ^& E; A' Q+ ~5 R - } else {
4 i+ c u( J7 J, Q+ Q1 H - $where = array('distinct' => $table, 'key' => $key);; Q( E$ q# W4 b3 W; o
- }3 i' H, l0 J" Y$ K
- $data = $this->database->command($where);
+ Q% @" A# X! Q9 Q0 _ - return $data['values'];
4 K2 A" e( R% ]: Z( H. d: b - }
2 w6 B+ V4 L+ w" o1 s9 w4 m, G - }
. D1 J% h. L2 _- {1 S - ?>
复制代码 8 s' _: [2 B1 E
9 y! n) S* g, v
|