|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()' T; U7 N# R3 r) P
- //参数1:一个数组或对象; l9 {1 b; Q1 o# ~; v6 U
- //参数2:扩展选项
, X% a" y1 v0 n3 C- O6 x - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘7 i6 R9 Y( V9 i6 E G
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志0 M, M/ b6 w% F, W
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
8 l- p- G1 w6 I6 U+ e7 v - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' `8 L0 P6 _4 \" K; m! s
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
/ m: u9 j! U3 I$ K$ R# @0 N - $mongo = new MongoClient('mongodb://localhost:27017');
+ T/ H/ [- y, i* L - $db = $mongo->mf;//选择数据库, M j/ }1 Z3 `2 h) K+ I1 F0 m
- $collection = $db->friend;//选择文档集合3 k& A" n2 {1 s2 S7 q
- $doc = [//定义一个文档,即一个数组6 J% k$ B' D: }9 E
- 'First Name' => 'Jet',
/ g, N; y0 s2 q - 'Last Name' => 'Wu',/ j+ s( r5 Q+ |( Z! b
- 'Age' => 26,0 z5 d5 G( a6 `3 H! w5 E% C
- 'Phone' => '110',
0 u) r; A6 A* i- ?% E# G0 ] - 'Address' => [7 c: ]) S0 p$ e, ]" }- m9 f
- 'Country' => 'China',. @5 K: R* j1 u0 p/ N
- 'City' => 'Shen Zhen'1 N4 C7 D! r/ h" d, a
- ],
% u t8 z$ g. D$ K5 Z& t - 'E-Mail' => [
5 I$ \) C2 Z3 v* [, R: z' I - '123456@qq.com',
4 x% c7 P* _2 j! _, L/ ] - '666666@sina.com',' p! R- y9 K$ o4 f6 d
- '8888888@qq.com',3 N" s* D8 z$ [# X8 n( z. k
- '77887788@qq.com'
4 u- x% l+ Q8 U - ]: x( r( @6 I6 c7 I* ]
- ];: g( p/ v) e! w* v! h
- $res = $collection->insert($doc);//向集合中插入一个文档* T; T! l6 Z$ C [- i6 \/ y; |
- echo '<pre>';
9 J4 T& i0 V; f1 D, B3 G - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()1 W; j1 i! z: s; z
- //参数1:搜索条件
8 [2 z, C/ ?2 \/ ~. ^/ `9 V0 ?/ t3 p - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
- B, m$ {7 G) W4 J4 i6 V8 Q/ D - $mongo = new MongoClient('mongodb://localhost:27017');, V1 T& T6 x! S: y! m
- $db = $mongo->mf;
. ]7 i; t! l) }/ A - $collection = $db->friend;
+ U2 v& d1 x; \- m' D - $one = $collection->findOne(['First Name' => 'Jet']);$ { I+ H6 O: `/ W9 I
- echo '<pre>';. K" Q9 }1 d+ _& M8 p8 J
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
8 T5 o+ @' e1 X; ~1 U2 R1 v - //参数1:搜索条件
* N. @( J) H& z% s* u9 W - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
( R- S% x0 S6 ~) F5 j8 | - $mongo = new MongoClient('mongodb://localhost:27017');- D3 r& q& j! g+ W( |9 o
- $db = $mongo->mf;" N' |' X/ o, Q3 }! N" ~. P' u! L
- $collection = $db->friend;
7 u2 T% m# ^/ M# C - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
' H0 f" r( G* }% } o& J& z - echo '<pre>';5 X# `" A4 F; Z' Y6 a) o: G6 t
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
5 s' ~ o1 l; k - print_r($doc);
: \/ q& ?( _+ j" l9 V/ N% d - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询" t4 x9 h1 R [ E
- $mongo = new MongoClient('mongodb://localhost:27017');
6 X9 Z7 v {. C ?+ o. I - $db = $mongo->mf;
' L2 N8 }; B7 H( s+ f. Q( a9 c - $collection = $db->friend;% X$ x" @: h/ j
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);' \: \3 X( L$ B) f; D
- echo '<pre>';: C" m# ~9 v7 Z X
- while($doc = $cursor->getNext()) {
1 E; }) P' T- v3 G; R: Q& Y - print_r($doc);& k3 w: [, O: P/ x; d \6 `* H
- }
复制代码 //查询某个字段的所有不重复的值+ l0 Q( C% F7 x
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个8 D, N0 f7 F% U3 t ^2 K& D
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);$ i" A( P. F# G- |9 j' L9 t; z4 b
- * S( [; x, l" R/ v2 y( e0 n. _
- //$all:匹配多个值中所有值(用于数组字段查询) T5 `# |: `7 c" u* {) ~
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);4 |' a9 {% `, H) E/ n T+ u
- 5 S7 o" L5 T" v" L# u8 S% {
- //$or:或查询1 l$ K [5 B5 u7 T6 ?! g
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);7 i& w5 k- [3 r+ ?9 [: G* _2 r
- 0 I# Y* ?. o: R6 K) u# f
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中0 B" ?) P' [2 T9 W- \
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
( u) u" v) E8 F: A1 v - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email) @0 r0 u7 i3 |* Y# o4 b8 q$ L* c+ N$ d
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
7 j5 }$ F+ E* l' e% n -
8 g1 j, j# w7 k - //$exists:根据某个字段是否有设置值进行查询) @% S, p- N% v; t8 q' Y
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
7 |3 D" \9 _+ h% `. t H4 ` -
0 D$ p+ J L" Q. u9 L4 N: h# y0 k - //正则表达式查询
7 Q5 g9 Q( T7 E - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序. L) a9 D; M& ^0 K8 |* m
- $cursor->sort(['Age' => 1]);4 a1 n' s T- {. d* h
- 5 H4 R* Q. Y0 r3 W8 b3 j( M# y" U
- //忽略前n个匹配的文档) |5 B8 U6 {: v) M! e" u
- $cursor->skip(1);: P+ M9 X6 S% @+ Z, Z, ^
- + i5 C- {$ H+ f6 K# U
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)* l( Z0 _, l, F- P, W
- $cursor->limit(1);' Q$ i/ m& H. o$ K! U
-
: {! w7 R' A& ~5 P; k - //匹配文档的总数
! t5 ` |7 r% a - $cursor->count();$ R- Q0 C6 F( H9 k% B% F, v
- 7 c9 [1 a `+ O; s, v( ^
- //指定查询索引' O( i5 f( v& S+ Y, u
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计+ r8 t; ~" u- |' D
- $mongo = new MongoClient('mongodb://localhost:27017');" u! }% W, t0 S7 M- I9 z" V
- $db = $mongo->mf;2 j8 M" Z. O" i. t. x2 w
- $collection = $db->friend;" \2 u- P' L+ E! a' H
- $res = $collection->aggregate([ p" U$ U5 Q7 ?5 Q- t* V, B' U
- '$group' => [, F6 r9 [/ ^3 C5 l( F/ e
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
. H3 Q/ L5 u/ B+ ^' Q; Z. M - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1, o$ {& n+ N3 E0 ?: A
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
$ m$ m2 K. N0 Z) `- ~ - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
+ l% s2 V/ x. s m( i. I+ I - ]
! R& [& p9 }- R, `6 @& z - ]);
3 V+ r0 ^& i2 h/ _$ z' d# q - echo '<pre>';2 J9 W' v( V4 w0 K
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果6 f/ C% V, c: D- ?
- 5 c; D+ x3 G7 t% f
-
- ?3 i$ A/ r; a0 |4 B - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
$ q" M5 n0 }+ J6 m) k* v - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
i+ k) P' r P) S: g - $mongo = new MongoClient('mongodb://localhost:27017');. H d$ U6 h0 W9 X& j0 v( ~
- $db = $mongo->mf;
" t9 @! A* L1 H0 C) P, Z d8 ~& o) W - $collection = $db->friend;0 j G$ e* X! d
- $res = $collection->aggregate([3 I6 i/ _1 G2 }# A8 r2 U o9 j
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 T. j5 n0 ~; j' ?
- '$match' => ['Age' => ['$gt' => 30]]
. v" x5 X/ C+ N9 I& U$ h - ],' y5 p8 k5 T( i; i9 C
- [//指定分组字段、统计字段9 U& ?7 k. u" E8 x9 ~3 @* Z
- '$group' => [
7 v! X$ H* @5 O - '_id' => '$Address.Country',
. a$ c# |' ^4 l4 t3 V - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和! a. l8 z3 a) @) @7 z' t ^
- ]8 P! R+ p% u4 V5 o4 q3 F
- ],
8 f: g, {4 Q( x! w1 i - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
+ z5 c2 O1 m. L, A. l1 P2 k - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
\: o( p9 G# L- {. V - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
, T1 F- b- I( Z( m - ['$skip' => 2],//跳过指定数量的文档
+ a* i1 L2 x5 e - ['$limit' => 2],//只返回指定数量的文档
+ q, {& t" F& g1 P0 F7 } - ['$sort' => ['totalAge' => 1]]//排序
: g w p5 c! s - ]);
! p1 z8 ~& k2 o - echo '<pre>';1 S$ w; m; A) c* V( P; j
- print_r($res);
复制代码
9 o/ C6 f5 z7 c三、数据修改 - //update()
- m& l3 R# h r0 ^: m - //参数1:更新条件,指定更新的目标对象。7 T( F- C+ S, k; _1 e( a% j' }+ Z9 v% Z
- //参数2:指定用于更新匹配记录的对象。
$ s) q1 w: i$ n8 ~ - //参数3:扩展选项组。
9 H Y: x9 E5 U m' }3 g - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
; d# w& Y; i' e - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
( O5 U+ H) A/ p- S - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% }8 Q! Y/ e/ e- {: F+ ]( G
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
) r& Z' v# F" E$ C6 ]2 g6 ^ - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
5 _' B% b( U6 M4 H) E- K - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间5 H( [1 A. L& I2 w( i3 e% T& ~
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)" s h- l( v3 U' F# u0 e
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。$ |$ q. Z% [: H e# V$ x
-
5 n1 @- _/ p. y5 k3 B% B( K - //$inc:增加特定键的值,若字段不存在则新建字段并赋值9 N) D5 m4 A4 H( [9 T
- $mongo = new MongoClient('mongodb://localhost:27017');
$ O% I, b# ^- a. D - $db = $mongo->mf;# S: Y& `- x- `5 T
- $collection = $db->friend;2 {9 @) [9 J& T) {1 Y) q& D
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
; Z& ], C* L' u5 r2 J - echo '<pre>';
% J6 B# r% h% S+ z- E - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
v3 p' d+ k4 E" ?; M8 \- Z - 9 i, l3 @) m4 p3 F' h# B2 U
- //$set:重置特定键的值,若字段不存在则新建字段并赋值! t7 S+ n J# O# R
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);2 j& b- p- F0 r/ g' T& m& p9 ~
- 4 n* P" r# ~0 X6 ^4 X4 Y
- //$unset:删除字段
0 x. l1 S. d0 U) l$ A4 f' Q! c; ` - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);3 O k6 w/ I0 M9 N
- 0 u7 i& l& n' O) o8 W+ q3 W
- //$rename:重命名字段,若字段不存在则不进行任何操作
- ^0 o1 L( |4 { - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
( w% m- a4 Q, R5 I3 f- N5 A: c - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
' m( w1 t) m$ w* z -
& v# J% O1 N7 Q - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的2 A9 |9 ^ S. g* ^9 K
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' m" s9 }+ K* @# H8 a
- ' d' o! W, {- H5 U
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错5 E2 r1 y8 d% H* h) W
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);$ m9 t0 e3 b4 B) `% K
- + c+ t) M2 n- p8 ~, x- d9 o0 k: ^
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 y4 e3 F6 C4 u! ~0 E0 W9 j' v - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
% V" e; A7 |3 c* b, M - / K# L1 J: p3 k( W8 M
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
' q) A9 ~; w. F5 R# X& f1 |: } - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
' t& k+ F4 v% U/ O4 P8 z0 R - ; ^: x( ?8 u: t1 `6 A' d; s0 y
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)& _& K3 o. E* h0 u. y5 W7 L2 o' A
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
/ i8 s) K* c& V: {3 a - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
' @1 @" z1 X. L; r7 H -
+ J W) \" a2 A" u6 m0 z - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ Z+ }% n5 x+ `- } c Y* X9 w/ C! y
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
4 q( o2 x/ ^" B0 \2 h. U) y -
9 f) b) A" S0 f4 F" T( M - //$pull:删除数组中所有指定值" A: f+ I+ `8 G
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
3 J3 P y( U' C8 p% W+ J - * k7 t: E' E" v: [
- //$pullAll:删除数组中多个元素的所有值4 f% V6 p2 |4 E. [
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
, ?, P0 ?# Z. Y - //参数1:希望保存的信息数组
3 W9 U/ E9 ?3 L5 | - //参数2:扩展选项+ Q8 V5 w2 f8 X* d; K7 e/ a, n0 V
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。6 L. O; c7 I, U) t/ x
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- V8 j- I) Z, q0 P: T
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。& y t: J/ N7 Y, |: Q
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间1 n, K, }/ Y+ z, h& [, b
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! [* g1 s: \ A9 Y# m1 q
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
; h }( h: ?7 m6 H3 o# F - //若想更新则应该在参数1中指定_id键的值。
7 n2 k+ f j9 u/ ^& W! t - $mongo = new MongoClient('mongodb://localhost:27017');
0 X- b. A4 f( X4 z7 Y% ]7 m. m - $db = $mongo->mf;4 t* {$ [( T# A }9 _. _
- $collection = $db->friend;7 y) z' b; D# G( j
- $doc = [//定义一个文档,即一个数组4 _3 B) v# j/ l# p, [& T
- 'First Name' => 'Jet',
* z' Z9 C# f9 O1 ^! o7 | - 'Last Name' => 'Wu',/ C3 B! ]6 r# y3 E d5 P; f
- 'Age' => 26,
% p6 z& F5 q4 ] - 'Phone' => '110',
# T$ g- b6 z2 ]0 V - 'Address' => [8 e. ^ f6 W5 I! C
- 'Country' => 'China'," _ r1 l- \; w+ u: Y" l% z/ M6 c7 C
- 'City' => 'Shen Zhen'
8 ? z7 q5 f8 l E - ],
: E* K5 t. \6 b0 @ B - 'E-Mail' => [7 q: V" h6 i3 u p# h A9 Q3 X% c8 h
- '123456@qq.com',
/ j/ E( s; K9 v. L$ q - '666666@sina.com',5 G( `9 e0 _& c$ ~
- '8888888@qq.com',2 n" Q5 E% X) a
- '77887788@qq.com'
' m" K/ |) U! G# c1 J/ m. W - ]4 H) F1 }# Z% u& j5 }+ g9 z; Y. \0 m
- ];
( M3 }. H m/ ~. N - $res = $collection->save($doc);# ?) F" H! }' P1 I4 Q$ t
- echo '<pre>';
/ X j6 M& S' Y4 e4 v7 u - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
% E, ^( b: S/ I4 t0 Y4 Z% S: }3 L% E - 9 `" {3 s# t0 z& C5 b' O1 W1 Y/ H
复制代码- //findAndModify()1 O, _: N- l1 J0 X& f6 ^
- //参数1:指定查询条件1 o2 Q+ Y G$ b4 F- M! h" t- E" L
- //参数2:指定用于更新文档的信息! l0 \# }% ?9 S4 Q, V1 v3 ?! a
- //参数3:可选,指定希望返回的字段
/ O, y z, @9 E% r8 p8 t - //参数4:扩展选项
! g: {) h7 V! z8 s6 U9 W+ k - // sort:以特定顺序对匹配文档进行排序1 m2 K: m- W1 g- k. H- O. E, {
- // remove:若设置为true,第一个匹配文档将被删除
; v& U" e8 X) @, g( q/ V - // update:若设置为true,将在被选择的文档上执行更新操作
, i) M" o: L; Y - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档4 b+ I. V, X6 K; `
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
* v" E1 M5 p. u3 J* b% d - $mongo = new MongoClient('mongodb://localhost:27017');; z. ?' s( l" E& p; g- t
- $db = $mongo->mf;
+ [' T0 r% X7 A% k+ Q - $collection = $db->friend;
. J" u' j1 F$ o& v - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
, O- V* l) G" _1 p - echo '<pre>';
; {0 K9 k c( X- A ?% d- J% |- ~ - print_r($res);
复制代码 四、数据删除 - //remove()
+ ^7 N- v* Z4 } g+ n - //参数1:查询条件- ~) o" C. R/ r; k2 {$ W% y
- //参数2:扩展选项. W5 ~* o- q2 u$ @5 g9 k
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除, c9 u8 @, O" O$ h
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
5 L5 I4 T* n$ T0 P - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% J6 o1 s p8 \% S7 @ ?; j( c
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, Y2 ?5 X( S, l# g0 ?- O
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间1 _) u0 ^7 B1 D$ M$ C# {$ D
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)$ a% k* m5 l, E! d# r
- $mongo = new MongoClient('mongodb://localhost:27017');/ b, f, q7 _: P% `
- $db = $mongo->mf;6 J- }+ b. \( S: E- J
- $collection = $db->friend;" D3 Z1 l3 ~* t. V1 P0 l- F2 p
- $res = $collection->remove(['First Name' => 'jet']);
2 X3 y& e* H+ U8 L - echo '<pre>';1 ^4 K" s5 [/ z4 n; S$ C
- print_r($res);//$res['n']表示删除了几个文档
复制代码
! ?" y, y) v: Z以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 8 S% O7 j) k* O. |% o& d' n
-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- ) i# M: K. h- r6 ~/ e. L
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 u. q3 R* n/ |* K! D; }9 D
- $bulk = new MongoDB\Driver\BulkWrite;0 N% l: e% _3 }' @( M& W
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);$ w; O/ e2 U9 X. G. y# g) Q; |
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
8 A: N: t0 ^ R! e& l/ F( e$ ] - ! H) k2 k; {6 O- x+ q
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认+ A3 t+ ]0 k" X
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
/ z) N9 S2 B, x" \+ D ] - echo '<pre>';
, B( V2 ?6 m5 N" u+ @ - print_r($res);
复制代码 : s! t! P5 P! V& H4 m F
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
, j, X7 ]4 B3 }6 T' }3 j/ C; U - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
# }; j: `) |* @8 N7 i' v - $cursor = $manager->executeQuery('wjt.friend', $query);- ~' Q4 j3 v/ H+ V, t
- : e! _7 U/ \, k2 p8 }
- $data = [];
$ s& a1 r4 d; V" c7 h8 `+ j( z N - foreach($cursor as $doc) {$ A' g$ ^( D+ Y1 e
- $data[] = $doc;$ A1 w$ K( p5 Y! W l
- }( s2 O, c. `8 S
- echo '<pre>';
; ?) k. F5 K# j8 ^1 x% a - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$ L9 u& i% Z9 p, W, f - $bulk = new MongoDB\Driver\BulkWrite;
0 @+ J6 o$ [9 b - $bulk->update(6 X, h5 {% y! v1 H2 H9 }
- ['name' => 'JetWu5'],
4 O- [/ o! V4 v* j7 I - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
/ }1 `9 j" r9 Z2 I$ a+ P! m - );
; a9 ^( l( J8 t; }. _ - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认. ^. x4 Z9 z; A2 A3 S% g) Q
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# ^( F5 D$ U: D b: U* x; i
- echo '<pre>';
U7 {, [4 ~; e; v( N" D' O - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');6 h) ?* k' t( h- V5 ]
- $bulk = new MongoDB\Driver\BulkWrite;0 V0 w9 l {; q; J) M
- $bulk->delete(['name' => 'JetWu3']);
/ M) S7 R! [ W: h' _' S( b - $bulk->delete(['name' => 'JetWu4']);
Z+ L+ o' z6 K( n; N+ v - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认/ B( c6 r) d& D, J
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);4 P2 D" M1 d3 K( y
- echo '<pre>';
; A5 v5 B, h. N' F, }' R - print_r($res);
复制代码
. _ ^6 u: ^- Z( u
. C' ?; e- p% Q
# c, X a3 a+ Z
" `- q! v! ]" {0 P0 k
% T9 O+ w: F! Z! d/ b |