|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
/ ^; X3 S- ]3 M0 b# k1 D" l - //参数1:一个数组或对象8 ]1 r" |4 @+ P* @
- //参数2:扩展选项
6 ~ j6 }- d7 ?3 d1 M. ` - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘4 B1 k0 k/ [) x# n! ^* H& X
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
9 O- y9 A2 i; A3 z) H - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
- y: y, N% `( }! ?2 k1 q Z - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 d/ z- o2 X5 s0 k1 U! U
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)8 U: E4 T3 H$ [8 u6 _5 M U
- $mongo = new MongoClient('mongodb://localhost:27017');
4 e5 n0 X' B7 F - $db = $mongo->mf;//选择数据库
% U- c M1 i$ T - $collection = $db->friend;//选择文档集合 Q! A/ _7 Y/ C+ ^7 ]' L
- $doc = [//定义一个文档,即一个数组
v) ? R3 h* J3 g6 S# O# a - 'First Name' => 'Jet',. a/ F2 G, q I" ?( p7 k$ j) }8 W
- 'Last Name' => 'Wu',
3 n# v4 S" V7 S7 k: ~ - 'Age' => 26,, [# V. k: M8 g9 ~
- 'Phone' => '110',5 P# v; ]5 D" L5 D- R1 o/ c& b
- 'Address' => [* V1 ^& Y3 F9 p7 x% j$ u, P/ I; Q
- 'Country' => 'China'," B7 G0 L7 o9 z- o& P5 k8 Q
- 'City' => 'Shen Zhen'
6 c# x# |6 T" P& z+ e - ],
! U5 e3 @7 @, w1 ] - 'E-Mail' => [
( t* A( y; }# Y4 T6 h - '123456@qq.com',
9 G6 a ~7 Q; C! a2 q2 O$ L - '666666@sina.com',
; V* O% M1 I: ?- v3 `0 y - '8888888@qq.com',4 X+ c' C! ]; b
- '77887788@qq.com'+ Q2 V7 v0 w8 d$ G* l, t. d
- ]
. F) K* J* A# y. ~ - ];. |# \) a9 i4 j
- $res = $collection->insert($doc);//向集合中插入一个文档; l& \( Z% m8 d( g* Y2 i
- echo '<pre>';
, T5 i/ Z' a* v5 [: N8 }- J' }4 K - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()( r/ C4 E* g0 X, q; }) H5 h
- //参数1:搜索条件
4 m! o+ D' a/ }7 | - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段7 h; Y/ E5 T X. V' h
- $mongo = new MongoClient('mongodb://localhost:27017');
3 j* m7 K! A9 [* A& O, R* x - $db = $mongo->mf;+ C4 }4 W9 {3 }6 N- M: o
- $collection = $db->friend;2 Z( I! N, w2 ~) {5 s& ?
- $one = $collection->findOne(['First Name' => 'Jet']);) b' S+ J( b0 T) l" I* W8 g
- echo '<pre>';
/ [7 q1 H2 u! C3 o1 v6 G, p' V. y - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()' t/ T. q; y& Y4 `& p3 E G
- //参数1:搜索条件- w8 |! d& W% ^$ H& k* c8 u, e
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段$ Q: O) C& z& G" F
- $mongo = new MongoClient('mongodb://localhost:27017');
4 Q4 L9 b% ?% a& \ - $db = $mongo->mf;
7 _% ^$ r E/ z. i% p - $collection = $db->friend;
7 w, {: y( K) L5 X - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
3 _! c) q: j: R# k - echo '<pre>';
2 ?, a6 `- }6 u2 D* d; Z ^$ K - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档! d9 s( F' w5 \ t8 d
- print_r($doc);6 A5 {' R1 \/ k# L' J' J
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
6 u7 ~6 e9 N' p - $mongo = new MongoClient('mongodb://localhost:27017');
( a" r% G5 ~/ z6 h+ F - $db = $mongo->mf;
8 r4 d( w1 S9 n6 M - $collection = $db->friend;
& \. e' a( y f Y1 b% {* L - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
# }: Y9 Z; W. Y - echo '<pre>';
+ C& ?* q+ F/ m; q4 d4 K2 D6 } - while($doc = $cursor->getNext()) {
) G" X7 }! {! p - print_r($doc);3 W4 J) _( w& |) P
- }
复制代码 //查询某个字段的所有不重复的值
( D! u. _; O5 b" m $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
2 j9 ^6 A2 \& h5 K' f - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
" G. _2 E! P2 a# F* ^) O - " [: C, e+ T& F" `, j
- //$all:匹配多个值中所有值(用于数组字段查询)
- W0 O3 b. | U% U - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);7 c6 I/ Z+ J' O! ?6 T- }
- # d: I! B$ U+ D: D1 {1 T
- //$or:或查询
8 y! i, w" V3 W! |# J5 H& E1 E/ ^ - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);' q) s! u0 R' s s- b! u/ o
-
: J N+ R" s1 J5 Z W - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
4 F3 T' R: Y" h - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email3 ^7 ?$ L& q. @% X" D! f
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
3 N9 d9 f9 p% [4 K# W/ e - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个+ L) q) Y/ x8 ]/ b8 d$ ~, [; ^& y& {
-
- H- N) b/ B; L$ g4 B8 X5 Q - //$exists:根据某个字段是否有设置值进行查询, s+ T2 ~; K% @0 B; C1 z/ D2 y
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
" I8 R/ ?) a n8 z ^* Z( q -
" Q( R/ J% h9 K6 [# A- V3 _# F7 x - //正则表达式查询3 e( W& a, {( g' e, m/ ]
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
4 d/ f& @( L; q. \: s( j4 f - $cursor->sort(['Age' => 1]);
9 j0 s! v; P9 x! q4 b -
: R! y4 b ` W$ W- V1 P - //忽略前n个匹配的文档" W% ^9 _* K0 F' O+ P
- $cursor->skip(1);7 c" H/ ]: ?4 y: B* X2 d$ y0 ?, H
- 3 K! p, b& ~5 h# E: ~) `
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
/ S7 X8 s5 H2 s% }, | - $cursor->limit(1);
: w& @1 Z9 ]3 E5 k: e( |8 X - * ?0 e$ b- {+ Y. u8 z! q( x+ p9 D
- //匹配文档的总数+ s& U5 I. k% m4 C9 G" I) j& X
- $cursor->count();0 s$ a2 v- E7 y, b0 H
-
; {8 J8 E& Q9 S( ?) Z8 o8 ? - //指定查询索引4 B0 e! F" P g0 ]# u
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
% u4 e6 v* M8 E+ J - $mongo = new MongoClient('mongodb://localhost:27017');& T# G- p5 S0 ^2 P" ~
- $db = $mongo->mf;1 {8 [4 g& W5 L8 ?# l
- $collection = $db->friend;
! r; ^/ p$ T" h: O/ k0 f - $res = $collection->aggregate([
2 ?' j; F C1 { F& N) S4 {- j - '$group' => [
' V% J2 A* s8 o' J0 N; W - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组* a0 |/ N8 j3 B6 O" q
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1( A! Z$ I" k, F/ k$ M, A
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值- W+ M g. m' L2 M
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
( K0 Z( X- n2 N' S) Y) V7 k" u( E - ]$ B( d3 ^8 ^8 m% P( ~, n# U
- ]);& [- G1 l! N& L& Q+ v, }
- echo '<pre>';
- R$ U( c$ P# f9 \/ h" ^' {1 Z: f - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果) Z; t" b; O m0 V) w! L
- 6 S2 `9 e3 D8 _( \9 }! R$ ^
-
1 R% j# W4 _" S1 L$ f - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
4 v& r" ]. d. N- Q+ V) |8 O - //聚合查询中的所有操作,包括'$group'在内,都是可选的。: i5 J( G, n6 g" l2 D- C7 E0 C
- $mongo = new MongoClient('mongodb://localhost:27017');& l5 @/ B9 q; R
- $db = $mongo->mf;# }- H. o; }" s. t
- $collection = $db->friend;' _1 v& S# p2 A9 E* M8 M2 D
- $res = $collection->aggregate([+ F! |* ^) O, T/ R) M
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档+ x) h3 E/ {; B) l1 }) ~4 ?
- '$match' => ['Age' => ['$gt' => 30]]
4 l4 l' j: S% I0 C" b - ],; f6 r. S; f3 \- v V
- [//指定分组字段、统计字段( S& K* f2 L! s y {4 G! ?6 W0 q7 a* S
- '$group' => [
( m- a" X+ l; g5 b - '_id' => '$Address.Country',6 R% W: ?2 X# H# A' h
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和+ e# S2 c! W9 q0 h8 j4 }5 j
- ]
2 f; r% }# }) Q6 L - ],
: _: ~( }2 w9 h X- Q2 f - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档7 Y* n( [8 X9 x6 d
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
8 m% t2 i/ R D& t# {. z$ }& O9 F; U - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
3 t! ~4 \9 D% [. @6 w! `2 K - ['$skip' => 2],//跳过指定数量的文档9 ~5 S3 M$ g: A
- ['$limit' => 2],//只返回指定数量的文档
# A4 G( w* V+ A4 n2 D4 @ - ['$sort' => ['totalAge' => 1]]//排序
0 D% L: I& {& b( J - ]);2 Y; ?7 c6 P2 s: s& J/ [0 r; m2 {! i f, z
- echo '<pre>';2 M! q8 Q$ J- w( [9 s
- print_r($res);
复制代码 ! S9 v' E/ N$ ]
三、数据修改 - //update()4 b/ d- W9 _9 J, [& K8 l! v
- //参数1:更新条件,指定更新的目标对象。
5 D) U2 R, W3 S9 _* O - //参数2:指定用于更新匹配记录的对象。
( A/ B W( \" S; Y& u5 W - //参数3:扩展选项组。
, ] p# S% V- z( M$ @ - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。1 Q% D: [+ c& t
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
3 U$ C5 G. T. ^% q- U: g - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
6 o. L' U8 n! e+ H# i4 m - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作$ l+ S: Q$ @$ J. c* a+ ? V T2 q9 p
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, j* ?! ]8 F. H, Y o# o
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# A |$ y5 L) K$ O. e3 K - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)+ F& V% S4 s7 U, _( `! i
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
1 D! v0 h9 A, o3 N/ d/ [/ ?/ D -
0 h4 [ P9 x- B/ ^; s k- m" P - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
0 `6 F! V. ^, O2 T* |1 Y - $mongo = new MongoClient('mongodb://localhost:27017');& b1 ^# ~+ O2 E+ u2 I. l; V& y
- $db = $mongo->mf;
. @, K7 P/ U- _+ x' e - $collection = $db->friend;
5 m F, e+ O, E/ I# a$ o1 ? - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);" f: G! o) R! L. z$ q" L
- echo '<pre>';
2 M9 k% \: o+ F, T0 P1 b* U8 s0 ^ - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
' X7 q" l- A" |9 O - / G: T+ _7 M1 e4 u4 n- t$ n4 ~
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
+ L6 o1 w2 f4 k) Y, C3 z - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);" h4 W* w* k. l( E9 d, f
- ; z" j, J8 ~$ W7 q
- //$unset:删除字段
5 C! ]( C3 J7 r0 W+ G- A - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);6 b! z9 `% V" I# ?
-
0 m/ N7 c2 N% @9 F8 e - //$rename:重命名字段,若字段不存在则不进行任何操作
9 v& e( d; [+ `" {7 I1 L' [- a# S C - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
3 N) s* @ s% j/ I - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。! q5 N. E5 i* i( g
-
8 l! P- ]- Y8 L - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* A6 D) R8 M( E7 @% x - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);8 ^' I+ D/ |$ [* ^
- % m% M" P, h/ R, O
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错* J6 J3 v# h4 A' f5 b) o3 _
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
/ N( U; G) k& C* r/ A* A - ' @! J' l2 y9 W
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错 n( E5 C" K$ M2 p
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# ~9 h6 k9 H: [
-
6 r" f* C- W4 H/ y0 j0 i5 x U - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
2 @+ y& o2 R" d. a1 [ - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
/ y% N/ e# x% ~4 C* d4 ] -
- n& s9 M+ k# ~0 \- M/ W) h - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 a5 X, J: M1 K, H- R+ V& l1 s
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);, o2 `- O5 u( @
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
' L% `& l3 t5 r! J. X - ; S0 g7 Y& R! }) R k1 R% g
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
2 e6 `! u* M1 e0 m/ e7 S7 U3 a2 S - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 a6 M3 k0 A* o* ~# K: p0 V
- 4 ~' ^( O+ w6 `9 K+ ?4 M1 r# Q
- //$pull:删除数组中所有指定值
5 D1 W/ N) S, J' [5 l+ x, ?, M - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
$ Y: G5 h! x! r8 A - ! L, r) `. H/ l' g
- //$pullAll:删除数组中多个元素的所有值
' N+ }( j! G4 u2 y+ D+ y - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()! W" i$ M' H" q% V9 O
- //参数1:希望保存的信息数组8 C1 `2 p, u$ |* K: t7 [
- //参数2:扩展选项
7 ~8 n' e" V3 j7 d" {! D - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
/ p+ _9 A% {0 J8 y! U) P - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
3 ]; e& K* w B. |3 ? - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
9 U, c: k j' v; p - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; T, P K; S; F% m2 Q# ~9 V+ o+ T
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 Y9 h& V# N: m6 F9 \
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
" j9 w! ~6 m# d, U5 ` ~. C3 r - //若想更新则应该在参数1中指定_id键的值。; a8 _/ R" m# ^4 i; F3 G9 l
- $mongo = new MongoClient('mongodb://localhost:27017');
1 e) E! I W" F - $db = $mongo->mf;# I( i6 K% H, N; v3 B2 k+ w
- $collection = $db->friend;
6 E* R. M$ v! R9 r. n/ z - $doc = [//定义一个文档,即一个数组4 e9 s$ R) t9 O7 E0 ?* \
- 'First Name' => 'Jet',
1 U. c( n8 j2 X. m# m d5 q - 'Last Name' => 'Wu',
, H& Z1 V* y' W0 @; _ - 'Age' => 26,8 G; E a6 n) ]% P0 S
- 'Phone' => '110',
# n$ F e( H1 |2 Z* X/ P - 'Address' => [
6 [8 L+ }# {+ c$ B% Z ^( e - 'Country' => 'China',1 V: e3 D7 Y0 O! g! T
- 'City' => 'Shen Zhen': Q8 ]' o. l1 { ~
- ],
( |1 L: X K# V; M - 'E-Mail' => [
; f6 `- T; W. v$ d& B - '123456@qq.com',
, D% i' G; X$ f% L( j1 a1 m& P - '666666@sina.com',) t- r, Z* `+ c/ D0 `
- '8888888@qq.com',
* X4 W' W$ O/ L - '77887788@qq.com'
( L- o) D2 h1 d i: U& [ - ]) \7 o" b% s; k+ a- g, z
- ];) y7 d+ p. M: j& G, S0 C
- $res = $collection->save($doc);# _. ^8 h W0 H/ \& ~: a* ?1 x
- echo '<pre>';
* G: \: ]1 z" X0 Q7 c2 u) \5 | - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入: Y8 g3 w$ d2 P* e) h/ N
- % z" w0 N) z6 T% I4 o) u6 w2 R
复制代码- //findAndModify()
# Z5 `6 S/ `* f+ S - //参数1:指定查询条件
. u3 F" F* k- V+ |' l; Q - //参数2:指定用于更新文档的信息) a9 Q6 y/ ^- W2 y
- //参数3:可选,指定希望返回的字段9 Y `5 c) l" R, g
- //参数4:扩展选项3 ]5 P: z6 E5 u0 J! k8 K; z9 D
- // sort:以特定顺序对匹配文档进行排序$ {4 C, z6 q3 H
- // remove:若设置为true,第一个匹配文档将被删除
6 j D; I0 d# G ~- F - // update:若设置为true,将在被选择的文档上执行更新操作; S" ~9 x% m8 ]. M$ l
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
/ ?+ L/ Z# P1 Y2 ^ - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
! W. j1 }) k0 w c( y( _3 F3 d* U - $mongo = new MongoClient('mongodb://localhost:27017');5 R; a$ O4 G! r& p' c$ f
- $db = $mongo->mf;
4 d d- I2 o" O- S; a - $collection = $db->friend;0 R! T6 t8 H- F2 Q+ B
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
. o2 h4 X8 R$ ~1 X - echo '<pre>';& H4 j/ [- w9 ?
- print_r($res);
复制代码 四、数据删除 - //remove()
) L* J7 `# i0 v7 C8 I9 N - //参数1:查询条件! c5 W' y: x5 M7 d
- //参数2:扩展选项) J! a- T' Y ~9 B4 O4 ~7 W$ U6 U
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
" G! t1 H( c& ~. ~ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。9 T$ z Z# `& |" Y2 P" J
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
! u5 M: ]" r& P. Q' _& g7 A, f - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。9 G7 L" I8 j$ H- `. a8 l ]" `
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间" x1 ?/ ~4 r/ P3 f1 I/ \. c
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
/ G* x3 v& I* K2 g6 u; ?4 A3 | - $mongo = new MongoClient('mongodb://localhost:27017');; }: F; v8 w1 F8 o' V
- $db = $mongo->mf;. F$ S/ I3 ]& M" Y
- $collection = $db->friend;$ n. F! B4 `9 m& @% O2 K, A
- $res = $collection->remove(['First Name' => 'jet']);
, L; |' x2 }, T$ E" ^/ D - echo '<pre>';5 r: C9 \0 C& j, V$ M9 X& p3 _' Q
- print_r($res);//$res['n']表示删除了几个文档
复制代码
; _( @% B7 ^& E5 R% L以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
$ C% P5 m( O2 Q/ ^+ I-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
: ?: S5 X3 D; }" |, u数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; ?7 M' C0 U" h7 |+ m! ~1 l0 v
- $bulk = new MongoDB\Driver\BulkWrite;3 w& i# I' b" r: Y+ s7 u" p8 N9 j
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
/ G* P/ E, N% I# b) R+ G - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);- w d3 x; F/ ^6 k' _& f
- ; c( ]$ C; _& k; j8 n# Z
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 y. W7 V& U: y* ~8 S% O. B9 x
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. U; P0 a2 o" h$ ?4 j
- echo '<pre>';! \# n7 v/ s7 y1 I" l
- print_r($res);
复制代码
; k' s; s) p* E数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');- z; P- M9 w \' h6 a4 a. s& _
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
; [- y* P( }- m* g' n6 r$ { - $cursor = $manager->executeQuery('wjt.friend', $query);
0 ^- n. [4 w7 d6 S - : _6 u$ l3 I" i! `1 V4 E& D# l( I
- $data = [];
! X1 u; ?! W! t2 P, a- Q9 g9 { - foreach($cursor as $doc) {6 k; g- l2 \8 t
- $data[] = $doc;
5 d+ M8 q3 d+ I7 H, i0 u - }
6 c5 P8 g5 M/ |/ ^4 {( h - echo '<pre>';
% b8 N- e: k* ~' [1 M* e2 s4 D - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; E' g$ O0 q6 x% I4 t
- $bulk = new MongoDB\Driver\BulkWrite;
/ x# b% Q- _3 Z" @+ X3 ? - $bulk->update(
; z2 \) N! Q S - ['name' => 'JetWu5'],8 e$ m p' a& X/ W2 c
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]. e0 s+ s* [9 d5 ^
- );9 Z! l% ~& {$ q. s+ Y
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认0 K" R! G C; z7 @: o+ \' l
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
1 r- f8 \7 Y2 e* g" n - echo '<pre>';
; s' X6 E; O% A( x. L2 T( a. \# k6 h - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');- C, R, ]# I* M( A& m
- $bulk = new MongoDB\Driver\BulkWrite;
2 @1 t$ u% U- A6 r( Z2 S - $bulk->delete(['name' => 'JetWu3']);
3 ^6 L# C5 ]; h$ k3 ` - $bulk->delete(['name' => 'JetWu4']);, i- { p- s. |) q* D2 ?; X! x
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
0 y, T8 C" ~, f- T) h( q# E! W - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
3 S8 E# a6 a! I+ @ - echo '<pre>';
" |) V, x& _4 y0 j* O1 w# N4 r - print_r($res);
复制代码 % v0 ~+ V( d& P+ \( J$ I
+ w/ D5 ~* t7 a% Q: J2 Q
& b& I" m9 w7 [
* W7 Y" @* v% a# P7 b6 V, O3 @5 l! b! M* v6 J
|