|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
$ Z- G7 B, _8 H& q模式自由。+ p4 L U5 V* L/ R
支持动态查询。
4 E4 `' T( e* J4 w) w支持完全索引,包含内部对象。* }; ]) z' G* f6 k7 E3 [5 m. a9 j
支持查询。1 A3 S: @9 b' O, p! M, P
支持复制和故障恢复。: @9 x7 a% R- K3 |3 ?
使用高效的二进制数据存储,包括大型对象(如视频等)。
+ h% k0 z8 \' K自动处理碎片,以支持云计算层次的扩展性
! z) `* Z2 F/ V/ Z2 M3 ^" K支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ B) y7 F! S3 }. w% f7 |文件存储格式为BSON(一种JSON的扩展)
* A' \, m5 O* ~* x( T3 l可通过网络访问 所谓“面向集合”(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数据库的数据库操作类源码如下,仅供参考。 - <?php8 c: s: W: W+ n2 r
- /**9 O. {8 S; ]1 P: \9 k
- * PHP操作mongodb数据库操作类
: u8 X' D$ t% e! t - */* F( V7 ?% P- G5 h+ ^! c& Y
- class Database {
4 v6 B6 z5 x5 N3 G - protected $database = '';
( [* }: c% i- p J8 y2 ~% Q - protected $mo;$ Z" j& {2 k" G# f2 j9 O
- /**" c& ?- p. `8 ~! Q8 C
- * 构造方法5 g/ c0 o: L) _" b9 Q0 F+ Z0 H
- */' f. G- u5 H( l: ^' y
- public function __construct() {8 ~4 A* m0 {7 I& Z5 E" B. E% P1 [0 R
- $server = DBSERVER;7 `0 l$ |8 Y6 U# t/ \+ O; g
- $user = DBUSER;
( B9 F7 P2 Q( S$ C* s - $password = DBPASS;
; C3 B, S# x% A' K1 N. F; Q% a - $port = DBPORT;
8 l7 h7 s7 R5 r9 i# N. w: E9 u - $database = DBNAME;/ Z* A, q% D0 l, z
- $mongo = $this->getInstance($server, $user, $password, $port);
- Z4 F& `4 j% Z7 N4 X9 U( }1 { - $this->database = $mongo->$database;
0 i$ @( B1 y- a9 t- v - }8 O* g, e4 \2 [% u" W8 P
- /**
5 @% a: h8 _3 q. L3 m3 B/ n - * 数据库单例方法, Z, d& \: x" {! ?
- * @param $server
. I; d; L; D( W% P - * @param $user
b$ `7 A0 ]. T; k i# O - * @param $password! p, Y0 I: v6 R# J% ~
- * @param $port
6 L& Z( m8 n S( _: s" } - * @return Mongo7 {. e/ U, b: l Y# |6 {# I
- */
8 m3 Q% v2 ?. }# W! t) n - public function getInstance($server, $user, $password, $port) {+ V2 P6 x6 ~! E; [
- if (isset($this->mo)) {
2 ]0 z# ~* L* O: J - return $this->mo;
8 h" V2 ?. L; W0 m9 V" V - } else {# ]! m5 b ?5 Y4 M
- if (!empty($server)) {
% C+ |5 ]7 L5 E* a) X0 |7 j - if (!empty($port)) {! K. @& f- a/ p: {/ L g+ B, ~- X5 L$ {
- if (!empty($user) && !empty($password)) {
6 B0 @4 }# V3 X& X8 S - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");/ A: Q. M0 e% T& X2 ]8 r$ K: _; Q
- } else {8 C8 ^! Q% K, a+ d; g' p
- $this->mo = new Mongo("mongodb://{$server}:{$port}");
! K& [, V# Q7 V: n/ o* c' G - }
& Q. p: D, e3 p( Y" Y& f ~2 A - } else {
$ _6 b. [/ G0 S6 N0 k - $this->mo = new Mongo("mongodb://{$server}");
8 G, I4 X7 Z- e i [/ w - }
, x y9 m! V) w& a - } else {
# ^6 m* F8 q8 j/ Z! r1 m& q - $this->mo = new Mongo();
& U# S L: h. Z7 Z8 L! K - }
% s a- X5 P- v% l, R c - return $this->mo;
+ n( J7 B) O) R4 B" b& Q. w - }
6 M1 |8 c! r% U, a5 }1 J( T E3 M - }
/ K% |5 j" R- U2 U0 e - /**
' @. G% z& s) |6 l* P0 ? - * 查询表中所有数据: j4 r* r( F, t6 S$ Q: e
- * @param $table: e' a6 l' f* R, a# q
- * @param array $where6 ~8 s: A2 S1 w2 r
- * @param array $sort
4 ]+ o c3 L8 z3 E; B. {/ y' m M - * @param string $limit, U/ J, s( Z( h7 Z
- * @param string $skip) k/ |# G3 K" s/ S. B: y: i
- * @return array|int
* T# s: J3 y2 s' c' P3 W0 [) O: j+ m - */( A* I) e# \( K" m* L; ^9 |
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {5 t! n7 v5 J7 E
- if (!empty($where)) {2 I( C; Y* z* l
- $data = $this->database->$table->find($where);& k+ T! ^+ f$ P- J6 j
- } else {
5 p8 q' C0 l: B: N - $data = $this->database->$table->find();2 Z1 f8 L9 Q7 N! R- H3 [0 o# i9 R2 I, a
- }
- R+ H1 @ m9 Y8 y/ L) m4 G4 H - if (!empty($sort)) {
- n1 ?9 L. ^4 h% Q5 q1 Z* T - $data = $data->sort($sort);4 h* S( c, N% c4 a7 a! v8 S
- }
# a- z( n4 b' Z T1 [ - if (!empty($limit)) {& N+ u. y3 c1 \& y. u' m5 j8 g' L
- $data = $data->limit($limit);
$ t5 R" B$ M: V; X( ]) ^3 a - }$ ]/ ?6 D L: n4 G2 ]# L' f
- if (!empty($skip)) {
- F- S+ ?1 Q( d! f& G( O; P - $data = $data->skip($skip);* Y' X3 g! _0 v7 v: Z
- }! [, d3 ]5 x8 H9 Y' c# L
- $newData = array();
) r' n% m, |3 |) R' `3 L, X; k - while ($data->hasNext()) {
! x4 w! }, I8 L - $newData[] = $data->getNext(); ]2 D' w. `9 F
- }' e: K; W% b1 G, L, R3 l
- if (count($newData) == 0) {
* G7 c6 v+ \. V6 o3 ]5 ~. Z+ W - return 0; p8 {% q8 ]4 h5 |" n# _
- }0 @( n& c; b3 | d6 E! L- C# R
- return $newData;2 b3 o7 G" q+ G, C) h0 H# `
- }0 A5 }3 u" ~+ q3 w
- /**
0 ~2 V. w; R# h# s7 z$ _ - * 查询指定一条数据
( \2 t4 D9 H! U. a* p - * @param $table9 o4 y% d6 k$ \1 k( s( f/ ]
- * @param array $where& u. S% F" z/ S1 @/ p' U
- * @return int
" {. f( ^" h9 Y, N - */
( P5 h9 E& a- h - public function getOne($table, $where = array()) {
0 h5 Q- d7 N1 G: }% o$ X - if (!empty($where)) {7 x. l% l2 z8 a/ C1 o2 a
- $data = $this->database->$table->findOne($where);/ g O3 _' L' O; \% ]8 d; X5 C
- } else {
; I: {. U. X2 s' U- U) s8 f - $data = $this->database->$table->findOne();: @- j: T( X: T; V
- }
0 y! ~' q# X% _4 o5 U- O - return $data;
7 H! e$ R, X7 }8 y - }
! @% A3 D6 P; ^5 r: Q - /**, Q6 {7 P% U" `) X/ c, }* v
- * 统计个数5 }; j7 K' d; ~! H" l
- * @param $table
5 V$ {$ p3 ^3 x8 j( K - * @param array $where
6 F j7 ^/ f: Z- v - * @return mixed
& _; z4 _2 @: ]' l, S' C1 f& j - */& h: p: |9 {* r( v/ U# ^( u: j7 w
- public function getCount($table, $where = array()) {
% u7 Y2 l3 c6 [+ O1 \: e: f+ Q - if (!empty($where)) {2 B8 n% H! w8 i: z
- $data = $this->database->$table->find($where)->count();6 `) m( N; T/ X
- } else {
3 ?& A4 u7 q" V6 U - $data = $this->database->$table->find()->count();* D9 e8 q! m% v) ]' ?2 G9 b, c6 \2 d
- }
, }7 V6 ?! \& P2 l; I8 B" Y - return $data;3 i1 t# [) J$ P3 E( j+ o
- }2 Y2 N7 m5 \2 o( T
- /**+ |$ x$ S: \. F" V
- * 直接执行mongo命令
3 D5 I2 ^2 ]4 G' ^2 D! J - * @param $sql4 f0 H, y' K2 S- v
- * @return array
: e7 P9 I/ |. @2 ?* Q# c" a$ B - */
/ {6 G0 I0 k w; k - public function toExcute($sql) {
& a) h9 y- V3 X. }- w8 v - $result = $this->database->execute($sql);! o; ^8 I' D- ?2 v/ \
- return $result;5 `: D; l& N7 ^& h4 k
- }
; m; q8 F8 I+ Y( W, L; D q - /**' t" e4 @3 s5 Z) ?* u8 c
- * 分组统计个数- |$ D0 q! ~' w3 C4 T2 P6 L
- * @param $table
6 C2 ?! @( [/ I6 Z4 g% b+ t - * @param $where
7 Z0 A. n2 b' Z8 v4 J - * @param $field! w. I6 o% A/ ]0 X+ x6 N! h
- */$ P2 H$ A9 y: B! g3 N' W+ ~
- public function groupCount($table, $where, $field) {* |8 { \% A8 q. ]( ?1 X
- $cond = array(
+ X8 m b0 A! m1 L - array(5 ^ W# r/ R H$ C- b7 s1 k1 [
- '$match' => $where,7 i6 r0 N9 I1 d9 x0 u
- ),6 r5 U* S, ? F1 v8 j
- array(* u3 q) h: r+ V3 y0 [2 U( a
- '$group' => array(3 j* p9 C' `" n& |
- '_id' => '
7 b( t' T+ R$ h l - 4 }& u4 a9 O& e( Z2 N: _7 h
- . $field,
* K0 F+ B% J; d1 ? - 'count' => array('$sum' => 1),$ Y' V7 }4 ^( g8 ?7 f9 O9 U
- ),1 Q: S: H( G3 F& S" m
- ),
( l _. Q& A4 V3 `9 {! [8 g# e7 \ - array($ I! \! d) j8 p
- '$sort' => array("count" => -1),( u2 ?8 S$ \. L
- ),: `- @- |$ M. f9 ~6 ^
- );, N! n2 h9 y; d
- $this->database->$table->aggregate($cond);
5 S! w+ r7 f" t z/ |& f* ] b$ R - }
" q" u1 u1 e3 ]$ w - /**
& d- B7 x5 M6 D/ `* F* ^' X - * 删除数据1 R+ L6 ]5 d' ~% @, p- o
- * @param $table
: P: u% R6 {8 U% k1 y' e: J: H - * @param $where+ T+ v9 Q- a, V' |9 p! _
- * @return array|bool
# h" I' U( J9 q/ @/ C* X0 m+ ] - */
7 U9 Z; Q, H% f - public function toDelete($table, $where) {
7 Z1 A' H U5 I - $re = $this->database->$table->remove($where);
$ N, \) H1 ?) [" D/ a' \6 u3 v - return $re;8 M$ Z* i6 {2 r- I
- }9 ]: M# g( \7 d2 z; g, Q
- /**3 {2 ~+ B2 B5 O, R; E0 L
- * 插入数据
. r x9 q' ^/ a8 ~6 q2 C - * @param $table/ L: G/ E+ ~0 R% k
- * @param $data+ b1 Z; h$ m% b, ?6 u, {, ^/ |
- * @return array|bool
$ B6 q5 R2 m9 `; C; I - */
3 b+ w, s& z# @ - public function toInsert($table, $data) {
% t4 u; z' n5 w5 _, C: B1 R - $re = $this->database->$table->insert($data);
, i4 S/ H8 O( a/ E - return $re;
2 m- B/ X7 G+ c' R( B4 Z - }6 e* t8 w- Y1 P# G" I* D
- /**9 m( h; u% |% L7 t$ _* a& e
- * 更新数据
( H) g r; b% ~% r1 |$ c - * @param $table, e0 F% j7 L" o# z
- * @param $where! o; B8 _8 G8 D1 }- A
- * @param $data
- x, C* }8 Y- V' U8 N6 f+ s - * @return bool
: y) n+ E$ g P7 e1 [; ] - */' G( z$ h- d- C( \# r: y, x
- public function toUpdate($table, $where, $data) {
+ A( s2 A8 I! W ~& x1 V% c - $re = $this->database->$table->update($where, array('$set' => $data));
/ ^" c& }2 T0 D; y, }! E - return $re;/ Q6 T! j1 m; H: z
- }) a* y7 p2 `+ b6 m9 F
- /**& t1 p; ?0 A5 Y# m/ N
- * 获取唯一数据
" A9 U( p, H- T6 \ - * @param $table
: X8 P" K' i5 R( ~- o2 `1 i - * @param $key b# C: t$ k4 @# z4 F' n
- * @return array- H6 R. G/ r8 q
- */# Y. A* Z0 m* L# m
- public function distinctData($table, $key, $query = array()) {
& r1 o0 d0 X; \ - if (!empty($query)) {
7 t! x( R: b2 M% f/ E: V+ G, z - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);& \; ~8 s+ S# H6 m z- M' [
- } else {* d$ E3 R X1 D) z
- $where = array('distinct' => $table, 'key' => $key);) ?, T, ]$ S, y1 V- r4 j
- }
, B" K- S$ c7 d. Q( C) A- N - $data = $this->database->command($where);( G6 O/ O- I. t! S' X
- return $data['values'];
! k+ M9 @, R$ p - }
! ~+ V) [! L. p( ~8 b, I - }+ s ^& {/ u1 D2 Q% R4 D8 x# |) U
- ?>
复制代码 * i! N0 d: g& O- C7 c
6 L5 ^/ x" N- P, W. g9 `. x |