|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。& o5 j# C) w: P- X- R
模式自由。
; j! Z4 R! M2 \# l+ e支持动态查询。. x; e9 \( P6 u- X' {1 m5 s
支持完全索引,包含内部对象。( R" F6 m8 @7 }3 }5 L* ^" e! j6 M
支持查询。& _6 q6 p3 v2 c2 u
支持复制和故障恢复。
4 [' [7 R: l+ |% z使用高效的二进制数据存储,包括大型对象(如视频等)。( w# |4 \/ Q8 A2 }. n3 d
自动处理碎片,以支持云计算层次的扩展性& D1 c$ W! q& u9 d: L$ V4 G/ U
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
8 d; U4 |9 I: R" o k7 M' U文件存储格式为BSON(一种JSON的扩展)
% e6 V2 W1 v, e8 k7 R; ^" C可通过网络访问 所谓“面向集合”(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
: P% Z5 [0 o9 A: x6 ^! e5 K - /**
8 {8 ]- P1 L# Y: X6 H0 D - * PHP操作mongodb数据库操作类& P4 ]; E& a5 D+ c) Y
- */% `$ A3 v; b: U7 h" T
- class Database {' l9 i& _: t/ |( ~! L2 u0 d
- protected $database = '';3 _& M: N2 K; s- \
- protected $mo;! z ]6 A5 h) F( g4 P
- /**
; z( b6 Y7 H9 \3 {5 Y& V - * 构造方法
U9 c8 e$ k6 Z. \ - */9 k) ?( g9 A9 j/ ^; C
- public function __construct() {4 C$ `1 V6 @0 g2 h9 L' z
- $server = DBSERVER;
/ b' x, J6 E% r7 d2 w! Z - $user = DBUSER;
9 S: E/ T& U; P3 D4 B - $password = DBPASS;9 u0 u1 j1 I& z5 b0 ~# S: @
- $port = DBPORT;( N& \5 G! n+ u" y0 b+ `
- $database = DBNAME;
$ a- F; ^) o- g/ j' ]1 E, X - $mongo = $this->getInstance($server, $user, $password, $port);
+ ^; L& C7 M3 ~' G - $this->database = $mongo->$database;
* Q# Q6 Q# ^0 {: @$ V L - }, g5 M& u) H5 {% \. y0 y
- /**6 V- H* k8 x# ]8 q2 P
- * 数据库单例方法
$ F2 a2 ~, u, z - * @param $server
; l" \2 y) V& @2 D4 h - * @param $user, w5 u4 {8 Q4 e
- * @param $password B/ |& I" i$ N8 b. @2 w$ J/ V
- * @param $port2 W2 m1 t8 N2 V$ v+ U, D3 I) l: r; B( ^
- * @return Mongo7 n/ D4 P0 K8 S. R; ?) s/ M- l! L
- */3 S0 K9 F( B0 @2 }
- public function getInstance($server, $user, $password, $port) {
% q- F" U8 F9 ?/ f8 F. P1 w1 a - if (isset($this->mo)) {) x8 F% [) m h5 p U
- return $this->mo;# }' P, b: m& [. z& g
- } else {
/ `& z r) G% Z$ U& U _, n; H( G$ d - if (!empty($server)) {7 D; {6 Y6 E- c8 I) A9 I o( p t
- if (!empty($port)) {% k$ }% A# |5 W
- if (!empty($user) && !empty($password)) {
, R( r* o" T! J! I7 _% u4 T6 y - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");+ A6 F$ O* A/ I- X) o7 \% V
- } else {
8 c( |1 x8 v7 M, l" P - $this->mo = new Mongo("mongodb://{$server}:{$port}");# g: N1 H( ^* _
- }
# H; M+ x H; c# h6 C, \: u( v - } else {
* ]% g$ x4 w7 S! r/ x5 `& o# m, s! G - $this->mo = new Mongo("mongodb://{$server}");! L5 c5 B, H& @) I: n5 ^0 l6 H
- }: j* E/ A+ S+ s- @( c: Y7 E1 q
- } else {
u9 y" ^' ?3 C - $this->mo = new Mongo();* R/ j, v# u) p
- }
4 p0 U- ?* t( N: p1 } - return $this->mo;
: I% m7 K0 d, C( o0 w - }' J$ ]& |/ q+ A7 U& h+ ^
- }
5 i0 [2 U4 v0 ]6 r* q. @* C5 Y1 F - /**1 x0 Y: O5 w' f
- * 查询表中所有数据
( X8 S e1 X' e" s - * @param $table7 ^7 k9 @: J0 B7 C% w* \5 M3 r
- * @param array $where$ [5 G4 ]% y( Z- V: M# L3 l1 L- H
- * @param array $sort
) o- ?6 c" G5 A - * @param string $limit i) M3 W5 Q1 }; l8 h6 u. o* r# s
- * @param string $skip+ `4 l( [9 P, _0 U# W8 D8 A
- * @return array|int
' m6 \3 J5 H9 r' g - */
' \! X" F% t. H* T4 x - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
. \; g& \/ u$ o, u8 c - if (!empty($where)) {
2 s$ u; C2 q+ @ Q - $data = $this->database->$table->find($where);! L4 S! W# I3 p! O$ }) O
- } else {
( \. @, C/ O8 ]* I- _0 l# d - $data = $this->database->$table->find();$ @. \" l8 A" |; X9 C+ ]
- }
* y$ u8 S3 b* R! F, } - if (!empty($sort)) {
6 X# H, \+ M. [ - $data = $data->sort($sort);1 y) Y/ G4 r, g& K
- }
" Y$ G5 ?& v# e9 @- v n! o* A - if (!empty($limit)) {5 G$ q' X; [2 S/ X; J2 G
- $data = $data->limit($limit);1 Z& V+ C. j& W: g
- }* K2 `- g& X) M
- if (!empty($skip)) {5 U& ~' N4 w% M$ _% w
- $data = $data->skip($skip);1 Q* O) \2 `7 G9 u
- }
" Q' v7 f Z" j/ s: G - $newData = array();- Z$ A4 [ J4 H# w4 T9 `6 n$ w
- while ($data->hasNext()) {
" O# p; K8 Z. B8 W - $newData[] = $data->getNext();
7 b4 T. |5 e4 [/ I [% F: H4 v9 r - }; A+ u+ g! v# X3 M$ W
- if (count($newData) == 0) {
- s( W2 [9 M: I, m0 s - return 0;
6 N8 D2 A X* i, n6 v5 h - }% c/ v" Z+ L7 _5 I# q5 f
- return $newData; x6 l: H2 H0 v0 G
- }$ S& N6 N& M0 j) U* q9 W! s- X
- /**
% o/ s( A* h8 D6 f+ p7 `, ` - * 查询指定一条数据+ }8 J3 y' Q- }5 h& M
- * @param $table0 G; A8 ?. H, y9 q$ f5 S
- * @param array $where# S6 ^; ]5 e3 L# ?6 Q, r* x8 }
- * @return int
& i0 P D3 b( d2 ~% [! Y0 z1 n2 j - */0 F% ~6 ]2 B. l7 x. N y- H
- public function getOne($table, $where = array()) {
. O* Z& J$ d+ d! H: V9 c: U - if (!empty($where)) {
) a, Q' C. `0 n9 @- r) J7 J - $data = $this->database->$table->findOne($where);- q3 p( `9 I5 S8 U( k% u! c
- } else {
* E( q% X, P4 R - $data = $this->database->$table->findOne();
7 [; k- \ r" f# K7 { F2 G - }
& h# ?( M" u: C- ^3 z - return $data;' m U1 E5 _' l7 ^8 B. c8 ]; E" p
- }
( ?7 u7 Y% z0 n/ O! K5 e - /**1 U6 F4 e! R1 y
- * 统计个数7 Q, A4 y, A6 a1 O9 @
- * @param $table7 y, Q; }4 l J& c/ V# q( m
- * @param array $where
! u4 f4 t& F4 \ - * @return mixed
* `" [! H5 ?1 L% q. ]0 n - */
l/ H9 W0 \- i; j. | t - public function getCount($table, $where = array()) {; L! G) g; r1 A7 u0 _
- if (!empty($where)) {, v' L5 i$ `7 S
- $data = $this->database->$table->find($where)->count();# V1 o$ S- e7 [. z( {
- } else {
" ~, q; e2 ]% l2 N8 |* _/ i; I - $data = $this->database->$table->find()->count();
. y' r9 g/ a4 L4 s$ g9 C0 r, g - }0 H! j0 ^* x) ?8 H+ {/ N
- return $data;
! i8 S& u' V I8 w - }
. ?. X! `9 ?# k - /** v. D, {3 |* y/ f
- * 直接执行mongo命令
2 r; P$ j4 x' ?. l3 X, `8 P - * @param $sql
* e3 x% J. B2 _( g0 x/ e2 G; Q; V: T - * @return array+ {0 R: y, J6 ?+ J( q$ l5 m
- */
; v0 x8 v7 O- ?9 A8 G8 _ - public function toExcute($sql) {! h; c6 }2 X6 v
- $result = $this->database->execute($sql);- K- T! B! E- [ f' O
- return $result;
- H$ n; S3 L6 ^4 N! q7 e! d5 a" t& ^) ? - }
1 |. H% R/ L. U! w - /**
* K0 e1 h7 }! E9 q& v- {7 I/ [ - * 分组统计个数* i% K; H$ B3 y8 l5 y/ {
- * @param $table' X* f2 E: \% Q
- * @param $where# U/ ]; ]. g0 Y/ H) q
- * @param $field
1 a$ f c# E9 F4 T - */
3 U% _4 H/ a o; z* G - public function groupCount($table, $where, $field) {
& N' ?% [7 U' { O - $cond = array(
: y' V- b2 s- a& `4 k: c& ]" l: h - array(2 u& m) n0 M/ {& Z/ ~
- '$match' => $where,6 P, D1 F, n% ?
- ),2 h2 k- { P3 }4 A$ N
- array(
$ j: z8 \ U* @ - '$group' => array(
+ R A2 _! j) M$ a5 m8 [ - '_id' => '
; r& t( \% e5 B; A2 s& e1 E# n$ Z
: Y6 C3 ~5 C* u7 d# ]- . $field,
: A% O8 R* c s6 j/ N- P; ^# D - 'count' => array('$sum' => 1),
4 G; @7 |6 Y& K4 z/ T - ),- q, V( j& E1 C# \! E6 E4 x
- ),8 N: T" R6 I. |4 u
- array() J( P7 u' |4 [1 l$ e; t
- '$sort' => array("count" => -1),
" O5 H' r5 K! _. _# {& N6 w - ),% t6 q# A3 K/ v* D }- ^
- );
: m7 L8 S+ U7 O/ y* P3 k - $this->database->$table->aggregate($cond);6 U, Q) k+ I! d3 \
- }
* b4 [7 ~' i- m& h) c! m. m - /**. c2 f7 v3 G8 I8 Q0 I" s
- * 删除数据& c7 ]1 a F. x4 }, n8 X
- * @param $table) `* W9 a, w, j/ A* B" N8 \- `, K
- * @param $where
* }$ W! r) K' W! Z) Y. h - * @return array|bool# e& Q1 G3 g. _/ }
- */
+ }+ w3 {" r! _3 h- S' @ - public function toDelete($table, $where) {& y# ?) s s* O% A; p" Y
- $re = $this->database->$table->remove($where);
2 [! \% p' h U2 [ } - return $re;* K" |% V% _* j1 G2 o0 P
- }9 ?) X0 k6 M- T8 @$ u* y0 J) U
- /**
* t' _/ g0 j' J {" R9 K4 r, M - * 插入数据# f! K2 _% d* s9 o
- * @param $table4 B7 k( X ?7 O ~; B
- * @param $data
% @5 | ?; ]8 L8 a& ] _ - * @return array|bool
, e- Z: X$ j5 f# L1 F& y0 P9 ? - */7 t( Y' ^2 M- a
- public function toInsert($table, $data) {' \3 V9 ]+ L3 o8 Q, u5 f
- $re = $this->database->$table->insert($data);
) P7 O# S2 Y: W. l& K# A - return $re;( O4 N% Y' K8 W" ~' B
- }' e; L9 y9 t5 }
- /**! F: m4 Y9 z" B1 B! ?9 V
- * 更新数据, B$ F" [, c/ H3 _ X
- * @param $table* M) o& ? [2 @( K
- * @param $where
, _4 x* }; I0 {; j! F0 u* { - * @param $data
8 J. Z6 O! h% k8 C; I% w& l - * @return bool/ _9 A6 ~4 a2 F
- */
' I; P1 ^& x3 C8 G7 G" r" ?% O: r - public function toUpdate($table, $where, $data) {
: C2 O) n& H/ i9 H o& \% Y3 J/ n - $re = $this->database->$table->update($where, array('$set' => $data));7 x. k3 h- Q( H5 C6 E+ z
- return $re;* Y. C' i/ ~6 j; o5 O+ u
- }# }% O/ }# J4 u+ s
- /**% F% z1 ?' h" y, c1 Y; ]
- * 获取唯一数据# x. {1 A' m2 z3 i" p) Q; W. y
- * @param $table
4 J! ?1 B8 t" @1 O2 O - * @param $key
, J6 ?$ {/ t+ j) O! L6 @7 B - * @return array; U9 N0 i( T5 z U0 J- H8 {& Q
- */
, u- F& y7 N5 Q& }/ V - public function distinctData($table, $key, $query = array()) {+ e3 D6 U ~2 Z. F* z1 E
- if (!empty($query)) {: n7 {8 s5 a3 L8 _- u' j: @/ }
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);3 x, Z; b* X0 O
- } else {
+ _7 j9 u& f/ d5 P - $where = array('distinct' => $table, 'key' => $key);- x& h& o' W# u9 k
- }4 K2 P1 c6 |+ n
- $data = $this->database->command($where);
7 i) u. E, P+ ` f) y+ A - return $data['values'];
4 }- ?7 {6 ^3 { \ - }9 o0 p8 h% X2 S& T' T
- }
?7 z- O# U$ W/ [ - ?>
复制代码
6 g1 ^) Z1 N6 J; o/ f* J( Z! N# ^7 ~, M, c
|