|
本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。
4 y8 N2 o7 O0 v) z5 x1 o模式自由。
/ ~( J7 c- z4 t' L; c! k1 w+ j支持动态查询。
, N! U: g( ]2 b2 B- r9 e2 [3 ~支持完全索引,包含内部对象。% f8 F$ T9 g# b0 z1 ~% w0 B
支持查询。7 n# d$ J7 w, d: K" M/ [! _
支持复制和故障恢复。* I+ s6 j: t/ {& l2 M2 z, i
使用高效的二进制数据存储,包括大型对象(如视频等)。
8 T2 N* w3 h. W5 H+ R" k自动处理碎片,以支持云计算层次的扩展性
3 r1 m+ l# G% Q5 s- a0 a支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
! r1 r( u. r& b' c文件存储格式为BSON(一种JSON的扩展)! h6 t1 e8 W. g* _# H" |
可通过网络访问 所谓“面向集合”(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
2 }+ f* n+ i* M9 ]0 B - /**
4 D: y; |: F8 w1 L) U3 x" a( L) t - * PHP操作mongodb数据库操作类$ {( A8 V6 W/ `* o- R1 v6 q
- */8 Z5 y4 d" b4 f" w7 |: o' D
- class Database {/ c* ^/ c8 b+ A
- protected $database = '';( H3 M; b! N0 ~- K0 O) E
- protected $mo;
$ ~; v( g: L# u1 u( S S - /**0 r/ @; m S# }& N0 J6 M
- * 构造方法
- h5 b7 x) X/ V1 F; f. {# p" m - */3 B7 q% N, c9 p- T
- public function __construct() {; n+ R# o# o# m' ?7 r/ f
- $server = DBSERVER;
3 L4 P s0 s: o e. a1 Y - $user = DBUSER;0 [. G2 e. B, Z8 `. @7 j
- $password = DBPASS; ?" f! a0 t9 f$ l
- $port = DBPORT;% } W9 P* o- a7 v: V
- $database = DBNAME;
$ T" [% w% D) I5 [ - $mongo = $this->getInstance($server, $user, $password, $port);) x+ d. k" O# x. F# B1 e
- $this->database = $mongo->$database; d5 g" p* }" ~! u: ] Q9 P
- }
- E2 n3 m* `3 k0 }7 B1 M - /**
& a9 j3 L+ x+ i/ _6 r - * 数据库单例方法
. `' t% _ A' Z* k0 a/ r B* O# T* D0 u - * @param $server2 t6 O4 c$ H7 x/ ~
- * @param $user
' P& w1 O8 z2 b$ L( n: G) m - * @param $password
4 e9 y. F3 ?/ V5 c - * @param $port# r8 G l, \8 G: J
- * @return Mongo
# Y: N t! {; Y: `; \! [$ z6 V+ X - */. h0 u/ |7 T- O9 K' [% q
- public function getInstance($server, $user, $password, $port) { \7 D. Z6 Z' s# I" n5 M. r; A1 v$ g
- if (isset($this->mo)) {6 y3 ^8 h# Z( b6 L
- return $this->mo;
3 y3 r' C6 ^( I; t5 n. w - } else {
k# b; V# ?- o, n6 e - if (!empty($server)) {# f) v. q1 f9 [' \# I6 j
- if (!empty($port)) {! b8 q: k8 t) ~9 Q! ^& r
- if (!empty($user) && !empty($password)) {- w( Y- h7 n- A2 n2 D
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");& Y+ b8 w( G, Y3 c: ]6 G- i& E1 o9 ?
- } else {
6 M: u9 |! @: V6 ?! v2 a* l' @- N - $this->mo = new Mongo("mongodb://{$server}:{$port}");
8 O- [8 {5 l' E1 D: Q5 {! N1 D - }
' j% a' j3 Y% ~7 W: N - } else {
1 u$ D+ R; k' r, X4 j z6 f, P$ e - $this->mo = new Mongo("mongodb://{$server}");
. k7 q# ^- ^1 s. ~ - }* c% k9 h [" Y. q6 E
- } else {
w4 | ?- Q% C' S9 T3 w \$ K- i - $this->mo = new Mongo();* ` O$ x( t: l/ @4 h: O* o/ I$ b
- }7 {! P8 C# e V! N0 @
- return $this->mo;
, q( R3 x+ J! I% k4 x4 y9 y - }! a% E# b; E1 o- z9 y
- }( u! E7 n8 F& Q$ ?- q! }+ y. u/ B
- /**- [* e+ L0 w% n
- * 查询表中所有数据
2 S- |/ C2 [9 ~6 G8 r6 V* W - * @param $table
% B$ O% h; A4 T - * @param array $where
. w9 i9 j8 `: Z6 \7 o7 i - * @param array $sort
! V6 `5 L# a4 ?1 Z e - * @param string $limit# t# Y' E0 o8 ^% ]4 G( {! S$ i' X
- * @param string $skip% ?% p2 K6 Y4 i( F! S7 w
- * @return array|int
4 O! o! t# z7 z5 r - */+ K: Y( P8 ?% c6 Z) w# b
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
2 f' V8 Y J) h. i( S4 O - if (!empty($where)) {6 l5 K6 T" D9 p0 [) s- O
- $data = $this->database->$table->find($where);, d' E( f% N; h% \( X! H0 o+ s
- } else {* g ]7 E, T+ y# C& J- j+ z7 T
- $data = $this->database->$table->find();
" z! p6 h4 t- W) m - }) a* Y, P: _" \- ~0 Q; n$ p% d4 P
- if (!empty($sort)) {" ^# | |; ` a; m
- $data = $data->sort($sort);+ N4 Q5 d2 D8 J6 N* M& j/ w+ Q+ }5 C
- }, W/ N9 a7 T# k/ |$ S% P7 j \
- if (!empty($limit)) {5 g( r6 [3 `, }
- $data = $data->limit($limit);
, i4 }( u/ m" P5 G7 d/ x, ]1 r: O - }
9 E, n; ?# H8 ~! e" ? - if (!empty($skip)) {3 k; a2 N. X7 D
- $data = $data->skip($skip);
5 z( {. j1 q4 ~ - }
8 P. }. \6 j( V/ p - $newData = array();$ M6 Q) x* |/ h/ m1 O
- while ($data->hasNext()) {
- Z( U. u1 _* b* ~ - $newData[] = $data->getNext();
1 i: {6 c* B, V k - }: w; J! c1 k7 ?" ?: X
- if (count($newData) == 0) {
1 \$ w) L7 F+ G7 M: B1 C3 m - return 0;3 i+ [: H1 t8 Z" f
- }3 A R" t( E! |& D/ E
- return $newData;$ {: o. {4 E" x" R% @- V3 B
- }1 P( ^% Z* t5 O4 @8 g
- /**
2 H' M! x' D/ D) @1 k4 X/ l' R - * 查询指定一条数据
" f. b3 L; j, B' C( O - * @param $table( z; H+ E" m( L# `6 f
- * @param array $where! |2 J9 M( A( M- y6 x4 K
- * @return int
/ _' D4 v3 E6 C( p; M - */
* O1 j. g' S5 \/ @% c1 } - public function getOne($table, $where = array()) {7 Q7 O# m) E! C! o V1 Z
- if (!empty($where)) {
" v7 I' q7 o: U; Z - $data = $this->database->$table->findOne($where);
$ K$ P" X W, i3 v4 r' L - } else {
8 k" d/ X4 w d5 g - $data = $this->database->$table->findOne();- H% _) x3 I. m7 ~! k" o
- }! j) h( i' s9 D, @ ^
- return $data;$ e2 M2 R% o+ p$ B z* n
- }
+ ]; `% e* A2 w1 R/ J/ K+ l* F - /**" W$ m2 H; z! Y9 g5 H
- * 统计个数
( k! u: q8 A! k" q8 b4 z3 o - * @param $table( Q# q! W! n1 j& e' @2 D+ z$ b
- * @param array $where
% N, h/ Y2 O' |: y5 v. l4 [ - * @return mixed7 x4 d/ w, s# G& Z2 s/ ?9 e
- */, ^9 |" i, V2 |: R( s$ |2 y7 H' S
- public function getCount($table, $where = array()) {
$ I8 F2 U% {6 [* D; Q" x - if (!empty($where)) {
+ @, Z' Y0 S7 y/ N) v0 d - $data = $this->database->$table->find($where)->count();
% F5 }0 v! C {! W - } else {/ b3 V7 u9 N" o$ J( B
- $data = $this->database->$table->find()->count();( p/ }* Q; G! _7 i7 S" ~
- }
# P6 N! `! {8 C6 U, T o: z - return $data;
; U3 ~; A; R6 I/ s6 L& ^0 o* E, N - }
) Y9 s* Q+ D" l2 H* f J$ k - /**
9 j, V( s' b6 j6 i2 r6 g3 @7 g0 Z+ O - * 直接执行mongo命令
& A% @: m9 M& ~1 m! v! @( W - * @param $sql9 ]+ [; E; K- C" L% D9 y8 W
- * @return array
' c z9 y2 L W, ] - */' M% ]6 K& l- z+ a4 S/ _
- public function toExcute($sql) {
" Q5 Y$ w( A7 h2 L. \ - $result = $this->database->execute($sql);: E( i9 Q% g8 {% B8 }
- return $result;
$ m% n+ L5 u& ?7 B - }
2 h9 u! a8 e5 a; a - /**
" I4 s9 f8 K7 T9 J2 v4 C: _ - * 分组统计个数& H( }6 _6 r* v* B+ B
- * @param $table% Q& D* C" X" m( q
- * @param $where
4 B2 H8 V" j8 S. a/ |" ^( { - * @param $field! S" o8 ]1 S5 z/ D! c
- */
% B0 W1 V% E0 m9 N- l/ ~ - public function groupCount($table, $where, $field) {! j& T0 |; k1 Q* q4 X8 h
- $cond = array(. d9 {$ R; s: x
- array(
9 w9 X) l5 T- P% l - '$match' => $where,
3 p0 I, h* c& h2 I" ]- ^) |0 k - ),7 F' y2 C; `9 m; t. Q$ z9 V
- array(
! g! Q# m) i" H+ h. i) b: y - '$group' => array() `" a2 E h+ ]& ]! L" x5 ^, M. q
- '_id' => '! \4 ^: h$ W }( H; ]
- 0 B- m, l4 B) B- ~0 f; h5 Y% F% z
- . $field,
0 V; B6 N" B3 I0 N( B/ L; o - 'count' => array('$sum' => 1),
- D4 v' L8 R/ L9 X) F8 l% {) k - ),
& ^% g N- m9 r6 t - ),8 h% |9 g/ w3 D
- array(0 ~8 ~4 A% H! i( t; K8 B0 ]
- '$sort' => array("count" => -1),
5 x2 X" u' x& l/ U `4 j - ),8 V1 K) V$ c) i& K+ x
- );+ m! \, `8 O5 T5 J5 Y
- $this->database->$table->aggregate($cond);& g: v2 _! A- j8 A; ~* Y1 A
- }% p& N( i+ V( u9 X$ P% Q9 {, z
- /** S$ | \1 X' P& N
- * 删除数据2 @6 d, V4 ]* G% L8 `, ?
- * @param $table2 f3 D2 ^3 J! J! S& {4 I5 J
- * @param $where: `: C0 q% @$ U4 ]( ]& I
- * @return array|bool
3 k7 {9 n$ [& t - */
" z1 y, D- ?3 B0 v6 D9 u - public function toDelete($table, $where) {
7 T0 I6 \! x" r& b. J - $re = $this->database->$table->remove($where); T5 j5 J% X1 Z! _
- return $re;
/ w& X( d. L' e* j" y. K& c - } R% O p0 J9 V
- /**0 a' N5 `0 k. l
- * 插入数据
% I+ U0 @* K0 N3 ~2 e5 B' o - * @param $table' h( B/ V( R. _
- * @param $data6 ?6 Q- W8 u7 Y& U* S" v
- * @return array|bool* |; t- z% I( t Q3 W9 e$ |3 a* D
- */
6 g A# T' n2 z; O Z$ X8 g - public function toInsert($table, $data) {
" t+ f7 e6 E& M2 ~+ I - $re = $this->database->$table->insert($data);& P& {5 } _3 V p
- return $re;: k# p7 S- |5 | z4 Z* B3 x
- }2 s: R a- b/ B) h
- /**) K; D8 _5 I6 t* u: |
- * 更新数据$ C; C) Y" O) C. y
- * @param $table% Y% b: c# M: B
- * @param $where5 Q5 z0 i; G7 E6 N/ ^
- * @param $data
3 ?# H) K* |" H1 A - * @return bool
& M7 O3 g$ n6 z8 y5 O Y6 G - *// W" I2 c- @) U# Y+ p
- public function toUpdate($table, $where, $data) {
4 _( M& D! `( s L; S - $re = $this->database->$table->update($where, array('$set' => $data));
6 U0 K* B+ n6 r7 \: g0 V0 ~0 x - return $re;2 f' f. ]! v3 P% i& z
- }
" Z$ f0 P, q3 y9 U E" J$ \ - /**4 x. Q4 C5 u9 l% l; A
- * 获取唯一数据
: c# z# z$ m* J - * @param $table; `0 S' ?. Z0 k: e. Q' t
- * @param $key
2 G9 K" f+ L" Y" `6 z1 J$ X - * @return array
- `5 z+ S5 {$ L c0 H( ]7 Z( Y - */0 I# }# f3 e1 L4 S4 ~3 W
- public function distinctData($table, $key, $query = array()) {
+ i- w ~& \& H" K - if (!empty($query)) {; h$ |" h$ s" [$ \5 Z
- $where = array('distinct' => $table, 'key' => $key, 'query' => $query);
! z) _3 p" j4 Y. g - } else {
" M% z3 K9 h( \ - $where = array('distinct' => $table, 'key' => $key);3 F, |' ~* w& [9 L
- }+ X' n# K U: r
- $data = $this->database->command($where);7 Y+ Q& F- `; z/ ?, }0 a! R
- return $data['values'];
" o8 V% y+ ^+ l C; ]2 { - }
0 N! w. }; t# I - }, e2 s6 L3 z! \8 X2 J+ x2 |
- ?>
复制代码 8 I' @" _" p- g" F! K! ^& D+ _
* s1 x% X! o; v. K" z. i& b
|