MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()1 I8 a4 U5 I) ~- l& c
- //参数1:一个数组或对象 ?0 g! N& F( H. n* S
- //参数2:扩展选项" q1 s' J4 [# Y: l
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘- c! w, m) O7 { M: d# e
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
2 K6 K) P ~; ~* I - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
& C& Y, s4 ?1 D7 D) m" B. Z, g - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' M# l( C# R3 a4 M6 n8 T
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
+ y1 S# Q8 k/ l5 ], L - $mongo = new MongoClient('mongodb://localhost:27017');1 \" z R( B1 }1 W: W. K3 k& R# h
- $db = $mongo->mf;//选择数据库
+ i+ _( ^- Z( m$ l) u1 k, Y$ R - $collection = $db->friend;//选择文档集合
- r1 J- a3 X9 Q( M+ X; ^ - $doc = [//定义一个文档,即一个数组0 N& h P2 p' s3 l( P) ]
- 'First Name' => 'Jet',/ V5 ~$ _! T1 ]9 f5 Y
- 'Last Name' => 'Wu',& t0 A( |8 m0 _
- 'Age' => 26,) T* W& A+ k) Y" ]
- 'Phone' => '110',/ K8 p. I3 u% l- M7 p# O- f! m# Z
- 'Address' => [" u2 {- s+ D4 y8 P( |$ h
- 'Country' => 'China',. _% ]) E4 [8 H; ?& \; G' p2 F
- 'City' => 'Shen Zhen'% T) n: ^( v1 G8 a
- ],/ b5 J' ?. t. N/ p. _. D& c3 z
- 'E-Mail' => [
! T X5 V/ W: d: B+ y; Y - '123456@qq.com',
+ F, f8 c' q0 h5 [9 v - '666666@sina.com',- r. [" [5 \. G3 h; z
- '8888888@qq.com',
8 U: _3 M! o5 y- l" e& `/ ^& c - '77887788@qq.com'' o9 G3 U/ [( o. N$ c% b. ~
- ]
: q- C. R% O& E - ];
6 W6 P/ _8 ?8 w, B9 J - $res = $collection->insert($doc);//向集合中插入一个文档
6 [/ i+ ^+ q6 _4 ~# T1 {- q; u5 F - echo '<pre>';$ e5 X) |9 _7 ?2 j% K0 P+ w( S
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne(): e7 l7 f/ W1 T& c& T
- //参数1:搜索条件$ ~, O) w6 j* N( B$ O! Y
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
n3 L% b5 G& u" v* A% Y - $mongo = new MongoClient('mongodb://localhost:27017');
& r1 P6 ]1 p" E2 V) `5 A - $db = $mongo->mf;
" u1 I2 F H3 J" K2 ?2 @1 ] - $collection = $db->friend;
$ C: d4 R0 p5 t+ a* C/ f - $one = $collection->findOne(['First Name' => 'Jet']);
: x/ W* Z# c2 b4 M. u - echo '<pre>';8 {' {, H! J. t7 d+ B
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()8 f- f9 F% Z# B5 F% @/ M
- //参数1:搜索条件. y; l' R$ d2 @6 y# W5 S7 U. J d1 D
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段5 M! K2 g( S* \' c" ^& F
- $mongo = new MongoClient('mongodb://localhost:27017');9 e& ]+ Y5 q% e4 V" C# h
- $db = $mongo->mf;
2 I& q: Z2 v* f# F2 I - $collection = $db->friend;
: g$ ], K- q. Z - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素5 G( c0 s+ R" C, T4 ]6 l n1 L/ y
- echo '<pre>';
2 K' F8 q v3 G$ `- H$ T - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档7 F A: ~$ O9 u5 f- E1 o" | `7 N
- print_r($doc);; X! U. R9 m4 _* T
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' W# }( N, M4 k6 }' ? R
- $mongo = new MongoClient('mongodb://localhost:27017');
" s0 b( @; i4 X5 F7 ? - $db = $mongo->mf;
+ C' W2 [- [% K; T - $collection = $db->friend;/ B" Z. m; q# {0 _+ A9 s
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);) s5 j# O/ h2 I
- echo '<pre>';1 f3 U+ t5 H0 `1 p z' _; F8 a: v
- while($doc = $cursor->getNext()) { u7 w w0 }& Z7 o& O, j
- print_r($doc); f, T; ?9 t8 ?# z
- }
复制代码 //查询某个字段的所有不重复的值
' P# v1 a, G' z0 G- f $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个4 y2 x3 Q( J& Y% f# R' A$ Z9 [
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
4 ?! k! O( \) m8 M: ^" N -
7 }4 D0 l; R/ |6 i. u- y - //$all:匹配多个值中所有值(用于数组字段查询)
( {, V, e4 d9 t5 u3 a3 k - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
9 [5 T) E4 s4 D$ Z' r -
4 B0 F, X7 Y2 k5 c t - //$or:或查询+ k' W4 a+ \0 D. l
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);' D8 y* Y7 z8 ]9 F
- / D" ]3 d" ?8 M/ \
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
+ ]5 s# ]; H- T0 t: m) }4 { - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- g1 h0 M5 S+ W$ m1 n( ]
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
7 a1 k7 I& L$ o6 D; z1 z - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个9 z% g9 h9 O& m
- 4 B2 o' n5 J# |5 s7 L( X7 r0 K+ n
- //$exists:根据某个字段是否有设置值进行查询! ]- O5 U/ N" U g
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档" W* D/ h6 {( L% _, D: z
- 4 @& ]* U5 z$ ~7 w
- //正则表达式查询
4 _2 R( q, |, l' P6 T - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
) s z d4 M5 y - $cursor->sort(['Age' => 1]);! j! M4 r* f0 |) O! E: Z+ W* t
- ) w+ x4 F, A/ G! X
- //忽略前n个匹配的文档
" D/ c: N( z) R ` - $cursor->skip(1);* V e7 y3 g, R, W9 e( h( p F6 j
-
# l. S6 r1 Q, B; K2 d - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
7 y; S$ K% c$ L. l. y& Q. B2 o D - $cursor->limit(1);% v. ^/ o/ A' S* k
-
- a9 E. T7 T6 d* E% B - //匹配文档的总数
- ?2 E; Y! [$ y: ]( d - $cursor->count();
; |1 A( z* g/ L - 3 j! N6 ?: h: r( o# \1 y9 s4 H
- //指定查询索引
7 B+ p8 I4 E% m# p8 S - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计# ?/ v7 U* A. s
- $mongo = new MongoClient('mongodb://localhost:27017');4 C6 v$ }* o+ @5 c( e' O
- $db = $mongo->mf;
: q" \3 w- @/ n4 x/ H - $collection = $db->friend;- {1 j1 p; }) |5 E% g6 G6 ]
- $res = $collection->aggregate([7 f& K: B H0 v/ }6 ]' H+ [4 M
- '$group' => [
4 s! Q2 O" c; ~8 J2 d - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组$ L$ P& j3 M2 I
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
( E- x% E! ?4 s3 v - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
/ Y d* j$ h/ j" w. q9 I$ A$ [ - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
) q% n% e8 s: I( ~ - ]$ k$ C5 ?" ?" K2 Y1 p) i
- ]);* |7 @. Z2 {. {/ _6 W0 [2 A
- echo '<pre>';5 a0 w: y# o- w Y e6 N2 t
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
" m e. D* v, h; b7 l1 P - 9 p% H+ y7 S2 E$ R, v0 J
-
) K$ |- A5 ^7 h' z9 ^4 w* w8 B: w - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
1 ~9 P4 }0 M9 _% V' ]3 L - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
" T0 v( t' J% B& b9 \8 K+ ? - $mongo = new MongoClient('mongodb://localhost:27017');
* Y, g: S( }7 I! R5 @ - $db = $mongo->mf;' b) \/ L: `: ]- v2 k
- $collection = $db->friend;. Y8 p( c* _; [
- $res = $collection->aggregate([
" L0 n; N. E7 c - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
1 A! i' Z1 B& K7 J - '$match' => ['Age' => ['$gt' => 30]]4 t+ H; P$ I/ `; p! v+ }1 }
- ],
0 O4 y) }' y" ?- n# j O; ~ - [//指定分组字段、统计字段' x$ c Q% q% m% F4 P
- '$group' => [
# h0 N0 f% w1 w) x1 g) g+ b0 C) A - '_id' => '$Address.Country',
' J# L K z7 o' h- ? - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
6 _$ f$ l2 O. k$ V; J - ]3 j( ~+ x! c L, T' V8 u' x5 v
- ],* b1 g5 \ ~$ O; H
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
# r3 ]& a' P! w; }- L3 n5 W; _ - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
7 y6 F7 f7 V1 H - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
9 A0 ]& G& E: V - ['$skip' => 2],//跳过指定数量的文档* |- J3 O9 p& @" r$ r6 v8 ]6 U
- ['$limit' => 2],//只返回指定数量的文档
2 m! H% ^. c# @$ f- ~" F% f5 @ - ['$sort' => ['totalAge' => 1]]//排序+ P m+ Q" P: e" g6 I
- ]);, K7 Z5 q8 ~% w# w
- echo '<pre>';8 e* X. j* }* |% W, y+ M
- print_r($res);
复制代码
. e/ J& Q% g) K三、数据修改 - //update()" ?& c( `7 f. E& h5 Y
- //参数1:更新条件,指定更新的目标对象。
; s. ^- _3 |5 r0 l - //参数2:指定用于更新匹配记录的对象。9 `# L' q- {. o7 c) a8 E5 p
- //参数3:扩展选项组。
# `$ A: I- P" p+ a n1 c5 k$ Z - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
" E' m, `# u4 L8 i5 Q - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
) s) A+ Z T7 t3 F - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% B7 R& ~. {; J2 T# ^/ u
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' a/ Q8 z' U% E! I$ O/ k: I
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- V) T" c o; }
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
$ k8 q7 ~2 u, j - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)* v6 o, R! }$ E7 }1 p
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
. ?/ W! h# z+ ~9 I. D5 C l6 S$ g" u - ) V! D1 r9 B2 Q# M; p; M
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
: U) W& {: o5 j% L( D - $mongo = new MongoClient('mongodb://localhost:27017');
& n8 q* I8 a* f7 E: E - $db = $mongo->mf;, o* t* \; C4 @# p3 ~: O
- $collection = $db->friend;3 ?% D; s8 ]+ X o
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);) T; }" V2 a, R$ Q* h
- echo '<pre>';
; k( `$ {; O D - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量6 }5 t; T# x* D# l
- R9 U* i' n/ ]3 l J5 w5 U P* N
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
- p }1 c6 ?2 q4 I; `6 y4 v - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
0 y3 K2 @' o8 h' U' A - - c$ W6 c+ l9 x$ U8 l- T
- //$unset:删除字段
8 n1 ?" J( [# _& m5 w& o - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);1 V1 K' b$ ^. E \$ I
-
/ @9 a1 m X" L4 ?- M0 a - //$rename:重命名字段,若字段不存在则不进行任何操作4 \% P& }- A# l D
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
H9 ?" ^" \$ l1 H E0 r9 @ - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。4 X S- O! ]$ Y7 s# n% c
-
; n! k5 }- s* \ w! k4 Z+ O: H - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的: I4 \8 w+ e9 ^' W
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
% V/ |# T" W/ d$ m - 4 p3 }& D7 _: q) P+ Q! J5 `
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错% C$ Z( |# N8 q+ x3 K
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
, |" N5 }1 P$ \* |3 P8 i3 g -
5 K! L8 s$ h9 m6 R: g - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
8 ~% H1 G& H, Q4 G g0 P [ - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);" [; A" y- [' X$ i- F# A
-
/ \; [' D6 b$ R$ p- M" a: u L# s1 D% B5 ] - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错1 r; z& L' y; x/ d A
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);5 k; i* y& z; P
- * s' L7 e3 ^' J2 y
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)7 s3 b: W) J" S
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);" I/ l& O& s- w+ v, C. n* [6 M5 [/ M# q) Y
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);4 T5 ]% L) N, r
- : f8 h6 |& Y) H$ E
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ V$ n4 {8 r3 m( v
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ D& H, z6 v! f( ~
- * Y3 r. `8 B8 ?/ I+ N* z
- //$pull:删除数组中所有指定值2 W2 X1 X0 [9 t/ h! f
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);3 j5 W+ E+ u/ d' s) w: n6 m
- , ~6 _9 o' b7 b7 j/ A
- //$pullAll:删除数组中多个元素的所有值+ D9 o% B% V6 ]$ k7 J
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
6 s) d! [, v( q" u' k2 R) u5 F - //参数1:希望保存的信息数组
( @. \( }3 E% w1 H' d% H - //参数2:扩展选项- k1 T( f- f9 l0 V
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
- |+ L7 ]5 X; {3 `9 |* n - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
4 P( s- i$ {' E+ o @9 E; a# W - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
0 ]1 \6 h3 h; d; l: E0 Q# v - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
. B ~& J, y5 ?9 _4 l% q - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
3 z T- Z- _# p! H3 M* o0 B3 i - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
$ |4 p. A3 G) y$ E - //若想更新则应该在参数1中指定_id键的值。
" V c1 H2 b+ w3 q: V! O - $mongo = new MongoClient('mongodb://localhost:27017');
3 j. |) p: z- _& @' F - $db = $mongo->mf;
+ k# Q1 {: ?; q1 {! M) [- Z - $collection = $db->friend;% N) M8 J% J. G! I& d' `
- $doc = [//定义一个文档,即一个数组
+ x5 d- t' u" b$ I0 @ - 'First Name' => 'Jet',& c, u% {) W7 K; O+ v+ [
- 'Last Name' => 'Wu',
' V! M9 l& c* S5 a+ Z - 'Age' => 26,
+ z4 K) e! M s! t5 o( ~9 ^ - 'Phone' => '110',( S7 a& f2 m, P2 a4 e7 o
- 'Address' => [
4 R, E; R8 O( M* Z) t9 I$ Q8 P& U: p - 'Country' => 'China',
& ~+ m* j r" S7 t: V) S - 'City' => 'Shen Zhen'7 b# P( C7 f* |, A% ]
- ],3 ~0 m: _0 y' A0 [# l
- 'E-Mail' => [: I" H- Z1 o, O7 G* z
- '123456@qq.com', I* I7 p/ d6 c: [7 `( L" f4 m
- '666666@sina.com',
& t* ?/ w: ^* X$ _ q; w - '8888888@qq.com',
( @1 b+ s K9 n, t: h0 w - '77887788@qq.com'
2 V! z6 i" y2 V' q/ f - ]) F/ ]$ d% v" E; N4 G' I
- ];, o2 Z, v, `$ b2 a
- $res = $collection->save($doc);
9 Y) D) k( y! J, S" B - echo '<pre>';& l' U) s7 B6 j
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入5 n( j" Y: g9 |, E: v2 U% Y
- 8 {$ m$ P3 V$ v
复制代码- //findAndModify()6 U: Y5 r; u. A2 D! A f, X
- //参数1:指定查询条件. q w8 x& i5 s$ y
- //参数2:指定用于更新文档的信息
1 t& p8 K# W' n4 A/ d5 J1 W - //参数3:可选,指定希望返回的字段
0 |$ }, y7 D8 v9 s8 K% w; _ - //参数4:扩展选项
& R! w/ a) X5 [2 V1 l - // sort:以特定顺序对匹配文档进行排序6 U ~* J0 p( q8 G$ O
- // remove:若设置为true,第一个匹配文档将被删除
( c$ j2 C$ M% {% R, J - // update:若设置为true,将在被选择的文档上执行更新操作$ ^6 ?5 o% h2 c7 p3 O/ u. O
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
) F: z* h& i6 W$ ^6 p - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
6 j, c" Q0 z( r, Q- e" t - $mongo = new MongoClient('mongodb://localhost:27017');
) D6 `, l! p* C r( v! a: \2 `4 n - $db = $mongo->mf;
$ Q5 V, t% {6 ]0 E* k - $collection = $db->friend;$ N" z0 c) H" f2 Z! r G8 e
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);" { T; b3 }( j1 i
- echo '<pre>';6 |$ o! o5 {/ `7 H* o" s' n4 O
- print_r($res);
复制代码 四、数据删除 - //remove()
9 O1 e! u7 q) O9 G; Z; `! } - //参数1:查询条件 ]' Q9 z& {- \+ R p
- //参数2:扩展选项0 m: H, [$ V' S8 g& y# r/ y6 J" K
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
% W4 }$ K, e1 y! f$ B, Q0 J9 B - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, ^6 B D, m3 j1 L) Q6 a4 p
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
+ D' R) ~6 u4 m, j* d6 Y( Q7 n - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
- h) b/ X; x3 b9 E+ _& I1 y - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 |; g. O( Y5 u( ?6 \/ x8 z& o+ B
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
, J. S' d( g( N - $mongo = new MongoClient('mongodb://localhost:27017');8 v" Z4 z7 N+ I% b5 G5 C- U
- $db = $mongo->mf;
* g& | d# f+ N1 ^' ]- @% Z# a3 Y. k - $collection = $db->friend;* Z- N4 a! \. t7 ]! I
- $res = $collection->remove(['First Name' => 'jet']);
: d# O- l* U1 Y - echo '<pre>';2 I9 S& S, _2 t9 u8 s1 A. P
- print_r($res);//$res['n']表示删除了几个文档
复制代码
) Z, H y) L% ?以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
- c5 @& ^& f2 b% G6 a. I- R-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
2 X4 b: g) _& W/ J: |8 K数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017'); D2 j5 G1 [; P# S3 ~* c
- $bulk = new MongoDB\Driver\BulkWrite;
1 P" A2 g* M" R- Z - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
: \5 M$ C; e1 Z, P2 B9 v; N - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);* i$ n, M& f, C0 b( ? [
- 0 t9 `$ o6 u% d
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
& w n* b% U9 i3 ^2 W6 ^# u - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);) T/ D: S/ y* [% @! n# e
- echo '<pre>';1 P. f7 k% {- g0 u" S$ e" E
- print_r($res);
复制代码
. i+ C. \# ?4 w ^" K7 S+ Y数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
% d% D! i$ i: \ z2 [- d2 B - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);% R7 ]4 q& a! b" u6 Y* V, w$ S' p
- $cursor = $manager->executeQuery('wjt.friend', $query);
4 ~9 ?* Z- x% H) u5 p -
4 t. t) ]( J% J5 @) Y% Z: ? - $data = [];
2 j1 B- }9 A! h) y8 N7 Q, a - foreach($cursor as $doc) {+ ^2 g, y+ i- c
- $data[] = $doc;$ |! Y/ Z, ?* S) \9 o# M* O" G. ~8 A6 I
- }: H! \+ z' \, i" |5 n, Y9 [' E
- echo '<pre>';6 q4 h6 ?( c/ s1 I$ Q
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 z8 {( V3 x Z% m- h5 w9 v: k2 K
- $bulk = new MongoDB\Driver\BulkWrite;0 V" _2 k0 i" X- o% w! c+ f- u
- $bulk->update(% r/ F1 C5 ~3 E" }
- ['name' => 'JetWu5'],
. y S" M! _; J3 v2 O' J5 r x - ['$set' => ['age' => 30, 'promise' => 'always smile!']]* R! C4 s9 J0 J1 q5 }
- );
: |: W3 @' C/ b) G$ r4 | - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认2 ~9 Q) } s* N. o
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ E! s. s z6 ]; ~0 D
- echo '<pre>';8 b, r a6 \( ?& F |; Z0 C
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
( k4 k& A+ e6 s n6 l - $bulk = new MongoDB\Driver\BulkWrite;
: M0 i# i& J5 e% E( k N! \ - $bulk->delete(['name' => 'JetWu3']);
8 N2 V4 z) G! I- \0 I& T - $bulk->delete(['name' => 'JetWu4']);
! {. `- ]( Z" {0 O% u% _& g - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
2 M* m7 T$ ]" k2 I - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 ^7 W2 Y+ N1 t5 b \7 i5 W B' M
- echo '<pre>';% k2 h$ g4 h9 M9 k& ^9 u
- print_r($res);
复制代码
: B( k% k* h% }) K! T
. H' E+ T) U7 Z6 p
8 F! w8 a$ `3 t+ N- H+ k$ i; G0 P2 R! D& p% K* l) O! q
% I B2 w- @2 l4 l5 |0 o |