|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
8 S0 H0 ~5 ^ _( M模式自由。- e) X, F$ g4 P% t4 S" E
支持动态查询。
2 ?; T6 ~- x1 q支持完全索引,包含内部对象。
5 M& Z: u5 ^5 n* }* F; |支持查询。
; W) f# L& k+ C+ n/ ]3 ?8 x3 G& Z支持复制和故障恢复。
. V2 W3 F1 u% b7 E: T使用高效的二进制数据存储,包括大型对象(如视频等)。
3 V5 B, D4 u* v! V9 D y; @* J- L自动处理碎片,以支持云计算层次的扩展性
- }4 @) A g3 }5 L' P4 k: X支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
$ I# p, P+ f' I- E; @文件存储格式为BSON(一种JSON的扩展)
! {6 e! b$ d+ G Z V3 m3 v4 X1 s9 m可通过网络访问 所谓“面向集合”(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
4 |9 S5 g7 y. Q* }, { - /**/ L5 i4 \" V* H9 a; `% P
- * PHP操作mongodb数据库操作类
; f$ p+ J) H) Z- q3 K; V - */
; s L; v6 _' h/ k - class Database {
" D, u) X7 ~/ M0 J* \/ a4 H3 x( ` - protected $database = '';6 x8 ~1 a q7 Y V1 E- l! M. _
- protected $mo;
: t+ |# o3 V* H# m6 L - /**
) I; J( ^4 }( q5 f% w0 x - * 构造方法
J" m0 N( b4 [7 u" x; s* }3 z - */
1 f, @* U T+ @/ K; f0 J+ V - public function __construct() {
- O2 a; y0 x8 w/ w/ M o1 F8 x5 p( [' z - $server = DBSERVER;3 P1 j4 A7 _$ r- t, T( }# P% R, S- Y8 \
- $user = DBUSER;
$ J8 s: a3 U" n5 z' V. G0 Y$ \& K - $password = DBPASS;
3 p2 D5 w H+ P. h - $port = DBPORT;
, n F! y( h4 J0 c Q+ K - $database = DBNAME;
) Q7 v6 h3 ^0 x6 U+ Q - $mongo = $this->getInstance($server, $user, $password, $port);
: i. W# M* @9 D0 w) O - $this->database = $mongo->$database;
8 h1 R% l8 B5 g5 Q O - }% \; {( _- w3 z2 l0 c
- /**
6 f3 c' W+ E" j* @0 C: h( ]. Q - * 数据库单例方法- O7 j! Q6 C, C8 p. i B" }/ f
- * @param $server
' D; u& O: b& p) y5 h5 b - * @param $user
6 S/ w7 A1 ]$ ^ - * @param $password
4 k' `, d2 L. w% ?2 ], m - * @param $port
: _9 H. u6 }) ^# ?4 o - * @return Mongo! M! L4 `: q! y
- */
' {% D* y' u6 D) z8 r' [# U - public function getInstance($server, $user, $password, $port) {9 N f; N7 h; S2 X/ a+ j
- if (isset($this->mo)) {- E0 ~. \) @) R: d8 R' L4 j# ?/ S% f0 c
- return $this->mo;
' m( l2 |+ @8 ]1 e3 a, N1 H - } else {
: t! y$ x+ M( B+ _0 b. J - if (!empty($server)) {" E0 ~. F0 P# {+ I" v! z/ R) B2 U
- if (!empty($port)) {5 {8 q' _. _( i/ C3 Y4 [! `7 `
- if (!empty($user) && !empty($password)) {
$ P6 i% o9 ~* Y+ c+ i1 ~: h/ i" y8 j$ { - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");9 n3 k) Q( G! M* d" ~
- } else {
" z0 k" P5 Q# d5 U0 M7 D0 I+ A - $this->mo = new Mongo("mongodb://{$server}:{$port}");6 D X* F# k8 ]( v/ n, C
- }+ C9 i0 `. N( v" m& F5 m
- } else {
}1 _9 y! d( O8 \- u/ M G - $this->mo = new Mongo("mongodb://{$server}");# y' k0 E: [6 y! S, S
- }) I0 z' H& A2 U2 ]- _+ {
- } else {+ h5 X4 Q3 A9 u; ]5 v
- $this->mo = new Mongo();. N! ~6 i' j$ m0 u& q$ c
- }
* T6 W6 W* Z4 S1 e: ^) `2 D - return $this->mo;
% w1 v( Q4 w1 U. Q; f) n& ]' L - }, m; F7 R. J/ E0 S8 i: g/ F
- }
, F/ D7 A7 e/ A" f& v) Q" o - /**
. c; Q4 k( Z$ p! \. W) q - * 查询表中所有数据
/ _" D: h4 {/ @8 ?1 G. n# V& N9 Q8 b- h - * @param $table
) [4 ^0 F$ ?! D. X! m. m G- y5 x - * @param array $where# l- m( x4 n2 ^, M( \8 R
- * @param array $sort' k, E' e1 x9 e; U5 Z' S
- * @param string $limit4 l% Q2 H& p7 q8 |1 D
- * @param string $skip' i* T! ~; Z! ]( X7 M
- * @return array|int/ ~; ]( _) E0 C- R! _# Z, x
- */; i2 p9 `2 W- f/ F: O N) ~$ m; ?
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
* u! X' k2 X1 Z4 P1 Q - if (!empty($where)) {
7 n: `% c2 e' C2 u' P s - $data = $this->database->$table->find($where);# i2 @' Q9 T- p$ k( |( i& L: M
- } else {
0 z6 s) a* \2 i: N - $data = $this->database->$table->find();" K/ K, r8 G/ ?5 K
- }
7 S y7 }8 y9 F# |, e% j9 i - if (!empty($sort)) {
$ I/ V# u' a$ H2 W: E6 d - $data = $data->sort($sort);
, b/ b8 ?5 P2 \; P - }
$ W/ e) G; C6 c9 R; m3 J - if (!empty($limit)) {5 \' Y. g! g/ `" D1 P
- $data = $data->limit($limit);8 z8 i w( ]: P1 m N( L
- }
' M$ M6 J; n; t8 J6 F, P - if (!empty($skip)) {" L) |# C! K$ D
- $data = $data->skip($skip);+ ~5 d8 [( `( b& b
- }! b9 F8 f! K# U Y
- $newData = array();
* T: Z/ \. V, N8 \* V - while ($data->hasNext()) {
5 M3 D$ t4 f* a! D! `1 z/ W/ T4 R* j - $newData[] = $data->getNext();
; E+ H/ x* \& e5 W; P# D# |3 t - }. v: m: y1 a' B, y7 K/ T
- if (count($newData) == 0) {
% v* W, X/ C2 t" r' A! S. @9 e6 j - return 0;% h/ ]2 r- O/ J+ q2 h! X
- }% F# g! E$ |0 C$ U
- return $newData;. Q8 A3 f. M' b/ ]* y. m
- }
# b. C: z& X, Q; r( l - /**$ M( G2 ]' ?6 m
- * 查询指定一条数据
3 _! ?; l+ S- u5 n4 H2 R - * @param $table! I" F6 B2 W5 }8 z( J- `1 W+ K4 e
- * @param array $where
; |2 h+ W. v' | - * @return int
7 _$ C3 K5 _5 ^0 A: p, L: i - */! i' c3 Q% R, o2 z
- public function getOne($table, $where = array()) {
4 C9 z: M( {8 N3 E* J+ V - if (!empty($where)) {6 A, s4 | ]) w4 l( X; V: ?
- $data = $this->database->$table->findOne($where);3 a7 j) _# x0 f3 C
- } else {
8 Z# x: X4 w: F9 z* B - $data = $this->database->$table->findOne();/ V. O p% F7 E) m& r, a, O$ }3 C
- }
5 M5 H9 ~/ A8 O - return $data;
2 i& v) V& H5 O4 ] l, b - }
7 _( i7 D5 I$ J) G - /**: s6 i0 K: c, h1 I, q. {; | E9 u
- * 统计个数/ j+ Q4 M3 O* e6 k- |+ j
- * @param $table* H5 ?8 U% g" l4 d1 @' d6 J" R
- * @param array $where2 U4 A; e; H8 d' c
- * @return mixed0 j* ?( R& C& o! @. b& h
- */
' U9 o; Z2 N$ A6 i+ e - public function getCount($table, $where = array()) {6 V$ @' A1 a! P5 s
- if (!empty($where)) {
2 S# W1 f Y7 S, C( {4 T - $data = $this->database->$table->find($where)->count();! ?3 k& H! Q2 |) P# q0 K6 Y
- } else {; { `8 ?( p8 \
- $data = $this->database->$table->find()->count();; H0 u/ S5 {! w# w/ C
- }
7 n! E% |' k! x" t7 v4 u - return $data;
4 c! c: I7 q- d) K+ `2 h3 T; r1 U4 w - }+ s8 K& A4 f. ? ?4 G
- /**
& R& ^1 C6 p% Y6 F/ d3 d8 @& ^) h - * 直接执行mongo命令
5 L$ U+ x1 G/ ~2 V. J, H - * @param $sql
% t# c; E! h0 e3 a, Y# Q - * @return array% E( L; F8 t- h
- */
2 Z& T9 G3 ^9 K0 [ - public function toExcute($sql) {
: H. J) V) R2 v$ Z: n7 y. B" o - $result = $this->database->execute($sql);
) l& ?$ I- i# p% o8 Z! A$ x9 i - return $result;, d `8 t) q, ?' X
- }
% z, j q( {, ?, y1 J1 h - /**
( s6 y4 [3 ~# B - * 分组统计个数
% c3 Z( {! a7 p- H5 {; C) P4 v - * @param $table- _: Y2 t; e: @5 J3 A
- * @param $where
' I$ V- V- c. ?1 h - * @param $field
& g/ _9 _( q5 i8 a - *// b d. e1 L9 a
- public function groupCount($table, $where, $field) {
9 i4 U% X! P5 _6 a2 ]" r - $cond = array(0 `7 y' }# O9 c. p
- array(
* q& {0 ]5 }1 Q6 o3 V. a! ~2 Q1 n - '$match' => $where,
# V8 F2 p5 P' a. X; {8 V - ),
. i/ D) `8 S; ~/ z3 u0 v8 x3 _ - array(# g) m; g% [. g% U+ |8 k2 a
- '$group' => array(
4 W( g7 Z. r4 A( o& X& q G- M! a1 |1 z - '_id' => ' k+ I+ U. z1 {: I0 E0 Q
! _2 _7 w1 N4 Q7 J5 Z$ m+ N- V- . $field,
( _7 M' r. `& h, C - 'count' => array('$sum' => 1),
2 c6 z, n9 T. J. h2 C8 x - ),
3 A- j$ e' A5 P* t$ Q* U - ),& F& ], ~7 q) i( z* |& p8 H4 Z
- array(" l3 U9 b- Y( Z2 I" r
- '$sort' => array("count" => -1),) g% l0 j4 i: I# H# ~4 g8 k
- ),! I6 v* x y# j
- );
5 f T6 d- V: r0 H V - $this->database->$table->aggregate($cond);( Q- \3 Y4 l0 m8 d: j
- }2 G' Y& P$ X; v! D/ f
- /**
. c; M0 ^: Z9 ? - * 删除数据6 O w& g1 {; ?4 a! f: N* B
- * @param $table+ j- f/ ^" T: v; {: z! e. e! e
- * @param $where& ]+ i4 m' j$ e; m6 y" P4 S
- * @return array|bool
# P( r' A4 ~3 N* V, X% N! ^ - */
. }9 W$ `1 q$ c) U! J# X8 O - public function toDelete($table, $where) {
& K' a- M$ v* f' b - $re = $this->database->$table->remove($where);
# M G \0 }7 k9 x6 i) y% @& h - return $re;: q8 y3 }) c! E' ~/ _, a" d# e' k3 @' X4 R
- }
8 S g. X9 U3 | - /**
4 n# F" B! F" s" S* }" v [8 b - * 插入数据; v- G& Y7 J- Y* x" `. k
- * @param $table
1 t$ D; D9 R; o* S. E - * @param $data
3 u5 G# \' O9 A0 u$ S7 j - * @return array|bool
$ f( m& u6 _! E' ?; i - */
9 F7 y- E) I! N: I- r8 W. B J: L - public function toInsert($table, $data) {7 w* O6 P: i6 ^' f
- $re = $this->database->$table->insert($data);
1 Z# f c, T+ f# `* W - return $re;) ` K7 s2 T0 c8 J2 g5 V: `1 ] q5 l
- }
. c# w+ H3 x( }, e: J* \0 O& C - /**
1 n: E: o- y: i7 _2 m - * 更新数据9 I6 r/ r0 A( v) F c! J
- * @param $table; G: H( W2 B2 l! Q$ a
- * @param $where
; D e# {) u8 G. v5 M: q+ z9 @ - * @param $data! H+ e3 I. n& Q# s, U3 y0 i
- * @return bool
# I) S9 z4 ~9 ~' q* Z5 t& W - */
- q7 q$ \' F7 s2 q/ h+ } - public function toUpdate($table, $where, $data) {
+ n% L( h2 t0 K$ u* H6 p w: j; e - $re = $this->database->$table->update($where, array('$set' => $data));. C3 l, y7 i" c. S( X3 C
- return $re;3 [/ O& F' d" o+ [$ s+ r& ?1 Q
- }
* A3 y; [8 X" @, Q - /**6 f1 p6 N( q" ~0 |/ c! V" s
- * 获取唯一数据
6 \3 u8 P% L; j! |0 h- ^7 E/ h. o - * @param $table* g) F; l1 `2 }' j# _, d2 d8 q% d9 \
- * @param $key2 L8 b7 H7 k8 q- H9 Q; ?
- * @return array. e/ C) K8 \# ^
- */
% A0 u6 |! _, I7 }2 J - public function distinctData($table, $key, $query = array()) {% V* [6 c% J! t& ]. o
- if (!empty($query)) {
2 J' o% M/ N; f) y- r - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
# {' r" K5 a! U8 d - } else {
4 v! @+ c9 c: m - $where = array('distinct' => $table, 'key' => $key);
4 B) Z$ x7 Y# `0 L# w& n - }* M; ] D) W+ U
- $data = $this->database->command($where);
: Z8 P+ T2 l2 G/ _+ v7 M - return $data['values'];) s! _2 ~! u4 x$ u j. l- G
- }6 Z: u, [, R8 v2 V3 \; g
- }
6 T# p, O8 s' n9 F; X - ?>
复制代码
# I8 ?- ]4 e8 z, l9 Q f: F2 T: s5 t+ `' a, i9 v, |
|