本文实例讲述了PHP实现的mongoDB数据库操作类。分享给大家供大家参考,具体如下: 最近的项目开发中使用的数据库是mongodb数据库,因为小编的公司也是刚刚使用mongodb数据库,所以之前没有封装好的mongodb数据库操作类拿来使用,所以小编在项目中自己封装了一个mongodb数据库操作类,特拿出来分享,不尽人意的地方希望大家勿喷。 众所周知,mongodb是典型的nosql数据库的代表,受到很多开发者的追捧,近几年尤为火热,mongodb的流行不是没有原因的,下边给大家简单介绍下MongoDB。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。- }) ~7 H7 B+ \: l% z
模式自由。
. X \7 t- O4 n8 ^+ p) k支持动态查询。$ n8 m6 [. p) c! p. f
支持完全索引,包含内部对象。
4 g( T9 F( p/ x8 |* a9 W支持查询。
, s0 J& a3 N7 ? e& i7 J: Y支持复制和故障恢复。
4 r8 L* X, V$ A使用高效的二进制数据存储,包括大型对象(如视频等)。. {& w" d9 P1 S3 Z3 y5 \
自动处理碎片,以支持云计算层次的扩展性9 f1 Y8 F, n, f: Y
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
+ u& D4 I0 L- J Z1 ~文件存储格式为BSON(一种JSON的扩展)
3 V+ b+ B' T7 l$ x可通过网络访问 所谓“面向集合”(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, m& |3 c, v5 Y* c
- /**
* O2 z9 F D3 @% G1 T) B% [ - * PHP操作mongodb数据库操作类
7 x( q& `- u$ P; n: k6 ]+ l - */
6 X8 R. o+ B* I0 l9 [ - class Database {
) |2 a' i& K# x. L - protected $database = '';0 k' ]9 ?7 T" o2 ^) s+ J& o
- protected $mo;
- |3 R% Q. p5 J6 u x - /**
1 |2 P( x U# z3 x0 c - * 构造方法
, G9 T; o% a/ c& e7 B4 a0 Q4 [ - */$ ~" b. M: I+ j: b. Y
- public function __construct() {7 c" T+ S2 E8 V5 W: @
- $server = DBSERVER;
, Z* k9 Z) w( ?, l$ j$ h6 ` - $user = DBUSER;. c' r3 Y- {" `8 E: F. c1 i. Y) A
- $password = DBPASS;: _: h% O$ X' z8 x/ K/ B
- $port = DBPORT;. |/ t. L) O1 {
- $database = DBNAME;9 `4 ?$ K8 P3 a1 J% L/ |9 M4 t! S
- $mongo = $this->getInstance($server, $user, $password, $port);! r0 B, F& W7 x$ H9 m5 I
- $this->database = $mongo->$database;
% h7 l/ |, @) f; ]) F; o' P1 r* F - }& ~: r& |' u. _+ B0 f
- /**3 p- g; l: F* V5 h/ S0 t
- * 数据库单例方法
* a" G/ @' x5 B+ Z7 X3 y0 U4 H - * @param $server! V9 N; r6 z5 }7 p" G5 o* T9 Q" P3 _
- * @param $user
: F8 s; ~0 D+ c1 _4 {6 J - * @param $password1 l0 v/ k/ }' m( W, c; d% I2 D7 e
- * @param $port4 F% T+ H. e5 o4 c- i8 W
- * @return Mongo+ u6 G5 Z/ F0 u% T6 N
- */
% O+ E Z) {8 o5 }+ X - public function getInstance($server, $user, $password, $port) {! X. |7 Z1 F- b+ T
- if (isset($this->mo)) {
1 F3 L4 N4 S; q3 s1 t% f0 Z - return $this->mo;
, F1 B2 x( X3 o" U! P5 m7 ` - } else {
/ N6 k- e, s$ p; J! @) s - if (!empty($server)) {7 f$ b& o/ N- Q% U
- if (!empty($port)) {
& `, i+ x% k' O) m% R/ {9 [3 i# N - if (!empty($user) && !empty($password)) {- X6 g/ V8 b5 k( k8 j
- $this->mo = new Mongo("mongodb://{$user}:{$password}@{$server}:{$port}");
F- t# g7 h. B& f4 P - } else {
+ v4 [3 n. H3 q5 _- |3 d/ T - $this->mo = new Mongo("mongodb://{$server}:{$port}");7 b, U# q* b* W% x( h0 D3 `& M' y' `
- }
2 e0 A' P+ e. y) g( n; I6 I - } else {: D3 ~5 e0 ]" W) n
- $this->mo = new Mongo("mongodb://{$server}");
0 A2 C, Z$ m8 f' ?/ ~ - }
5 ^6 J) B" Q6 O - } else {
6 q# r' g0 w6 b" t: K- N' v! B - $this->mo = new Mongo();2 {+ ?) g0 [) x$ t& O8 y
- }
) k0 N7 e/ d2 S4 t' Z; ^" ~6 t - return $this->mo;
# w- \4 j0 H+ O o# Y0 H( H - }
8 @6 V8 v/ Q+ T0 ~9 V5 P - }
& v2 B! E X5 r6 y8 d- x7 \ - /**
5 w1 x" t; q1 M# e" l$ c& W - * 查询表中所有数据6 M" N+ w0 i4 I) ]- r, i Q
- * @param $table
; q" k( d0 e$ A - * @param array $where
, j+ s N8 r, V+ q - * @param array $sort
+ ?0 i# j h# U' O4 m4 R - * @param string $limit: K4 u; \- Z. q$ {0 U
- * @param string $skip. p6 V9 a$ \- [; h r( M. ~
- * @return array|int
6 E- t) h8 d5 Z' Z% v( u - */" {- o* g" C* h" X, B5 c/ n8 c3 U1 z
- public function getAll($table, $where = array(), $sort = array(), $limit = '', $skip = '') {
6 T/ T! Q- W# x, x7 r4 U$ o - if (!empty($where)) {
3 _) Z k& P* G7 A/ t0 b - $data = $this->database->$table->find($where);
( K: w' A5 @$ E: _, V - } else {& n% [" K% X5 f& R2 j# n) ?" C
- $data = $this->database->$table->find();4 I# ?, {% H5 a H2 j, H/ L9 b
- }
. f7 L$ e. S# X. h/ u - if (!empty($sort)) {1 ^; n9 i( O; r A$ c; x7 P
- $data = $data->sort($sort);. A' w! o: `% e: T6 o' `
- }
) W/ `6 L# a# Z/ Q$ m - if (!empty($limit)) {
( q+ `0 {' e' N* e - $data = $data->limit($limit);$ R+ c" M9 m3 l B! {" j, V
- }
+ g* p# T/ J5 r/ [ c! @0 |$ @ - if (!empty($skip)) {
% f) J$ u. c. n) G# z - $data = $data->skip($skip);
. h# y, A @+ |. B - }. K8 `: M2 D& O" E; N/ C1 Q5 K) ^1 G, F1 N
- $newData = array();6 H* V8 Q* D& x
- while ($data->hasNext()) {
- L1 |7 h7 ]" \$ [% | - $newData[] = $data->getNext();
3 D- I U$ s2 p8 m- K6 t - }' P. A! s, i; W2 W/ q& x; t
- if (count($newData) == 0) {
6 b9 ^3 H% Y- E5 c - return 0;
* c/ T: n- u8 S0 S. V - }: K/ C! W2 K$ w, L5 M- U) G
- return $newData;8 k, Q- V' H3 H2 q1 _& V
- }1 Y; G* Z: x( u) W5 B. U( [5 n
- /**; S2 F; @. N+ L; O; Y$ S
- * 查询指定一条数据
+ x6 i7 J3 K3 L7 {$ n- g - * @param $table
3 r, S6 e; }+ H, c8 j7 B- [ - * @param array $where
9 S3 T; _; ?9 t - * @return int! b z4 O+ @* G
- */
; ?* _% U" F6 t2 z8 `7 P5 ` - public function getOne($table, $where = array()) {
3 Y% }4 O: ~5 ]3 J% W1 s0 K3 R) _ - if (!empty($where)) {
/ B7 C" W% }; J2 d6 B. b6 ] - $data = $this->database->$table->findOne($where);* _' S( m8 ?; k5 V! o! m, T1 i
- } else {1 R! ~; R, y7 [# n/ s
- $data = $this->database->$table->findOne();' F1 l; V; I% g# c% V4 N) O
- }+ [1 o& e7 j2 R6 }9 H% k
- return $data;+ Y. v ?$ E) a" Z$ K; E
- }) o% M5 ?6 b6 \7 X" x# n- p6 J
- /**# P3 ^0 r- h: P5 w
- * 统计个数- e. y% f6 R% z
- * @param $table( X+ w' ^) r1 C3 C* o
- * @param array $where& E# o! D0 R7 l! e0 ~) y
- * @return mixed+ s+ d6 e# ^+ V, ~9 u
- */
6 k# l; X5 v" E" w - public function getCount($table, $where = array()) {
! O& Y4 @7 b% M3 N+ k - if (!empty($where)) {( `- p5 ~0 M0 P5 F& `; ]- [
- $data = $this->database->$table->find($where)->count();& u0 n- V$ b* c0 R' `
- } else {7 T& m5 u6 |) `! T) J2 U
- $data = $this->database->$table->find()->count();
; R/ a' [1 s& k6 e/ S - }! \' ]/ a( C% v9 m# `' v
- return $data;
9 `7 f0 f- K! R* U - }
" U" ~) ]8 { b9 i! r - /**' x$ ]# m1 m* D8 P( [$ K7 @
- * 直接执行mongo命令( P' w3 u, q6 {% s( v
- * @param $sql
) C. z5 N3 R+ M3 i - * @return array- m- L7 c- z# Y" }: M/ j& l
- */
6 j" W* Y: M' o2 ^7 M - public function toExcute($sql) {
; g% w2 D$ g6 N9 Y - $result = $this->database->execute($sql);
. t! A5 u! |0 i - return $result;
% C) l5 d" ~+ D8 ~! v0 i7 P - }
: O4 {+ [( H+ ]8 `0 h% z - /**& [0 z9 G: t; W
- * 分组统计个数
+ U" i" V5 C% `/ @* `) P - * @param $table: Q- e1 n% P: o4 M6 q
- * @param $where
, w) i' ?9 k4 t7 d, l4 G3 X - * @param $field& d% J% ?4 n' l: T5 R8 [
- *// X: A0 c# a6 _2 E$ H
- public function groupCount($table, $where, $field) {
' l, n9 T% R) [3 \ - $cond = array(. x! ?3 q% V2 h4 A: V
- array(- {! k. c% A4 t- ]% p
- '$match' => $where,; {$ d ^ b/ k g& A: A7 K$ b
- ),
: L8 o, a2 {8 ^0 J - array(
, b; h) R: @2 { - '$group' => array(( o0 X& X7 F* q# L
- '_id' => '4 S$ s: M% ?) {' ^! C
- * H: B) H% N6 b0 ?7 F, O
- . $field,( R+ j) b5 ] O+ B# P2 l; Y
- 'count' => array('$sum' => 1),
) G0 M! V! `: A( y4 t1 J - ),
. e% V& W; V+ d - ),& W2 F" M5 ]6 E7 J
- array(- y2 Y5 `/ _% l, H$ ?
- '$sort' => array("count" => -1),2 C1 ~7 s* Q7 V s) \( M2 r: I
- ),
! J- @* S. F8 t# S y- l - );
: d9 ]$ w7 {1 n2 v- F7 l, G - $this->database->$table->aggregate($cond);
3 j* R/ h+ A9 _) B2 e- W - }
$ z# [ B$ D* H- j1 g# K; V - /**3 c' X, ^/ @# L! S, |% U$ o
- * 删除数据( }" G9 e. n0 G7 k/ i/ z! T# p
- * @param $table" Z2 @) @: f3 E) z2 z/ v: D4 `' e% i
- * @param $where
8 o$ I1 K Q7 d" B - * @return array|bool0 ]3 \/ N! ?, f) g% d
- */
1 v8 H* ^5 U& f& b - public function toDelete($table, $where) {% L4 |$ T7 O4 \& j
- $re = $this->database->$table->remove($where);
$ _) Q% ~! |2 K( j' n5 k$ A! K# } - return $re;
# {, |+ t/ d, v2 Q8 E; | - }
0 Z9 h0 p/ R1 B' ?' Y, P* F5 s - /**
+ d7 w% b. t M1 w. {# j - * 插入数据8 Z! s5 U, S# A
- * @param $table
0 h; q5 B0 S1 n. m - * @param $data8 t3 I4 O; @7 \2 ~- d( a) g* v6 L* A, s
- * @return array|bool
' W7 d! O+ c5 G9 F N - */
9 z1 f; Y% _$ R: o7 g. R$ D6 Q - public function toInsert($table, $data) {$ a$ V9 x$ z+ f5 a0 G' K
- $re = $this->database->$table->insert($data);
. h/ L/ h" f, W( P% V) m4 F$ X - return $re;2 Q+ u9 h7 y$ G) ^
- }, v8 k, V. X, K5 W+ v0 o
- /**3 l) ]/ @( Y1 J: T
- * 更新数据9 n0 P8 {+ Y0 _ l5 z, [
- * @param $table! j' N% c0 @ f3 L
- * @param $where
/ O4 `) b( X0 K3 @+ _9 y1 \ - * @param $data
' p( v: N4 n0 D- o- @6 O - * @return bool
- ?' T) d; q9 j! p) p - */! X8 V& F7 z7 w! I/ F
- public function toUpdate($table, $where, $data) {
, t, I. X& C& ~$ m2 Q - $re = $this->database->$table->update($where, array('$set' => $data));- F! E' _6 Y9 W9 ?! G- C
- return $re;
3 n& r7 a' E$ `* ]7 K4 v - }
/ [* M0 q; B3 T) y/ c/ q/ @- T. L - /**, [7 j5 D0 o" W2 t+ c: v) J: K2 E
- * 获取唯一数据" `9 N) [3 v+ |/ C
- * @param $table1 i, i; c/ f/ y
- * @param $key# ~6 @% q6 G7 k* z8 {! b I
- * @return array
1 e" P+ G$ C" V: o j$ b; B2 z - */
' X) ] p N | - public function distinctData($table, $key, $query = array()) {
\1 r0 @, Y' z0 H - if (!empty($query)) {
8 x t A& s1 K, |- | - $where = array('distinct' => $table, 'key' => $key, 'query' => $query);3 q. t3 l4 u; ~" X; U/ h) I c
- } else {
) q8 p' w; S9 a9 H# b- w# D! p3 [/ L - $where = array('distinct' => $table, 'key' => $key);9 U( g( L1 S5 ? s2 Y* N' M
- }
0 z: V) E* T) M7 J$ k# m* _ - $data = $this->database->command($where);" @/ b" Y& c# ]* ~+ d' k
- return $data['values'];
7 q' ^1 k2 ^! E6 G - }% p7 s$ {& e5 b4 q" _9 y% D
- }
4 G- k& `3 L) F( i7 B: u: m, Q k - ?>
复制代码
) v6 L: @7 J9 s E9 ?
4 _ d/ w% {: y5 G9 }% I4 P: Z' E% ? |