|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。) P5 H. x% B: h3 W9 u" n
模式自由。4 O6 w+ W! K' d% C0 T
支持动态查询。
$ K* [" y0 x: j: S/ n5 ]4 H% {支持完全索引,包含内部对象。+ g, F) b- e$ `7 W: h; |
支持查询。: j: _8 I9 }; M" {) r. X
支持复制和故障恢复。
7 u5 A- C% `/ @. y6 W* A3 B( [使用高效的二进制数据存储,包括大型对象(如视频等)。
/ J3 N7 ?& s3 o; T/ Q自动处理碎片,以支持云计算层次的扩展性+ G# g c1 M. y/ U
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
7 U" N3 w+ ]- ]文件存储格式为BSON(一种JSON的扩展)
4 L/ I4 ]" T: H/ U可通过网络访问 所谓“面向集合”(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
/ O7 |) \# P" h4 @1 Z2 b - /**
5 j1 f6 n j0 m! c' T+ p) n5 D0 | - * PHP操作mongodb数据库操作类2 S, h8 {- ^) C7 Y
- */+ m% g2 H1 S( w5 i. }
- class Database {
2 D9 V0 z" W% \2 H& c* i& d& }2 _ - protected $database = '';) Q. M6 b$ ^ V4 ?$ S9 N4 H% Y
- protected $mo;
& D9 m/ ~' R' o5 V2 X$ \/ q+ A - /**
8 F/ i$ I) K: ^3 Y9 |+ V _ - * 构造方法1 a: {; N2 D, J) L4 y
- */
4 R* \0 U5 M' b. G3 { - public function __construct() {! g6 Z8 m K3 l& J
- $server = DBSERVER;' z F1 c, }- E! _+ d: V* t# z
- $user = DBUSER; Z: l% s- P* ?* ?( Z7 }7 ~* P3 R
- $password = DBPASS;
4 L i; V- l5 e: K2 k - $port = DBPORT;9 Y, H/ L$ ]( j7 E, |* }. @2 p
- $database = DBNAME;! k4 b& e# V: X9 X6 }
- $mongo = $this->getInstance($server, $user, $password, $port);4 ?% s- C; M( t9 a( Z: \- A: J* b% I
- $this->database = $mongo->$database;% }- h3 a4 {1 L+ ^) i/ m2 f1 J& [
- }% [0 q( {3 f! ^1 j! \( i* m9 _
- /**
$ ^3 r) r; h8 M" H# I, v5 i/ y - * 数据库单例方法) l" {3 f, @' |" n. e$ A2 `0 K
- * @param $server2 Q3 }% N0 Z% d Z
- * @param $user
4 \5 Y/ D' ^6 Q2 U9 \* x: m$ l7 _" H - * @param $password' L9 c6 |0 z4 f- ?6 K- ~
- * @param $port; A! R* D4 [9 U5 q" u% e1 m6 H; G
- * @return Mongo
6 v8 g2 \, K# F% ?& a' x; x7 x - */6 o" b$ L2 B$ D) Y" p
- public function getInstance($server, $user, $password, $port) {
' P: [) z) c4 c+ Z7 V - if (isset($this->mo)) {
/ P( b/ x Q4 I2 ]1 n2 Z - return $this->mo;7 ?! ~. X+ s5 a5 D/ W
- } else {
- |$ o/ d- _; Y9 O5 R/ Q% ? e - if (!empty($server)) {9 O+ u- E" U2 M( M( |
- if (!empty($port)) {, b& I9 G9 H5 N" c% Y
- if (!empty($user) && !empty($password)) {
7 Q) }' T1 v; f! ~9 Y7 m - $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
9 ^& y* B3 u0 n6 |* O6 g - } else {
7 R, B. u5 F: c - $this->mo = new Mongo("mongodb://{$server}:{$port}");
6 H3 x! C Q6 ?- n+ m - }) m% Y }" T2 j9 B
- } else {7 A0 e, U: E5 O: i
- $this->mo = new Mongo("mongodb://{$server}");) h! K+ W5 A5 ~ e0 q
- }, V5 W, j" N' _2 ?* J9 X
- } else {! B; F; Q. }2 `, c
- $this->mo = new Mongo();
+ J6 D" ^5 j9 O( z9 M% _1 J- } - }, \7 m4 L) `1 | s, j
- return $this->mo; N9 Q1 X: r" z9 @$ S" t
- }
/ ]/ h1 h @" Q6 |' `; }3 W - }
5 }/ O/ L7 g W3 s/ E, T" a# H6 | - /**& O! Z# D5 [# j2 C/ _( f& o
- * 查询表中所有数据
8 A" t* b+ t/ h9 C3 x, k' | - * @param $table3 e+ c! `7 D0 l4 J: F
- * @param array $where7 c# L5 }% K- T2 q7 Z2 {
- * @param array $sort
4 ~" n7 L$ W, i" {1 { - * @param string $limit$ f; W( S T' _6 M/ N; `
- * @param string $skip
* N% s" R$ ]/ U i# Q% O1 ?/ ^ - * @return array|int; l- _/ m" |) u0 M# `* H
- */5 j$ \+ T% f! w4 q, C* i- C2 v
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
$ D F6 U0 t5 e6 X h - if (!empty($where)) {; A( {$ h( s; M
- $data = $this->database->$table->find($where);) U' l' ? T" i4 ^' Z
- } else {
- S) x7 n' S2 l) k7 Y - $data = $this->database->$table->find();# y/ l$ F9 A$ X7 `' y6 t7 F
- }4 \5 E: A0 e. O* L+ X* x% I
- if (!empty($sort)) {! V" p0 J$ S" D/ z( b8 N% l# N
- $data = $data->sort($sort);4 u$ T& ~0 f d9 F3 G p
- }5 H, n( ^& {0 m+ o: u
- if (!empty($limit)) {
$ _8 n5 c% S8 R: U* {6 { - $data = $data->limit($limit);
" |! H6 h1 n8 @8 n2 G! f - }5 p, ^" B; O6 [) @ s! V' h# [0 q* U
- if (!empty($skip)) {' ?# a9 ?8 H, W9 y
- $data = $data->skip($skip);% p: P% |5 M( C& T3 ^; k
- }7 x0 o" e- V0 f" z0 o8 I! k
- $newData = array();
% `0 r% L; i* ~' Z- U g - while ($data->hasNext()) {# Z. @5 @+ G, [1 _. e
- $newData[] = $data->getNext(); X9 s3 T. w: ^
- }0 _; |* Z a. F) t! H9 C
- if (count($newData) == 0) {
' l$ m, e# q" X5 d - return 0;
9 y3 e* M7 o# X" k c( M0 v - }: i, `% V, U2 K X! ~+ V
- return $newData;
( b( H1 [2 Y: F; ^4 X+ N+ Y - }
5 k+ p+ a5 `: X/ N6 d9 v - /**
O0 V! w7 A+ a0 o3 V0 e8 l& u% k - * 查询指定一条数据
; f7 O: n0 R% Q! h0 W6 o8 C - * @param $table% n- p5 m/ X, t' ^/ j
- * @param array $where
9 ~; S( ~* |/ M- j& r. i - * @return int
1 ]& x, L. ?8 w2 | - */
{) N0 T; g1 I& G2 f8 ` - public function getOne($table, $where = array()) {
$ M( X8 s# E* z+ G, S - if (!empty($where)) {' f! T: {# v. D/ \& ]) U4 ^( S) Q
- $data = $this->database->$table->findOne($where);& P, l7 S. h# C& |
- } else {
8 @, \7 f$ J( N3 A, Y- T& L - $data = $this->database->$table->findOne();
1 d5 D! j" [5 m6 g - }( q2 y0 C1 {4 [9 R2 \
- return $data;- e: l( h" O: _8 R( O- n( h1 s2 W
- }& o% H+ R1 d0 z+ V2 z1 U' b
- /**: a. U4 N& _. x+ H
- * 统计个数8 q' s7 @- x4 J% Q7 Y0 N6 w+ B
- * @param $table3 P2 {% ^6 Q- Y5 k9 J
- * @param array $where9 G$ [- _. y- }$ E0 M# d
- * @return mixed
3 n# g, Z& s, L2 E3 h3 \% u) G - */8 Z) t: {2 i$ D" Y
- public function getCount($table, $where = array()) {9 Q: ?8 x3 j1 h) T0 ~8 ^* M5 M8 y1 y
- if (!empty($where)) {
% G- w1 a, r$ K& d' M - $data = $this->database->$table->find($where)->count();
! I9 ~6 c' O, U- T8 S& f* ^! D: E* | - } else {: w) ^# A, G3 C8 h! u) O5 l
- $data = $this->database->$table->find()->count();
& O, w- M' g1 M+ f - }) O# }" J0 Y1 n
- return $data;8 [* l) @, o; ?# d5 T0 L) \
- }0 f# {$ U' \9 t5 [: f9 |& M& m
- /**/ ]/ B5 Y0 I, G( e1 J, R$ U
- * 直接执行mongo命令
. ~3 K$ a) ~$ _$ c - * @param $sql
( }+ Z& {* Q9 c. f - * @return array; }9 o1 `6 w5 V6 d; E
- */
- m* I7 w* @& H - public function toExcute($sql) {3 t$ I4 U: t/ ?1 T
- $result = $this->database->execute($sql);
& e6 i. }- H9 Y; m9 t' ~ - return $result;
4 m4 _! q3 C: Y3 W - }
; ~0 T0 N1 K7 i6 [% ^( D T0 Q - /**# i8 o0 i: a) O
- * 分组统计个数
6 V4 U5 [" U: @5 j - * @param $table
: E% e) S I) Q& [9 K4 Y# j. v - * @param $where
; C% x" s6 ~; L2 A5 o) _' A+ W - * @param $field) B, Y- M: x" @$ f b0 G; v
- */
4 L2 F/ I2 p- V- {9 B3 v - public function groupCount($table, $where, $field) {4 Y5 G) i/ m4 H1 `( d
- $cond = array(9 {9 K# ^) W2 }1 J* L$ m
- array(! A4 L' C" j; h3 O8 H- Q
- '$match' => $where,
0 J) M2 H4 O! m$ v0 z; V: s% d - ),/ D. s& u( q, |
- array(
5 \" }- C6 p C2 O2 T& o& Q - '$group' => array(
3 r/ ~; j S# \. S5 J5 V$ R2 E - '_id' => '
+ S ]7 G$ z& c0 p0 g% _- M - # Q L& j7 X+ m, w
- . $field,- G/ T# N" A( O0 W8 e
- 'count' => array('$sum' => 1),4 X5 t' @- @& V2 K. p. z" H
- )," c0 S. q6 v1 Y4 P
- ),8 X7 ?1 q% O( q+ M3 u l
- array(6 ^0 O; b4 J4 m0 B) X, J+ `6 _
- '$sort' => array("count" => -1),
' o, D3 ~. H- W. Y3 C* K - ),
! O U1 r9 @+ u/ n8 |, I - );
0 m( o/ ~$ N0 W3 Z/ D: ` - $this->database->$table->aggregate($cond);3 M2 i0 |5 T$ X3 p8 ~
- }2 c3 y% E5 p, [
- /**
8 W s" X* t) H7 {1 U" v: W - * 删除数据
- k4 |- i9 m* |+ _- f6 }% g - * @param $table
3 Q) a8 p1 b1 x0 y, O; x - * @param $where' Y2 p9 M4 q) g
- * @return array|bool: s3 Z6 ~7 S& a$ t" P) r4 o' g
- */* E4 b, @3 i* u( a0 O" d
- public function toDelete($table, $where) {. |7 a- F! s' L, g6 Y- `2 @
- $re = $this->database->$table->remove($where);+ ~, m9 ]: L) _# A& e2 N
- return $re;( a" S& @3 }2 n$ N3 j# K
- }$ N# K6 S7 {+ k
- /**
4 A7 g8 J/ q/ y0 r7 I) X0 @ - * 插入数据
_% K' P. q1 O! p2 I - * @param $table2 g0 ]5 v5 l0 x) T( r
- * @param $data- k: C& _1 U9 ~
- * @return array|bool
: P" |) N3 G5 Z, T - */1 N8 [6 Y3 G; M/ B
- public function toInsert($table, $data) {9 l; k( V/ G* b& j; o
- $re = $this->database->$table->insert($data);
5 e: \* f7 `0 E) k/ }5 c- P - return $re;! C( t$ }3 S q. j1 y* w
- }
8 O* R l% H/ B! Z x! ? - /**
& i/ g" g1 _0 f1 O1 B5 S - * 更新数据
# Z( o% e" h3 ~$ `* L1 t4 d - * @param $table
( n- c# b+ q( T/ y# v - * @param $where
6 R, N3 f- p: E, F% J, M7 } - * @param $data
7 n% w7 }$ Z6 ~; \/ }' B - * @return bool& d. n# U% D9 U
- */
% E. J3 q# Q$ n- A, W - public function toUpdate($table, $where, $data) {
6 d% o" h% k% C* l - $re = $this->database->$table->update($where, array('$set' => $data));
" M$ b1 \. e5 F }! g - return $re;4 z* s/ M! a h5 n
- }
) n# e+ ?; R* ] - /**
* {9 k& G4 @6 ^; y' U- ?1 Z - * 获取唯一数据) @: q/ l6 v! Z' z+ n; a
- * @param $table a& k$ O+ P2 u2 R2 g1 S3 \
- * @param $key
* f4 w9 X4 f% d9 Z - * @return array
! g; [5 K& e/ d# p0 T: R7 l - */
. \+ d# S: f' _ - public function distinctData($table, $key, $query = array()) {
4 `* O* Z6 R6 b& R) l+ w - if (!empty($query)) {
# c0 Z1 i" P* o6 b+ d* Q - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
% j" Q, ^4 Z" I! G, d5 d5 Q q - } else {
8 _/ c% c2 O8 y- W% A - $where = array('distinct' => $table, 'key' => $key);
. d0 L A ?1 z; b6 v9 N3 j. j - }
& G3 q. C9 c# G; Z - $data = $this->database->command($where);
- u0 w. U: P" |* I; f - return $data['values'];& O' U7 h" m P2 j3 ~% p: H3 g, T
- }! y! K: y3 p- `( C
- }
; V/ I; V- r" D/ c5 [0 Y4 c, N - ?>
复制代码
6 N7 s6 q/ r( ^/ O0 K9 B8 x! R- z( |) M a: o9 ]% @
|