|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
7 I" `* c3 c& D' y1 @& c模式自由。% ? W9 O' F. Z4 [$ A
支持动态查询。
+ `6 D0 ]) \+ o8 Z* s# R! ]支持完全索引,包含内部对象。
+ u! m7 Q/ I; {8 ]支持查询。; ~( \9 j1 o+ ]0 W# _; b* E7 S
支持复制和故障恢复。
8 i1 {! w# G `2 c* d# y使用高效的二进制数据存储,包括大型对象(如视频等)。 K& V2 E% @( |
自动处理碎片,以支持云计算层次的扩展性
+ [1 s' E/ f5 e" A支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。, p* G. h7 u& S, d2 X
文件存储格式为BSON(一种JSON的扩展), n2 y Z) U- r
可通过网络访问 所谓“面向集合”(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- `" a8 ~" B4 O: z+ A
- /**! A! r; I8 _+ \* B
- * PHP操作mongodb数据库操作类: F0 Y/ k- l# L( \
- */0 R2 u8 x* L- f4 X
- class Database {
5 a* V& W1 C3 d, K( Y( Z2 ? - protected $database = '';- o( k5 \$ x; |9 V
- protected $mo;
3 `7 d9 y! v0 i - /**
7 K2 A/ g* ]9 ?/ ?( j - * 构造方法$ _3 j! E+ n! O; ]" B
- */3 t/ A0 k$ B; C! C
- public function __construct() {
* ~# F. y4 u! C- t! V - $server = DBSERVER;
3 U, L' o! ^& p; F+ G - $user = DBUSER;
3 w7 D! {& |! {( [ - $password = DBPASS;* a) O/ T4 I3 g& Y" |7 i4 p, ?/ Y) t2 ^
- $port = DBPORT;) K D2 O% K0 ^
- $database = DBNAME;
& c' m0 w/ |) T7 `; w& H - $mongo = $this->getInstance($server, $user, $password, $port);
% U! N9 w9 d7 ^" x; p - $this->database = $mongo->$database;1 Z/ f4 ?, D* S, R
- }' k' X% n1 B" O# J
- /**% k5 C6 M( l m8 t$ C Y; s
- * 数据库单例方法
# Y+ B1 m+ [. k: L+ T: i0 F: i) m1 M - * @param $server
; ~5 K) ~$ o8 s+ ~1 m, J x, @ - * @param $user, h0 x \* a* B! X
- * @param $password
7 y7 d0 L& z& I* j& z" ? - * @param $port4 f1 _$ K( n. @# f: C
- * @return Mongo/ s. U# ]2 V/ i- o3 b0 o
- */! E& E% k+ J1 \
- public function getInstance($server, $user, $password, $port) {/ ?1 z4 A0 }1 \+ z' D& I' _: @
- if (isset($this->mo)) {
3 l4 R6 J* ]% a2 E# k/ u# `7 \( p - return $this->mo;
2 x2 C$ b* s. f! Q4 { - } else {' j. |5 \( Z0 W) |! a: G$ W
- if (!empty($server)) {
9 U- c* u$ f* e1 \/ C9 M3 A3 x) @, q - if (!empty($port)) {
1 D1 s' f& o8 X - if (!empty($user) && !empty($password)) {' a9 f- A5 z" H1 {& u3 H5 F n! T
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
9 C1 o8 F* a7 E" `% V. | - } else {- r8 M, e! I4 x/ F9 K- b5 r. y; t
- $this->mo = new Mongo("mongodb://{$server}:{$port}");: P J r* j% x1 g
- }3 G4 C4 ?# w. m) r) W2 |
- } else {
) @ N& M0 i9 @. _! ?( y6 R2 C - $this->mo = new Mongo("mongodb://{$server}");
0 ], q: Z4 r& _8 z# g& ? - }
( f1 r, n0 Y7 i3 }/ \ - } else {
" w3 {, o5 E) }0 q - $this->mo = new Mongo();
H; f+ T( T9 c) k+ G5 j& D - }- T$ H- l- A! G, x# P5 i
- return $this->mo;
5 @7 G# c& r# v& |8 x4 I/ g - }
1 B! `" z3 C+ I4 Z5 m - }
4 U8 f) M, N4 o& [2 S* r - /**
- {1 Y( _; I& Y# S7 h - * 查询表中所有数据9 b, L4 @2 D: I& ]
- * @param $table# {. s0 W! \1 P
- * @param array $where
' Z8 r0 X- m; `9 V9 }' A - * @param array $sort# Y& } }0 G! O. O/ }& I7 M/ R4 E
- * @param string $limit
( b7 b$ l4 U0 C7 U& l6 ~, G - * @param string $skip- z+ s) W5 S5 I" v
- * @return array|int. g7 L9 q' y/ N5 J
- */
. d8 g* a% B% ~& a1 ~; v3 } - public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
7 H6 n4 y0 c( H" U( ~* G: H - if (!empty($where)) {
6 Z0 c3 v, \* Z& \) v - $data = $this->database->$table->find($where);4 P0 L; k- s& S6 z
- } else {: n2 c }, N9 v1 f x: {0 s
- $data = $this->database->$table->find();$ Y; U( U- i' u+ k4 W
- }
. {$ O4 f" f/ x& c - if (!empty($sort)) {. C3 N3 i1 G7 L( K. U
- $data = $data->sort($sort);
+ G) `# `. m X* m& v - }9 f( H( c1 c; c( ] Q% P# Q
- if (!empty($limit)) {) o1 Z$ O4 f. X& ]; H4 E
- $data = $data->limit($limit);* H5 @5 C b0 }$ }5 e. E2 i
- }' Q+ p4 q. {0 p! E, M
- if (!empty($skip)) {& B, Z7 q+ S0 c M R1 L$ h
- $data = $data->skip($skip);+ F; f1 |" ]9 M% N
- }2 `, P* A% f# V# ]7 m* h g
- $newData = array();
7 k* }- r# k3 `8 g+ n4 Y - while ($data->hasNext()) {, x$ m& O# u9 `* F
- $newData[] = $data->getNext();
( K8 X# m9 U* R" A+ E% q) ^- n - }
% `$ X) Y) A- D& C - if (count($newData) == 0) {! Z( P' ?( ^. Z4 V
- return 0;
$ \: {$ D- d' z' P( T: f - }9 q2 ^' W# C2 J. r( d& R' L
- return $newData;7 K( @* \" Q; h& o d& D
- }1 u7 D- K9 F/ r, w0 e- b0 }
- /**
) \9 o- Y0 b4 V. e: B) K - * 查询指定一条数据5 U8 |- G% u: C) f
- * @param $table3 I% t5 N' Q W1 d6 K
- * @param array $where$ `0 G: {" \6 d
- * @return int* b7 ?) M3 l. G8 L; C
- */
: j: _& Z5 \3 w4 } - public function getOne($table, $where = array()) {
, D& d/ E( b/ b1 I2 u" s4 X - if (!empty($where)) {& X2 s @/ m+ Z4 P6 w+ b% Q( K( n: c# [
- $data = $this->database->$table->findOne($where);, `7 f. ]( d; s2 Z% z+ r
- } else {0 u8 i" \8 h9 [1 p
- $data = $this->database->$table->findOne();5 ?# n5 O7 }, V) @/ K& k
- }* p) _5 Z2 _' E9 m" ~9 C
- return $data;" J1 `8 `( Q; `
- }' l, N4 I# Q- R
- /**
) p4 U: {8 I/ ?! M - * 统计个数, ]3 y0 F9 |; b
- * @param $table
. D" V: O- j% }" m8 J8 Q1 R - * @param array $where
* \* t( ~ u0 g. o, O - * @return mixed
) H+ R$ c& ?- X. Z - */- T+ p, D3 ^% h. n
- public function getCount($table, $where = array()) {5 K1 G1 K' H% l$ o- w
- if (!empty($where)) {' w# t7 i# d5 q1 f; Z' F' k3 {, J8 t
- $data = $this->database->$table->find($where)->count();
$ U/ Z. [ L; U3 M) ? - } else {
+ c# u* Y+ H* \: b ]- f - $data = $this->database->$table->find()->count();
1 D( A' `$ ~' L1 m* ? - }
: {9 l5 @4 d9 A2 C! e - return $data;1 `; u$ E: G/ n6 Q
- }
4 p$ E( W& u& W' x0 l - /**
7 M: v' u1 R: d- P - * 直接执行mongo命令8 P$ s, H) I2 _$ \; Y
- * @param $sql
% O1 z) S$ S+ U - * @return array/ m. {7 N, T7 x$ O
- */
! A6 c4 o1 S4 @1 y& s2 e( Q0 e5 Q - public function toExcute($sql) {6 y+ q0 q' e( |" ?- R
- $result = $this->database->execute($sql);
/ i$ T" { j+ D' `3 I. c: m - return $result;
2 v' O) |% a+ Q- C - }
6 L) |( c, {7 m; W - /**
8 X$ w) N! A9 p b' Y - * 分组统计个数
9 n0 y- l( U% w7 u+ E - * @param $table
1 f: i t" B2 C - * @param $where
9 W/ ^' W" m, u. ~ - * @param $field
2 C6 J2 x$ g; _4 o/ O$ P( z - */# k7 |* h4 n. d5 [
- public function groupCount($table, $where, $field) {
! r1 b& t- K3 u' q2 {+ Z - $cond = array(
6 {5 x, ?$ f# r4 J! ]6 G! }8 @6 K - array(
2 a* ]1 J) S! ? - '$match' => $where,
# G4 C& _. F% N, F$ U - ),
" A# U8 ~' T1 t% M. M - array(
P% @; F) Z' { - '$group' => array(6 |6 t. I2 m c, f( @) t
- '_id' => '- K% u2 [7 K' a7 T: G9 g& M
- , W$ J" B. q4 z7 j6 t
- . $field," ~" Q% ?3 E6 t) T2 Q
- 'count' => array('$sum' => 1),
2 c, g$ ?$ c2 A: c( D1 w - ),/ E7 m! q% q3 \' H- g
- ),' d2 z* x6 H0 V- Q, H. n
- array(( K. {5 s& j1 P4 P ~
- '$sort' => array("count" => -1),
8 u3 c# F+ }4 C- s4 S6 C9 Z0 I - ),
/ n) p! w' e" ] - );4 F% }/ B( x! B/ m- {+ [
- $this->database->$table->aggregate($cond);
; W( b, `- P% x7 i9 t/ y - }
7 B( E. ?! x( T& v+ Q - /**
2 l$ e- @0 _) O - * 删除数据8 I# f- ^- K$ G+ r, p3 q
- * @param $table
, z; j/ [9 `; T/ d! Z - * @param $where
. Y' v6 K6 R7 X! O% O: `) P7 ? - * @return array|bool
" x: ? j3 }% C) Z3 G0 a7 C- _ - */; p8 T; O2 l# i" ]" N+ L% C
- public function toDelete($table, $where) {" m3 T. A+ Q9 p! G$ W# H
- $re = $this->database->$table->remove($where);; e. M% V. s+ s, p2 R4 _
- return $re;
& s9 N" {( D$ E: d8 p - }
; ^9 i _$ Y& f% H% e - /**1 |0 W# c& c$ F* Q }
- * 插入数据4 [, k7 R- [4 ?" @' ?% p0 A
- * @param $table" o2 v& j X3 V5 X1 b
- * @param $data" w" ]6 B0 i+ V0 f5 \2 J S
- * @return array|bool& ^/ N# q- a; v' h
- */
5 n6 e0 A$ ]8 F) n& B - public function toInsert($table, $data) {! z: o2 A$ i6 Q* A
- $re = $this->database->$table->insert($data);
2 P% _7 G) T# u& B. k5 _ - return $re;2 ]! v; r5 |5 v& R6 J( K6 h
- }
, I+ A$ J# X( X3 K& K' @3 h' j - /**
; j0 ~! `3 a. g - * 更新数据
& U6 O. t3 ]5 o9 F {* K - * @param $table
0 S) `+ q% T" Y, c) S% T- j' l7 G* ^8 N - * @param $where2 p U3 I7 v6 G
- * @param $data5 f% d7 ]6 C) J' Y
- * @return bool
/ g6 t7 l; \) _6 e - */' [ Q3 Q! C; p
- public function toUpdate($table, $where, $data) {
3 U" g; C- A3 _! v( N P7 \ c1 o( P - $re = $this->database->$table->update($where, array('$set' => $data));; _2 U0 @1 w: w0 ~
- return $re;
# e/ l# o: I5 X - }
~$ r# g% d/ ?) U* A - /**6 l' }! \9 L* `8 w! T
- * 获取唯一数据
, h4 Z. k" `# F - * @param $table
0 V: V, X) x0 j7 _! H: w+ W* u h - * @param $key
8 h/ e3 R0 J/ g# ]0 I - * @return array
6 |! o: |' {) a3 F) g - */
, N3 x: T( K! b- y - public function distinctData($table, $key, $query = array()) {
; _& D+ n4 @4 Y# b8 E - if (!empty($query)) {
* P" o9 s1 U" E' ]' _1 e - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
8 z, ~. o% n. ~2 t% t, G - } else {
+ ~. f( j* L/ T z- Q! Y - $where = array('distinct' => $table, 'key' => $key);
" s2 s2 Z& D4 S2 D. [: u5 S/ l1 P - }5 P4 J2 A @2 ]2 r
- $data = $this->database->command($where);& ]$ y" |: f, j, n: c. y: W
- return $data['values'];& K2 l6 a/ Y4 D U
- }
" d( Q x# }& \. M2 S0 ?: L - }
' w( y. I1 b v# ~9 [# A% e0 A) q3 x - ?>
复制代码
; W) T2 X, H; x( P4 N
/ B; ?# O9 D; p! r |