|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
, p; a3 l& E6 R& D2 d2 ] - //参数1:一个数组或对象
" `- q& [, v* a3 ?; ?1 b - //参数2:扩展选项. g* @% O2 {* {$ X! S, |
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘: s: R5 v& [4 u, Y
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
8 y8 i4 a0 U4 U' i9 P7 h' ` - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认% P9 e4 N% E- y- J
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间0 t X. y/ W/ o* L% @7 m
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ m2 s! s9 }) ^3 m( S- \1 E1 Q
- $mongo = new MongoClient('mongodb://localhost:27017');
* M/ K! O1 N" Z: c& } - $db = $mongo->mf;//选择数据库
" D1 w5 N' h$ M: y( d: [1 m - $collection = $db->friend;//选择文档集合1 D+ e/ G& ]" F \% l8 N
- $doc = [//定义一个文档,即一个数组; A7 b3 e& h) x3 U: |+ h
- 'First Name' => 'Jet',
) t W; {' n8 `6 z - 'Last Name' => 'Wu',
- P6 U; C0 I- i1 | - 'Age' => 26,
" S2 D1 O2 \8 ~0 o9 W - 'Phone' => '110',! X7 I$ j4 J' T- v+ @& i
- 'Address' => [
$ W! @9 s; j( E - 'Country' => 'China',# j3 n2 Y* U% I i) v$ {( ~
- 'City' => 'Shen Zhen'
t, V8 a6 `; o! ? - ],
0 Q' Z% m$ |7 [- F - 'E-Mail' => [
. Z& U, s2 f3 |5 T5 c - '123456@qq.com',: Y N+ k! t$ ]; I* B, h l
- '666666@sina.com',
) ?) E, a3 `+ V% R - '8888888@qq.com', C8 X7 F' u+ b# ?& j
- '77887788@qq.com'
# g- ?# D. |; b, M" F - ]! J8 L( \" \" H& E
- ];. g; d# g+ G- o: S( a
- $res = $collection->insert($doc);//向集合中插入一个文档4 B: P; S3 |/ M. Y3 o
- echo '<pre>';
; G' T+ J0 ^4 D4 k2 M4 |9 _& J5 Y; l - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
, W, K& c. S) A+ J2 g - //参数1:搜索条件
" C3 ?$ E. x# M+ h5 f! W6 ?/ q - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
; n T# o5 M3 [ ^( [ M - $mongo = new MongoClient('mongodb://localhost:27017');
4 @! Z3 Z! e# r- ]+ K/ { t; C - $db = $mongo->mf;% C7 g7 n) U0 b3 h2 p; A4 `
- $collection = $db->friend;* i) i8 @5 }- }, ~/ `
- $one = $collection->findOne(['First Name' => 'Jet']);) S0 j6 D, `" F L- n* ]
- echo '<pre>';
! I1 p7 d( k% n. ] - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
1 h/ H5 v& O0 C - //参数1:搜索条件
! p4 Q! S1 t% y. G! j4 Y% c; I* S - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段( ^" c) J) R. w* w
- $mongo = new MongoClient('mongodb://localhost:27017');
2 M5 o5 E* w" i( |: t: c - $db = $mongo->mf;
4 l* l; H6 x9 s+ u( U4 Z9 O - $collection = $db->friend;
) P% b+ @& X3 n3 s$ C - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素6 H* d7 j6 L$ Z0 E5 n. y# z
- echo '<pre>';0 M/ r2 a5 E+ [; t
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档5 g1 K: R% v- o1 Y# B+ t1 Y1 u
- print_r($doc);
0 E# h, d4 `1 m - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询! L, J9 W4 {: W0 u" O+ K+ I& \
- $mongo = new MongoClient('mongodb://localhost:27017');) E. a7 ^# L- D/ g0 O
- $db = $mongo->mf;& v0 K3 k! J1 u3 F3 ^
- $collection = $db->friend;
) B; W; y9 ^ F J% ]# R8 I$ P - $cursor = $collection->find(['Age' => ['$gt' => 30]]);& v# `5 o6 L5 F; w$ i4 Q7 e2 r
- echo '<pre>';7 b# n, S# S7 p' f6 b
- while($doc = $cursor->getNext()) {( X- t* U6 R/ U4 Q
- print_r($doc);" j. n7 s& _. f# Z+ `
- }
复制代码 //查询某个字段的所有不重复的值/ Q# W" C6 a* ?0 `
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个* o- b3 |9 H% d1 O/ l
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
0 n5 ?1 v; q ]3 @& P -
! S V M5 t4 C! Y2 V8 M - //$all:匹配多个值中所有值(用于数组字段查询)
8 x2 m% R1 k, Z# X7 ?7 J' D - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
8 x& z; p8 I [* h: u - ' D. J4 c! U& J" j! Z
- //$or:或查询# c* u9 t; J8 g+ n2 Y( N
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
$ {" ?. S1 n" M: h% v7 \ - $ k1 ^1 d4 J/ q6 d: w: o
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
. w3 g* Q y) g6 l% ~ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
1 H7 \* I: g# g4 C - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email6 g" _' m7 U* s: G+ u
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个' s# c _0 T0 L" c8 Z" k4 j0 x
- 3 J3 j s6 ^; p5 [" d b5 V4 X8 @
- //$exists:根据某个字段是否有设置值进行查询
& ]4 f9 ~, `+ W - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档, o$ \/ E; m; r, B( ]9 b
-
: o. I/ S+ ?; i, C" w - //正则表达式查询: v! f7 M0 T2 @
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
+ n' f0 e: V( K1 Q) S+ b. ] - $cursor->sort(['Age' => 1]);! i. |. ?+ v' v0 v$ C) ]' S
- : d( E0 M& ]+ |5 d2 r
- //忽略前n个匹配的文档& n6 H5 t) `" X. [
- $cursor->skip(1);
/ j' i0 r1 u1 O2 o - % q; d2 b9 d) t; j/ P1 [
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
4 q9 ]% g7 T1 |9 ]/ ^ - $cursor->limit(1);& r% O9 n/ U {. d3 Y- Z. ]3 Q
-
5 C$ Z& j i q7 K: } - //匹配文档的总数
! o+ \6 I9 d8 ^6 w, J# I: F v - $cursor->count();5 f/ `* [; S( y' j0 E
-
4 F5 o# V9 P7 k - //指定查询索引9 p: h' {& z1 ?! f, d
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计/ F- @" E. U P0 ^2 Q; i+ M5 m
- $mongo = new MongoClient('mongodb://localhost:27017');5 S* K. `5 R# ]2 Y; O
- $db = $mongo->mf;1 X3 L8 P) F1 y2 L/ ]: `
- $collection = $db->friend;0 e! w T- M: }: C
- $res = $collection->aggregate([' {/ W6 E. r; u: l
- '$group' => [9 T" n( V& R h+ b1 X
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
0 `% H6 F/ ^# \ - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 k, \+ i3 }8 S8 Z( a5 \( |
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值' Z1 k% M6 J6 ]1 Y' ^% L+ c
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
5 w/ J. H- K* N* a) B* z - ]: a% M; ]+ g/ q- m' u/ N
- ]);
1 h8 n; e: S" w: O - echo '<pre>';
! V& m: V9 e; `3 B4 P - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果3 y" w& e2 u9 D' S
-
. u( C" d( R2 Y5 G - @7 P3 u _ l+ z+ F% Y6 \
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
# D! Y% B0 w3 U - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
6 D, I' O6 @' {4 w& \. q: S - $mongo = new MongoClient('mongodb://localhost:27017');
( t# J6 z% d- i3 V1 J" G9 @ - $db = $mongo->mf;
3 Z$ e! s7 g' S; ?0 l4 i: l - $collection = $db->friend;
1 K! W, g$ ` C; A, z: x2 H8 } - $res = $collection->aggregate([9 N' t' w8 |5 M! o
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
/ v" A' ?+ K; \ - '$match' => ['Age' => ['$gt' => 30]]
9 p2 H c% [% q, m) D( o/ n - ],6 V' D& X: ?3 t1 i" ?2 x/ E
- [//指定分组字段、统计字段, ]9 a& ]8 F. i3 B% @
- '$group' => [
9 X8 B* O0 y: F n* O - '_id' => '$Address.Country',
% ?2 B; [4 w1 Q) ~; P1 K+ d6 f/ A - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和8 l, p5 N& ^: {/ R. m! I1 q5 W
- ]
8 H3 n3 ?3 w( b- I. Z - ],
! T" L# y% U/ _, a# a5 D2 z - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
9 q# V4 Z( ?- C - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
; K+ B: Y- ^* _; p. |" X' C+ m# a - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
! k" J- B# ^2 \1 z4 P' \ - ['$skip' => 2],//跳过指定数量的文档
/ {) e/ B- a6 |. C9 J$ ^ - ['$limit' => 2],//只返回指定数量的文档6 G1 }+ C( ~; S1 i _, O
- ['$sort' => ['totalAge' => 1]]//排序; Z+ U8 h# W( W7 b
- ]);# N8 [6 h- E4 f; W) K* X
- echo '<pre>';5 r1 l* {4 }; T' W; v6 ^; l) ]
- print_r($res);
复制代码 ! T u# L% y8 i6 i
三、数据修改 - //update()4 m4 J$ c" T/ x* }% x( O
- //参数1:更新条件,指定更新的目标对象。
8 U' C- K' Z5 }5 K8 b! f G8 ` - //参数2:指定用于更新匹配记录的对象。
; {* I: K/ V0 f) [0 B- ? - //参数3:扩展选项组。+ {! O# z7 o. }5 ?: f! x
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 c0 W$ X2 `0 o+ G% d
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
9 T8 U; h( e4 ~. h; n. X' w - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 m+ O: Z/ x5 q( s3 g
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
- _1 S# { A/ i" }9 C - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
: U0 q& M5 U9 \- R0 k+ j - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间- M. {" } D4 x; k
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒); y0 P- g% u$ X2 ^$ ^; t/ |
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
2 M" f2 }6 I, l+ y -
/ i4 ^3 S4 {- v2 S3 ^ - //$inc:增加特定键的值,若字段不存在则新建字段并赋值& L0 t) G* r+ ?: Y, W! ]
- $mongo = new MongoClient('mongodb://localhost:27017');
% z. X6 F$ |/ x2 g - $db = $mongo->mf;
6 i$ i) X3 \2 |) P - $collection = $db->friend;
2 p# R% y6 S% f" e8 C - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);8 b4 o6 V' M- b' v+ F8 x
- echo '<pre>';
2 u, \7 r* E0 g) l, L - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量! r+ D1 r6 w! A: N% f* X
-
9 N4 h- n! G4 k) _2 k - //$set:重置特定键的值,若字段不存在则新建字段并赋值7 S+ S# [. N' |# K& ~
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
% J! h1 B* ]( ^( v% q+ r5 p - " E6 q$ |+ P5 D" e8 |% I
- //$unset:删除字段
q- }! ?" P* C: Z$ _. \ - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);! X( N- s6 j& C3 C3 i6 x
- 4 I$ I' O/ }* W' `6 l- |3 {4 ?
- //$rename:重命名字段,若字段不存在则不进行任何操作
- m- o% b- i- \' I8 Q - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);5 q5 X$ j8 B( ?, a. j0 D
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。. J, J& ]) X5 u: M9 q, |# n, m4 @
- ! t! \/ ^0 h2 C- z. Z
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
6 x3 z4 r% F7 a" l" y& }* c - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);# c9 d+ Y; V" o3 t. D1 J
-
3 n0 t7 S/ J' J6 E - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
& o# I: g# w1 M: h3 \ - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
1 U& |4 w+ r4 Y+ D* K - & B* B8 L5 ^" ^& c5 t
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错$ Q. B$ E. |( g! z3 ^
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
3 G( Q$ w; Y$ l' B6 e% V - 0 B4 Z2 O ^* S6 B( y/ o
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
! m$ m9 B7 v" ~* w: P2 h& { - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
* P2 k" ]+ M Y, f" T+ v7 X -
2 V* L B$ V2 E) x5 U - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
7 W/ f2 |6 Y+ M% e5 D- J - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);5 ?$ U9 F' ^4 {
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
W* \5 Y7 ]6 F( v - 4 B9 p" a+ U D! `
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
1 F- _. W2 N0 N' b, d - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);. I+ K' h, t1 q& ^7 F( H0 E
- . o7 [& w/ _" W& q5 L6 L
- //$pull:删除数组中所有指定值
. u! q* i6 P0 ?, Q, [ - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);5 Q l" i6 T9 x
-
0 o8 b" \7 D8 i) s - //$pullAll:删除数组中多个元素的所有值1 L; W2 `$ m& n- z0 I
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()9 U$ J7 T3 s; G' r5 ^0 t
- //参数1:希望保存的信息数组/ q+ p* q+ H( c7 z' `
- //参数2:扩展选项( k9 w% C6 Z' `7 Y% d4 O
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
0 f2 e& R) m2 m& x$ b - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
' j# A% d; ?2 b4 R - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
& `8 Q: N& a! [8 I- Z+ @8 W - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ m# s- Q/ r' e8 K) U - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
- J9 B& t! u( q G& t/ \ - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。! I( Q* [5 b' F6 o) Q2 g- x4 _ c
- //若想更新则应该在参数1中指定_id键的值。$ D0 R- G; i5 f
- $mongo = new MongoClient('mongodb://localhost:27017');( T( l. c9 e9 a6 E0 [5 L6 @
- $db = $mongo->mf;
* U% o @' H0 u9 U) d - $collection = $db->friend;1 U; \9 v) |! D( z, J" B0 N
- $doc = [//定义一个文档,即一个数组
/ M2 h2 L- N2 V1 w* a6 s' n. O - 'First Name' => 'Jet',9 q% u& o# F" f" k! ~: H4 o' Q: X
- 'Last Name' => 'Wu',% \: [: T t; S f- p
- 'Age' => 26,
/ E2 B( z, \+ |( ^& [ - 'Phone' => '110',
! L8 V! n* }4 n4 m" g3 _ - 'Address' => [
1 Z" ?7 x3 h5 d; ?2 N) ^ - 'Country' => 'China',( g: l& |0 ^+ U- D
- 'City' => 'Shen Zhen' c- _6 `9 b- S) e- v
- ],
/ q6 \- n) F4 H4 j5 R' p - 'E-Mail' => [
( [7 j2 l. U3 u6 P7 L - '123456@qq.com'," |+ a! F6 ]) y( Y! J6 W0 v
- '666666@sina.com',& K! b4 c' x$ D4 s/ h
- '8888888@qq.com',
4 T6 a8 Q6 R) w1 D( h- j M - '77887788@qq.com'
1 J6 M. ^ M8 t, Q( b - ]8 f, }! E- z% m1 L! }( Q. n
- ];
6 Z" b2 F! N8 ?$ {& i$ j% v4 A - $res = $collection->save($doc);
# F- K6 Z, ?/ }) k% j - echo '<pre>';4 v" T% r8 X% A. X
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
, U+ L7 \; I: \0 p
4 o0 y1 @ {& h7 `9 N
复制代码- //findAndModify()5 @, o4 e3 i `) J
- //参数1:指定查询条件
7 K# Z/ z9 q) O/ }+ K7 T - //参数2:指定用于更新文档的信息' j6 E- l8 \* C
- //参数3:可选,指定希望返回的字段
9 c. b+ v1 s" a( ~: n% X! w: j - //参数4:扩展选项* z/ p& H1 F" Y& k
- // sort:以特定顺序对匹配文档进行排序+ E" ~- q, W4 y) {! t3 i
- // remove:若设置为true,第一个匹配文档将被删除
$ g8 m2 U) U8 i3 P9 w9 K - // update:若设置为true,将在被选择的文档上执行更新操作
$ X# }" t' K1 y - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档' J( J7 f9 o, o. I
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
: L+ Y0 t$ y- l8 g- Z; |* Q$ M - $mongo = new MongoClient('mongodb://localhost:27017');; G- f3 k) c4 \. E
- $db = $mongo->mf;% ?5 z7 a6 f9 E( h, j! i
- $collection = $db->friend;
0 G) o3 o; y- l) V6 g8 @ - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
% m1 d# I8 @* ~% e; L, Z- { - echo '<pre>';! l8 Y2 e. q/ G% Q
- print_r($res);
复制代码 四、数据删除 - //remove()$ ^" y! T# V1 n3 X3 ~
- //参数1:查询条件
9 p+ c3 `% s w9 v& W' l' n - //参数2:扩展选项
" h! {/ ]6 N* g - // justOne:若设置为true,则最多只有一个匹配的文档将被删除" W% n* d& C0 n) }4 Z4 u
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 l. t a4 m X3 D8 j
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
6 u" w& _. }$ a. ]6 U& t - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
% M' v; O# _# x+ Q, U - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间( |0 r3 x9 t( p/ o) Y Z* M
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& L5 p+ W$ K( k/ b7 |' v% Q
- $mongo = new MongoClient('mongodb://localhost:27017');
; \2 J( g+ h: G9 U - $db = $mongo->mf;/ M( g- R' a. W, H# h% [/ x6 \4 B' {
- $collection = $db->friend;
, o5 R3 A0 Z; U5 ~ - $res = $collection->remove(['First Name' => 'jet']);0 X$ u& S( B0 h s6 v
- echo '<pre>';$ K' c" L- L/ j
- print_r($res);//$res['n']表示删除了几个文档
复制代码 0 t* E4 l% K# y; @
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
! z8 U, Y7 ?7 z3 K0 r-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- 6 K) l( ~3 t2 t$ L/ ~* t
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 e( T M9 L8 a/ V. ~
- $bulk = new MongoDB\Driver\BulkWrite;1 H v/ P! c% X Z, Q$ W9 i
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);. s& q! T, T+ a' J. u; n
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);# z7 B$ s2 F m ]
- 6 f1 l1 M- \6 w, S4 a: Y, m: R. _
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认- K$ P+ y* i$ d O/ n1 K5 {
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 a1 L7 i/ S" e
- echo '<pre>';
( @- q+ E2 p, L+ J0 B) j& o - print_r($res);
复制代码
. r; ]2 `$ }% o3 [数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
' f2 }% D2 r, a- c' M/ M+ Z: f0 G4 W* T - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]); Z$ S \2 k5 j/ _( a) M
- $cursor = $manager->executeQuery('wjt.friend', $query);4 l. U- m7 O+ h% j j! d, y' }$ m
-
8 B. [( o/ b$ U( i. ? ^& { - $data = [];# g" Z8 R% l4 T6 F' O6 E
- foreach($cursor as $doc) {# Y" x7 S8 t) s1 W
- $data[] = $doc;! M% }* n5 I5 P4 _ }0 o# V* |# `
- }; O8 P, p! _4 G2 @# z
- echo '<pre>';
4 }0 v4 \+ H% M" U E+ T7 R. Y - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
, T+ t4 Y3 [2 E( y5 H - $bulk = new MongoDB\Driver\BulkWrite;
5 E& J/ l- W E8 `6 f0 h - $bulk->update(
& f2 ]* f& N/ v9 \ - ['name' => 'JetWu5'],! ]5 R2 G9 z! x7 d$ o
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
; I2 |5 l# S6 y6 z" @ - );
1 p8 P8 T+ f Q8 f" j7 k - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ F$ c# f# w# Q: P3 }2 {2 A' F3 k
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. `5 ~ Q% u0 K" q
- echo '<pre>';
& m2 J/ B2 D9 i& H - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
3 z9 S0 N* I! V5 ^! a4 d* l - $bulk = new MongoDB\Driver\BulkWrite;7 P2 }' C8 l3 v& l* o7 _: e, S% m
- $bulk->delete(['name' => 'JetWu3']);( D) `; V( y8 ~
- $bulk->delete(['name' => 'JetWu4']);9 x% ]- e* h2 U; D; W8 D( {" C8 P8 a ]/ c
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
9 [/ e" ]) _' h/ e* Q4 ^( i+ u - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; F! z- G1 ~) }! T
- echo '<pre>';# W/ E" N) X1 k6 d" l* U1 X4 B. W! D
- print_r($res);
复制代码 # g5 f. _; b' T; `% G7 K, f- N
; \3 `# G+ n8 o/ ^9 U- k% @$ G2 E1 q. h: p5 v% v7 t6 Q
5 \* U; R& `5 q# ~# \' B7 e# V2 Z. J: ?) q6 F$ z
|