MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
- j( G; _- Q* r6 M2 m# @9 V - //参数1:一个数组或对象
6 k+ J% C: j, P - //参数2:扩展选项3 m2 R8 `1 }% C$ F* Z
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
" j9 Y- @) }7 R' A8 H, `0 e- \9 f; @ - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志+ D8 e8 g1 d& S3 [
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认. m3 ]. T7 f# }$ h' K
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ F; G7 s2 O M. k
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
( R r' z! `; d3 ^ - $mongo = new MongoClient('mongodb://localhost:27017');
/ r/ K) _0 _1 u - $db = $mongo->mf;//选择数据库
( w+ J3 Q9 m: S2 C: [ - $collection = $db->friend;//选择文档集合0 j' m8 R0 Q% L; Y2 C
- $doc = [//定义一个文档,即一个数组
4 z- P8 }" d; ~; v - 'First Name' => 'Jet',1 ]3 I; Q! e4 R* k$ e
- 'Last Name' => 'Wu',
( E5 _; ?- a" H" `) s0 e - 'Age' => 26,0 h$ P8 M* U; k& p* n) t, v
- 'Phone' => '110',4 U* p# a6 G% C" I/ U: z0 P7 M0 g
- 'Address' => [6 @, Y& g5 D; M V5 L1 H* @
- 'Country' => 'China',
: W1 t0 h( [+ m" x - 'City' => 'Shen Zhen'7 c* F% Z$ l9 ^# {$ I' Q
- ],7 V; C+ E1 Y: L7 {( [- H8 y4 |& [
- 'E-Mail' => [
3 m; `. ^: K& h+ | - '123456@qq.com',
* S8 `$ m2 N) x - '666666@sina.com',: R1 T' g# Y/ @4 ]' }- p
- '8888888@qq.com',
5 N) L7 J$ Q I0 h* X4 | - '77887788@qq.com'( y! N U" e& T- w, b% W2 h9 d0 X7 S
- ]
5 `3 X( }. I* z/ b- B" } - ];7 o3 R8 \) b; V3 k( D( x& L
- $res = $collection->insert($doc);//向集合中插入一个文档
8 N% r) X& p% \7 T3 l( @ - echo '<pre>';
% _0 ^9 z4 F6 p$ J6 H - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
8 j$ ]5 j, K4 E0 ~1 Z7 Z - //参数1:搜索条件" A ` D; t5 B6 u; V7 i
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段! X; L8 t$ Q% R7 Z7 D
- $mongo = new MongoClient('mongodb://localhost:27017');
5 Q, n H3 z8 C- A8 N - $db = $mongo->mf;
; G6 z3 \- x% W% @4 k- Q0 u2 G - $collection = $db->friend;; y3 e# t9 g3 R3 j/ y7 b: `3 }
- $one = $collection->findOne(['First Name' => 'Jet']);
: g/ Z+ [" C/ z% H8 B Q" G( ]* V - echo '<pre>';# w. `/ @$ A+ g* M7 a, k
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()+ p7 A( v! ^7 B5 h
- //参数1:搜索条件& V9 q* [7 T$ e+ R' f+ ^2 G* A
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
) l5 V: H. m3 M8 V$ d; O: j - $mongo = new MongoClient('mongodb://localhost:27017');) R9 k$ M$ T2 W5 Y4 U0 w4 e
- $db = $mongo->mf;
+ f( h3 U9 G9 E/ v - $collection = $db->friend;5 G% v/ }4 h% Z$ x9 a4 m
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素9 \0 j7 D; D5 y- k @, Q! i* B
- echo '<pre>';
, J7 ]; \$ @* g* F8 e - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
) I' |* b8 ~9 E9 ^" Q$ ^ - print_r($doc);* I# G2 l! e0 D/ A# L
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询) y( q9 h" l( e) ~) E2 T8 T
- $mongo = new MongoClient('mongodb://localhost:27017');
" M% d3 r' n: C* V% c$ D - $db = $mongo->mf;$ a7 ~3 x6 {7 P8 K8 c
- $collection = $db->friend;' P' m/ G+ b. _5 O1 d
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
: F. p2 l1 Z5 ]7 ^* t! L, J - echo '<pre>';
0 ~% a8 e7 y6 ~, p4 n* P - while($doc = $cursor->getNext()) {7 S( Q7 d# }% Q. ^$ ~
- print_r($doc); u }) A. u% c7 l
- }
复制代码 //查询某个字段的所有不重复的值
8 H1 Q e; F u+ U# U$ W3 r+ ~ $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
, ?- @/ [1 L( g$ \1 O9 I - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
5 d" a) h# A0 @" i - ( u3 o r) X: K# v q
- //$all:匹配多个值中所有值(用于数组字段查询)
8 V C: F. y; P, k' G3 S2 ` - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
0 o! e$ G/ W5 }$ n+ A } -
# L; F- ~) }, h# F* P - //$or:或查询
. B$ f" h3 D2 ?0 f7 g) O- d- U - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
8 ?+ b1 r/ V& [* S8 `/ n - . n- p |( A+ }9 z
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
" j; z9 H- q) O4 ~ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email8 Y s0 J' H" g% T, l) i- z
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
3 _3 ^% k5 v2 u* V - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个4 O( g- L5 H* o0 V
-
( b& g2 ?6 E7 T3 U# G- L% ~$ T* \ - //$exists:根据某个字段是否有设置值进行查询
; G5 N2 Z3 |4 j3 v6 p2 ? - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档1 ]2 y, k2 N3 i; F* V. D% a- p" A9 _2 g1 [
- - c4 R9 f6 w! q8 @" Y6 G, E
- //正则表达式查询$ Y+ H- Y& s% U( p7 I, D2 a
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
" \ z+ r+ O; [4 m3 X& m$ v - $cursor->sort(['Age' => 1]);
1 b% m. d" C8 \( s) A. X. b -
0 C8 S Z. ^1 M - //忽略前n个匹配的文档
$ k! K: M. a; \2 O) b! S - $cursor->skip(1);
7 S ]8 i& u* M% }* M -
4 i$ t1 ^$ B* Q6 F6 S - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
1 T E5 Q, r- [. |% T% J5 [ - $cursor->limit(1);0 p: W6 Y: s4 O. P
-
0 U+ c% V. k# E$ H* U - //匹配文档的总数$ e- m s4 d9 g+ f( X
- $cursor->count();
' c e* _. {3 d* R- f7 V - - m% m# x/ x9 b$ p$ G! U
- //指定查询索引% C3 ^, w6 _) H. W5 \& d6 `5 r* m; {0 z
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计0 I0 T6 R# A! T; T- {. s6 O
- $mongo = new MongoClient('mongodb://localhost:27017');+ O( }0 x5 U4 m" }# d6 }2 r! p
- $db = $mongo->mf;2 e; k) F% K1 v K
- $collection = $db->friend;4 w# Y" P7 ]7 L+ z3 _/ w/ J
- $res = $collection->aggregate([. `; D/ v, }" u- d- O
- '$group' => [6 ?9 x5 ?) G6 n) `/ |0 q
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
- k. b! s4 A; X& n: {3 D- \ - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
4 j7 s {5 t; B/ }" K8 b - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
* |4 ?% m9 p. O% k, M7 ~5 O - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值% E) B$ @* C* V Q8 A
- ]
* B1 f C1 s- o' j! Y" @0 r - ]);" P0 j( R+ D. S
- echo '<pre>';; H0 n/ z m( H7 j/ \% ?
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
n- M+ y7 I" F -
, n& \; b1 h3 Y -
2 M. [% U6 G1 Q: h - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序3 F7 [# @9 U# X; `3 q: b/ ?& v
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。$ h5 P, l0 u( K
- $mongo = new MongoClient('mongodb://localhost:27017');; N6 s% p# U' g0 s0 p8 o, J. m W/ u5 k
- $db = $mongo->mf;
7 U) r8 F$ A/ e2 D - $collection = $db->friend;1 o" P2 l! M. L; R" H& w
- $res = $collection->aggregate([
8 V1 y, V* I) Z6 O$ H/ X - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
( X; ~2 T5 `+ z- p; m - '$match' => ['Age' => ['$gt' => 30]]) u! ?( I- W7 q8 B& C! u
- ],6 v! q( b B# Z9 }8 Y
- [//指定分组字段、统计字段
+ Y5 Z$ v! F7 r) K/ t3 i) f$ e - '$group' => [
[( E: u: `, p$ P, N - '_id' => '$Address.Country',8 b* j* J$ K8 J4 f9 G
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
1 \5 g' Q/ _4 X, v( l) U( Z - ]4 s0 J! p$ |# G3 { P
- ],, d$ q' K9 {/ f+ |4 C
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
' P5 w9 B/ d# M' _) k' e - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
3 O5 v" U( f0 P# o, H+ h* j - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
9 H# }/ `, B, v) i - ['$skip' => 2],//跳过指定数量的文档
' O# ?7 I' j, R& _ \, q - ['$limit' => 2],//只返回指定数量的文档, f# T4 g, G0 A5 e* D- e( r
- ['$sort' => ['totalAge' => 1]]//排序5 }& x6 E4 K4 r1 u! e( N$ N
- ]);
+ ?' \/ C7 X, }7 V2 D - echo '<pre>';
% S5 G6 O" ~8 M2 S/ s" U8 }' | - print_r($res);
复制代码 , X2 k, P d2 F2 Z, z
三、数据修改 - //update()* \) Q* z1 f6 k+ `) w0 a) R9 n
- //参数1:更新条件,指定更新的目标对象。
$ I9 v' v2 Z+ c4 Y. f: t% ?: a8 w - //参数2:指定用于更新匹配记录的对象。! m( O2 I/ @' P2 J- L% o5 _
- //参数3:扩展选项组。
- k& l& W# E. U" z6 z% o! y7 m - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。7 l* n& v( h1 [% }7 |5 M+ n
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。6 }6 z4 y- G8 V' l2 l9 i3 D
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
# `' M" w9 W; [9 ^ - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
. |6 Y! e1 L1 E7 }* W - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
0 s2 f+ U6 s' m$ Y4 I - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ Z! K0 V ]: f" b ^' m4 c+ r - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
: B/ W, J5 ]2 v7 X - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。5 f0 M1 B. k$ U6 |' G+ Z
-
5 W @# J* I' m& I3 O$ z/ i - //$inc:增加特定键的值,若字段不存在则新建字段并赋值" ~" c1 |- g8 n$ h" P, s. d: `
- $mongo = new MongoClient('mongodb://localhost:27017');
2 ]6 X+ M1 l; ^* I2 g( S0 l0 ?, f - $db = $mongo->mf;
% c/ T" F. v; Q$ K( z - $collection = $db->friend;
# Q* p% x% d! Q' Q% S" J - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
3 g; _9 e* t m% @ - echo '<pre>';
( Y( v9 ?2 P7 a" G0 F6 G - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
( F8 U: |; {+ X) q) P - 4 d! F/ X h) [9 A8 T8 o3 X
- //$set:重置特定键的值,若字段不存在则新建字段并赋值& Q' ?; L$ @8 o. x) D0 }- t0 b# p
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);8 ^% d0 v' [3 \1 W& N% c: D
-
# b' [0 F8 ]3 H: v7 ~4 } - //$unset:删除字段
$ w# M7 s( a; a8 [+ c - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
6 A7 `4 W. [ @% I - % a- Q) W1 {. a+ _
- //$rename:重命名字段,若字段不存在则不进行任何操作
1 u. W A- T5 r! i1 ~+ f1 [/ E - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
: \+ t }& x# e! ~" ~# W. M - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。; |1 w+ `! A( ~
-
, P, k9 U: ^2 Q - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的0 I1 s- R$ g. ?4 f
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
$ e0 j& y: D1 s, g -
8 _) D0 c4 y! y8 q( s) Q% z" { - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
4 Y& J' ~/ o. A$ X7 l+ | - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
3 E9 C! n8 C2 F: J- l -
6 Y! T! Z. r& X4 n2 C6 Q6 K$ B) u - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
. q; v8 w8 Q: v0 r, ?% T - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
) n. {* y2 e! C- n- e3 P -
; I* k7 ]- J8 b5 N$ h& H - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: r, P* K6 u% g; N' e- ^8 N9 X* \
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: Z) K4 g; H: t% [; g2 C
-
' R+ }' o3 ?; l" V7 c5 E - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中), ]& z- Y7 R8 A4 h, B
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);& T# i5 ]+ @9 }& d8 y. g+ R* q0 q
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
* G0 i/ v0 |4 l0 ` -
5 x$ O: s3 c/ J# F" Z0 q: j5 z - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
, d1 w6 w( K* T& S - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ U2 k. ^4 J- P: \& R0 |
-
) X/ o+ H; y. U( r2 @& h7 U' Z - //$pull:删除数组中所有指定值; ~, |( q( x3 p- Z* {/ p
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);8 F& F: l( u, z1 U7 p4 U6 q
-
. b9 L4 a, j( L1 z7 p" v - //$pullAll:删除数组中多个元素的所有值
) W/ j ?* H! u' f ?9 _! K* k - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()8 i9 _3 u! P. `: S
- //参数1:希望保存的信息数组
5 U( n% f9 I, ~& v. f - //参数2:扩展选项
: ?# z% ^) y# N6 r1 q( Z- {$ x. ] m - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
* |2 i4 a* ^& ` - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
F' v. ?$ r' T - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
3 e/ B* t, q) [9 I: \ - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# v4 L5 u) | j7 D7 Y" |. j) h, j* ^ - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
8 v6 o' I7 J+ w - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
1 t' A: j5 t: S i* }, {" ]- G - //若想更新则应该在参数1中指定_id键的值。. W; o% U* O5 Q& g( x3 z. Q7 S
- $mongo = new MongoClient('mongodb://localhost:27017');7 U4 s9 ] u( f/ J2 S; q) f
- $db = $mongo->mf;& c1 H3 v2 D' k- Q
- $collection = $db->friend;& G2 S, K! H! G: ^
- $doc = [//定义一个文档,即一个数组, ?5 z2 f% t6 i
- 'First Name' => 'Jet',
% k. [$ o" W; o - 'Last Name' => 'Wu',: Z8 l: m8 ?) I7 |6 _
- 'Age' => 26,/ [* H& ]) s5 A- r
- 'Phone' => '110',9 d7 e7 o) g* V0 D9 {
- 'Address' => [
) M; \; y) W3 V3 X. k - 'Country' => 'China',
; q( c+ A" _3 ]3 G' a - 'City' => 'Shen Zhen'# u+ R: y9 O5 m, g
- ],1 o y/ Y/ G5 o( ^+ o( R
- 'E-Mail' => [& |' K; k! Z; B0 z+ w3 q
- '123456@qq.com',) ?4 B1 s( K5 u6 E5 m% O3 c
- '666666@sina.com',
# j8 ~7 T: H4 p) W$ S) x - '8888888@qq.com',0 q G( j$ e- v @
- '77887788@qq.com'. C* u& t- W3 K! t+ n
- ]
+ o% k) K% f& H& i9 s3 F2 } - ];
5 n \' r* P1 F1 H - $res = $collection->save($doc);8 n- y, ^" Q9 ]0 m- q2 D
- echo '<pre>';3 U( ^8 a. p+ I$ q+ d5 k; o
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入. n/ c2 C6 d3 B" i. [8 r
4 ~$ C: E# _" B% e2 a
复制代码- //findAndModify()
! F7 G7 a: J* m! s - //参数1:指定查询条件7 g' ^' z: k- Q# \, T' d' w
- //参数2:指定用于更新文档的信息
/ N" G; A2 _( h. M - //参数3:可选,指定希望返回的字段 `$ Z+ v! p/ }; z
- //参数4:扩展选项; a4 ^; ^, N7 [! m( H' h& ?7 c
- // sort:以特定顺序对匹配文档进行排序: v# o$ z% ]9 O: R# o
- // remove:若设置为true,第一个匹配文档将被删除
, r) O# E+ c7 F Q - // update:若设置为true,将在被选择的文档上执行更新操作
3 F- g5 I0 V+ y; y - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档: z# ~( F8 A9 R) ]+ j" k J
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档0 e- q; `* k% D2 X o8 T/ x f5 b
- $mongo = new MongoClient('mongodb://localhost:27017');5 N/ D! [3 ~* Y2 Q8 g& a0 [
- $db = $mongo->mf;
8 \" z7 |2 a5 K - $collection = $db->friend;
$ R$ g/ B0 E# A4 P8 L# Q. ` - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);0 K* D& I. g2 ]' r
- echo '<pre>';! I' h7 d3 [- w$ v. p
- print_r($res);
复制代码 四、数据删除 - //remove()6 ?% v3 a* M4 W8 U% A- b R
- //参数1:查询条件
3 ^4 u( b2 |2 W8 V9 X' I3 z* U - //参数2:扩展选项
, J) d# G$ H. r& e" G - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
& V' s) v; x, ^ @ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, N0 F; @/ m- l) o! Y2 M8 _9 Z L. P
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
, \1 c2 a' @, K7 m& c; y - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! d. P3 @ H2 o0 y. n - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间$ K2 C( o$ B; Z" w2 }
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
) v4 s% P7 ^0 \ - $mongo = new MongoClient('mongodb://localhost:27017');1 f) A8 @0 A8 J \# E
- $db = $mongo->mf;& M: B) H- u/ y: U$ U
- $collection = $db->friend;
4 l2 K/ q% n- `; w& [7 G6 U- ~ - $res = $collection->remove(['First Name' => 'jet']);
. i. m$ V' z' v5 x+ L! Z) ?3 r/ d - echo '<pre>';" j( e! i( t% ]9 \7 u
- print_r($res);//$res['n']表示删除了几个文档
复制代码 ! \; w- Y. z; s/ t& J( t- K
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
5 n% @# T% y' J. v6 D) [-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- % N& ]6 o0 c0 g9 L
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; C; R! c8 P$ s
- $bulk = new MongoDB\Driver\BulkWrite;# Y& X2 E3 a% b4 q
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);3 A8 m* }3 d9 q" S# x$ k
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
# F9 q! B; r6 X$ |7 i5 y - 5 p& A/ Z9 }; y) V4 Q; }2 @1 p9 ]
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 V: `( O6 ]7 f: b L7 |# m
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
0 G- k2 `& H/ W5 R9 q - echo '<pre>';
9 Y9 T l- f: }0 U - print_r($res);
复制代码 * A o+ i2 ?0 a1 [
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');' Z. w" s5 w- C3 X* H
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
& q* W" Y" X% z* f- Q; W - $cursor = $manager->executeQuery('wjt.friend', $query);. D0 U+ u1 N! F. @
- / [$ _$ d( C2 u" h: m
- $data = [];
" M( N% v( W- [8 g4 D - foreach($cursor as $doc) {* o* Q m6 }+ {7 m, U0 K9 C
- $data[] = $doc;
- @0 m+ T! q& T# T - }+ ?/ m' x" q7 r5 N! J6 }
- echo '<pre>';3 c$ v, ? Q7 H- L
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( n6 F. k8 ^9 c# |6 m
- $bulk = new MongoDB\Driver\BulkWrite;
) z% I( Q$ w. f* R. a/ |3 ] - $bulk->update(4 F6 m: {' Y& _3 G" u) [( n- Q
- ['name' => 'JetWu5'],
4 I; l* d5 ^" u - ['$set' => ['age' => 30, 'promise' => 'always smile!']]9 z" V+ K" [ u+ D. i$ [ p2 N
- );( M4 D; C) G+ d/ `$ g5 h# \% g& ]6 I
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
6 ~% U+ }2 t+ I/ \2 f: ?6 ^. m& v - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
! N' E6 a6 u; G - echo '<pre>';
$ {& b3 }" y% e - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! v/ C% ?' e ~9 K q
- $bulk = new MongoDB\Driver\BulkWrite;
1 [ c$ M& m2 @0 s# t - $bulk->delete(['name' => 'JetWu3']);: Q: ~0 V1 e% Z0 N
- $bulk->delete(['name' => 'JetWu4']);# A$ N" j5 a- }' E' {& |: E
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 g# J+ ~: u' l9 r+ z4 b! Y& }
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);5 M+ n5 n" E! s' f8 _; q
- echo '<pre>';# S6 c# @9 r' m" S% b) n
- print_r($res);
复制代码
/ d" K2 [8 g- I$ B) i7 N8 S
. ]$ ^, A4 c3 i' Q$ r5 l
/ N7 q) H1 k5 y& Y
+ u2 j% q! y4 F0 {7 N) {/ x; h- b; }, C
|