|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
" J2 v1 [. O# @) L! j, M - //参数1:一个数组或对象3 S! N' }* S. d0 F
- //参数2:扩展选项- W; J( `; K: c q
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘+ }) N# L; D' P2 ]! F
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志3 A/ u# z5 y* R8 |: @
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认! r7 I0 C' [' S% \& `% D+ G9 [4 V
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
$ g. I2 _. V& o1 J - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
: ?% m) V6 D. K0 v9 | - $mongo = new MongoClient('mongodb://localhost:27017');& m6 h) ~2 W1 D3 u5 `6 u* F) X- @' U
- $db = $mongo->mf;//选择数据库" h- R1 y* x1 z+ g5 L; T1 O! E
- $collection = $db->friend;//选择文档集合8 R3 ?, {4 s: a1 r |
- $doc = [//定义一个文档,即一个数组
4 U6 L% \4 [& K' m - 'First Name' => 'Jet',' ]/ \- s6 [- s. w$ b( O; t1 T
- 'Last Name' => 'Wu',& j" ^5 q Q4 H
- 'Age' => 26,% o X* W" ] E9 x
- 'Phone' => '110',
. `) C4 \0 N7 y) L$ R2 v - 'Address' => [7 V @8 O. g6 B# o
- 'Country' => 'China',% p* i% j: c1 o- T% W* j1 M0 E
- 'City' => 'Shen Zhen'
: t7 }( N1 s$ J9 ~ M3 P+ l$ H - ],6 O3 ^0 v5 l& P, U! V8 |
- 'E-Mail' => [
. {7 j' N- E1 R! J) W - '123456@qq.com',3 e+ g [ A1 r+ F1 ~! |0 l
- '666666@sina.com',
0 g# F2 ]. B/ x9 v9 y6 j/ y - '8888888@qq.com',
! M" x$ R% h" B- ?" T8 m9 q6 W - '77887788@qq.com'
3 K, K( i7 ]. }- r" C: U( B - ]' Z# _* @9 S' f7 p, R
- ];
8 x7 V j A: O, u+ C/ x6 k - $res = $collection->insert($doc);//向集合中插入一个文档
' h! y. g- ^3 D, v5 S4 s9 W3 G - echo '<pre>';
; G5 ^. ~3 y6 p, {) ] - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()/ @" g I4 N! l1 A; P* i7 Z7 O- q4 ]
- //参数1:搜索条件
* T' {$ \# E! i D8 z - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
/ T A; M& p) z* }" d8 G: L* i - $mongo = new MongoClient('mongodb://localhost:27017');' q4 Q8 u) w; M: C- l4 D
- $db = $mongo->mf;
' d2 u' \% C) I, y' j) @7 d2 T - $collection = $db->friend;9 e; o8 [1 A% ~8 c+ f
- $one = $collection->findOne(['First Name' => 'Jet']);
6 h8 V; G$ K" V$ e, }! d - echo '<pre>';
: t+ S+ B# |$ I0 A) }2 ` - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()6 M4 V, O0 K& M( B
- //参数1:搜索条件
; W$ d. P# p7 ]) u) Z( { - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段% M( O; s% @+ @0 H6 k: c. c& ~
- $mongo = new MongoClient('mongodb://localhost:27017');
4 e' m4 F4 s: j* p$ @ - $db = $mongo->mf;
0 f% {. S: o7 x' b ^ - $collection = $db->friend;" U) P7 z: B7 L8 R7 p6 D/ c3 v
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
/ R0 @- g/ E$ H2 e4 H+ W+ x; V w* \ - echo '<pre>';
# W; Q T! C" M5 w - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
' E# L1 G/ M5 Y: b: @# z - print_r($doc);) n0 ]+ }1 D" C" F
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询% r8 c: ]% d# j( x
- $mongo = new MongoClient('mongodb://localhost:27017');
& P0 A/ v" ]; _ - $db = $mongo->mf;; `- C2 N# v& X. J* H( f9 I5 y+ ?
- $collection = $db->friend;; q! x+ c+ ^& H5 H' n( _. L0 i7 u
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
( C$ D! Y) h/ ~0 y* V/ C - echo '<pre>';! O* x' f& q: s4 Y5 I. g, m8 _
- while($doc = $cursor->getNext()) { L; P7 C4 r2 n& M
- print_r($doc);
! z0 B' X8 _- F( t0 F - }
复制代码 //查询某个字段的所有不重复的值 q- a+ z: t9 {. S" W) b& e" G
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
7 t, l! `$ {0 Y3 \4 p/ ~3 C - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);8 a2 M( J. A4 l) D2 C8 v' m% Z' x
-
( H9 S) T" k4 R @* |3 V i% t - //$all:匹配多个值中所有值(用于数组字段查询)
k; R, J( T8 t- W, e - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);$ Y/ ^, f9 c% e2 ^
-
" _6 D+ f3 a8 f- U0 ^3 { - //$or:或查询
3 x- [6 C ?& v" f - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);( v6 _7 Y+ l5 d; U" e) s& k
-
3 y# s0 _& K: M5 R - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中" |3 {, F! d5 M' ~
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
2 t) d5 r+ N H6 z& \ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
0 O2 Z! x5 i7 T - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
9 N8 L7 y% i- ]( e+ ^ -
: Y( {0 |. f5 x( }( i5 k5 i - //$exists:根据某个字段是否有设置值进行查询
: V$ ]$ `. M; ~( B% r - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档+ J# U2 m c: r: e! N8 q0 U
-
" O/ b8 Y& d( C - //正则表达式查询
! ?- ?* |/ V- I - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
: w* D; a# I% c* Y9 A# p1 x - $cursor->sort(['Age' => 1]);- c5 i- v3 H! P7 L' e" s. P, Q
-
: e/ s/ \: l$ U3 e: t, B8 _9 T - //忽略前n个匹配的文档
5 H) T0 P6 _! h. y6 o, E - $cursor->skip(1);
5 H6 C# c$ b( d2 `& `- t7 |! \( t7 r+ h - & X! E7 m+ |5 D0 F" y; x* q
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
# }7 H" x7 {' f2 e - $cursor->limit(1);
7 n- S# ]3 x$ J4 T -
9 N8 `, ^8 K0 L! X" A3 \& u - //匹配文档的总数2 i# E0 E; _- p1 S5 o* `; l4 r
- $cursor->count();
2 Z1 [- B4 H) c+ x. E% N - * v% y# F0 h; O
- //指定查询索引
3 J6 C* G, _' }$ p4 v - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
3 l; Y) F- h, n. z; H - $mongo = new MongoClient('mongodb://localhost:27017');
7 m: N$ ?& \% \) h1 p# [5 M0 l - $db = $mongo->mf;
, Y3 k+ f' k( p2 n - $collection = $db->friend;
& ~' {. h" {* A$ o2 S8 Y% \ - $res = $collection->aggregate([
6 D. x) c- ~* `0 S3 a1 S- [ - '$group' => [
A- o9 W; }8 f( D - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组" z5 ^) s- Q' G( B' r1 A9 `
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加16 k( I ~! m' K$ x- m) |5 F7 b
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值0 O4 r9 a4 H2 f* u/ B d7 M2 \
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值( T" k: _$ R) a2 @/ C, C
- ]& h- k4 U9 y# Y: K" b
- ]);( ?' ?3 q1 {& |* _
- echo '<pre>';! Q' \; C, V$ {- c: s- e; R7 p% ~
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
& n( G1 M5 O! ]3 l+ b: z1 P -
# Y; @9 N7 @' Y -
8 W+ J6 Z& m0 U, o% q" G2 M - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
( I' c! h1 B, P# d: o7 ]0 S& q - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
) D7 {, |1 Q* h* Z: I - $mongo = new MongoClient('mongodb://localhost:27017');
k0 b L1 y8 ]) w w - $db = $mongo->mf;$ T$ ~, |- T9 u" w* @0 f+ R7 |
- $collection = $db->friend;
6 q- d% U$ y2 p4 V: u! j. [9 A1 E - $res = $collection->aggregate([- Q' V# q: G3 ? U
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档( F8 {, W% L* l2 W0 K: r3 n
- '$match' => ['Age' => ['$gt' => 30]]
7 u/ x) W# m. C4 S W - ],! z2 O7 Y/ J$ d
- [//指定分组字段、统计字段$ M: N% b9 ?# |
- '$group' => [6 w% o" p8 [) |$ D D
- '_id' => '$Address.Country',/ P8 F( Z9 f% w3 D+ R
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
# F3 v. r: R* E$ P1 ^% l9 e - ]/ C( J- g; H- [- r. k8 D7 g
- ],
9 g# W# A& q, h$ D1 O2 { - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档5 W9 E% w9 R8 h& K* j% _* L5 F
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
0 {2 i7 d( D* c& r - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
3 S' U, Y. R) V/ K) Z* L) e7 v - ['$skip' => 2],//跳过指定数量的文档
! r" O3 S' } M3 a& d. E; G - ['$limit' => 2],//只返回指定数量的文档* a- E6 N( E8 s
- ['$sort' => ['totalAge' => 1]]//排序
. L3 X# ]! M& v( w# ?* C6 y - ]);. @) M5 R' }) @* y
- echo '<pre>';# w: ]/ I% l: ]) @" O3 ^' s
- print_r($res);
复制代码
4 L) a- a; ]0 ], e \( C三、数据修改 - //update()( g* {/ b1 N+ T0 l. X
- //参数1:更新条件,指定更新的目标对象。
, ` \0 n8 b7 J5 q9 y - //参数2:指定用于更新匹配记录的对象。
# F& I' [8 l; R8 y - //参数3:扩展选项组。
4 _: n; ]6 d q ` - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。9 x+ G2 ` w7 E1 {" \7 v
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
" Y) L+ D; P0 Y5 B# `! M* o9 ^6 ?9 X - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
' B2 t5 i* L3 U! ~ - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
; q4 S. ]+ V- z% v. O0 m - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。: x5 }6 z! l& v( f) W ?. R1 a: Y; G
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间* J8 v$ f) K" Y7 t2 A
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)# n8 \- D/ r, G% T$ F" u
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。9 G2 v' {# V& P5 `; j. [0 ]
-
2 O, F1 o8 j; X7 |' ` d - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
% B$ h; |& r0 E( U" X - $mongo = new MongoClient('mongodb://localhost:27017');
$ ~2 S3 _& _6 [( |' v* k - $db = $mongo->mf;0 L. S5 i# A b6 |
- $collection = $db->friend;
3 ], v6 d0 w- }; K8 h; I. D - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
" a4 q8 F: K0 G - echo '<pre>';
$ V5 U: n# ?- E* H" @, d6 E - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
: T$ Y3 O. r+ B' \1 g* @ - + C- b+ t# k& z
- //$set:重置特定键的值,若字段不存在则新建字段并赋值4 H7 V6 K3 X8 X9 T7 I8 A
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);( d& x2 m D, p: r U' [
-
/ a/ w5 U) [2 Y" y# j( t$ P - //$unset:删除字段
, [4 L. V X& \3 a- p' {) c" { - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);# l6 |7 m5 ~& D
- # w a7 y" y8 M7 @
- //$rename:重命名字段,若字段不存在则不进行任何操作
& ?: O, ]( l8 m) T, s - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);& T% [( p' p4 Z6 G/ ?# K+ y
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
0 T$ F7 ]; w3 i7 V# t - 6 C P8 K" Z# K" N9 M. j
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
5 O6 V3 x9 S ]9 k% ^ - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]); t" K" |% G& p- a
-
: ]7 Y9 @2 V: ]; r, H0 D - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
+ G) w6 V5 q, G, J/ u" a - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);' Q/ [$ K _ o
-
6 e, O9 I3 c% m3 ], A, b! ` - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
/ M' D- G5 J, @7 @$ z5 t0 s - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);+ u6 u! `& u! |
- 1 e X- ]% Z3 L4 f
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错) p& i& Q# V( _
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);/ J. o1 c2 r& `8 T
- , w4 H: X+ g& X% k/ ?' i$ r
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
T+ y/ |9 Q" L4 p - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);0 C. J2 L, E; R; w
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);3 L7 v+ p$ j) a
-
/ ]0 s: R0 |/ H9 g6 p - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
0 |& n% K9 ]. m) r) R - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
) m+ _$ D+ h9 x t2 n - 1 |2 H0 j5 t. j, H( q
- //$pull:删除数组中所有指定值5 a/ E0 s6 p" \/ a" I
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
6 o+ l1 U+ f: O. k" o/ A1 L - ; i" L- C* G" [0 S
- //$pullAll:删除数组中多个元素的所有值& \3 V" z5 L, o9 S$ M+ T
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
8 |- K7 o# M& l2 x* S+ D" | - //参数1:希望保存的信息数组
7 G* g8 G: k4 z* Q" a - //参数2:扩展选项
0 ]3 y* I/ A; E6 x3 ] - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。* p. {3 b$ C1 ]2 j
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作2 a. l1 c: Z w3 q$ v( n
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
2 t1 u" G4 ^0 I# X- x6 L$ P - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间4 G A2 R9 e, ~" l' D9 C( w
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
9 t/ M+ K- R1 {' d$ @* y - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
8 f1 @5 j6 k: k - //若想更新则应该在参数1中指定_id键的值。# U8 Y' c+ W) E: a' e( `# Z
- $mongo = new MongoClient('mongodb://localhost:27017');
- m7 d( m& R0 j% o2 e - $db = $mongo->mf;
2 I% N% F4 S& \ - $collection = $db->friend;
% Q5 { E3 N* B" c1 ` - $doc = [//定义一个文档,即一个数组
1 _1 @3 Y" h+ P# S - 'First Name' => 'Jet'," P! K' c6 j M
- 'Last Name' => 'Wu'," q0 I- u% j* Y0 ?
- 'Age' => 26,0 c/ l% |4 G, n- {. l/ ~; ?6 M
- 'Phone' => '110',9 O: b9 j E4 J |& U3 Q" E
- 'Address' => [
4 y6 E0 S- ^- F8 S: M$ q! Y8 U - 'Country' => 'China',
0 S# ?8 ]6 X; H" N - 'City' => 'Shen Zhen'0 \: }1 x. n. \8 W! y
- ],3 \2 Q3 M) g2 I4 m- U
- 'E-Mail' => [
2 e H' W/ ]' u8 T- D5 L - '123456@qq.com',2 w+ R$ f* a0 e( e, ^6 x4 u
- '666666@sina.com',
3 Y% ?$ F, }' ^, E - '8888888@qq.com',3 R% m: l; q2 H, ?: C1 y1 N2 C" Q( \
- '77887788@qq.com'
: j, o N Z2 U& Q" P( I, h( N - ]
* s) q5 q' n% e! h! @9 U - ]; S! A5 D. S; a3 m. B
- $res = $collection->save($doc);
& p4 l) G* i* m1 O4 K - echo '<pre>';
% p1 j, `4 S! f3 Y/ b - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
% r* |" R. z5 P- u. x% x
: m+ [6 c$ X5 B3 h* g) c, b8 p
复制代码- //findAndModify()
. q2 r' E. M a+ f$ j$ c - //参数1:指定查询条件
3 }! N* q7 ?, D1 K! X3 e1 ? - //参数2:指定用于更新文档的信息
! Z1 O$ n: d/ Q - //参数3:可选,指定希望返回的字段
& `* ]/ `2 d- o: x3 \+ A8 I/ l% J8 B - //参数4:扩展选项
2 p! U+ W( o5 B# ]( \6 z9 ] - // sort:以特定顺序对匹配文档进行排序5 H: M8 u d2 Y; C+ [' { U" l; @" h5 }
- // remove:若设置为true,第一个匹配文档将被删除! V/ @2 q1 c4 }( ?2 }/ a. o
- // update:若设置为true,将在被选择的文档上执行更新操作
! d8 e- Z6 w, R" i3 B. }5 v4 v - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档7 V. m( A- M5 @7 g' h4 X
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
9 g( l# A: I7 _! u; _7 Q3 j - $mongo = new MongoClient('mongodb://localhost:27017');+ Z: d' g5 j; z* t+ r! j# D) Y6 V
- $db = $mongo->mf;
' p2 u$ K3 J; I7 x - $collection = $db->friend;
5 Z; M/ c+ u8 t$ s3 w4 |9 ] - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
# M; L$ p" r* Z" s4 X - echo '<pre>';. R2 m$ K% Z4 G( g
- print_r($res);
复制代码 四、数据删除 - //remove(); E2 J0 ^3 |& E8 G! c
- //参数1:查询条件( u+ z# H" ~/ f) ?) T
- //参数2:扩展选项8 x; B8 Z/ u" q" N4 F8 T# I
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除& ?: ~3 n+ A% C; C, D
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。* E- n( P8 y5 z' P+ {6 R
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
) _& K! Y, M, B" c; a+ ]7 c - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! A: Q" f4 M q4 d6 B3 t5 G - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间9 h' E' t0 L' L6 h& Q. e
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)- o5 Y2 u% M+ T( ~2 d
- $mongo = new MongoClient('mongodb://localhost:27017');
# U& I+ t$ C& t# Y8 o( y - $db = $mongo->mf;
) N" P- V H: w* ?9 N - $collection = $db->friend;
8 y( p$ D; `7 H9 H - $res = $collection->remove(['First Name' => 'jet']);
0 o9 _5 d7 x) N% ? - echo '<pre>';
+ q& L- t) |0 u" d8 d0 b; |, M - print_r($res);//$res['n']表示删除了几个文档
复制代码 9 G" ]+ K/ r4 M# n. `5 C% F
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
; ^* }0 |" K) g+ g+ p9 ?4 I2 F-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
" g [" C$ \+ z数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');- F+ A1 G5 R; b8 [
- $bulk = new MongoDB\Driver\BulkWrite;+ k, o6 h s9 s# t
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
0 Z' C* t& k6 d9 I5 n$ H4 G - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);* k0 Q7 D0 B" I! J: H1 ^8 o7 c. c
- ( U2 j+ b/ J2 n8 x7 V9 v0 L; P
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 C6 f$ c+ \0 O/ `1 z/ m
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern); a) f0 Q i7 O: N& w' K+ \, U
- echo '<pre>';2 O* i' c% e* X' D
- print_r($res);
复制代码 x# X9 J% i' G/ o3 r2 ^9 E2 z+ r
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');: z5 |6 O! v' o+ P% A# X
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
/ j" N$ w0 X3 q5 V - $cursor = $manager->executeQuery('wjt.friend', $query);8 Z" b* l8 x; Y; K/ n: K% n# g. h
-
, Z3 K9 G) x: A, U9 b8 |; _- B, F - $data = [];% v7 g# E$ s3 j8 m
- foreach($cursor as $doc) {. r: c8 h2 g X1 g1 {" s7 n
- $data[] = $doc;3 w" _* k1 P9 y) y
- }) Q" G; f3 Z3 r+ v; h7 e V( Q
- echo '<pre>'; g& U, r' m( `7 G& e6 j" Z
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');5 S& |7 m6 I# e H! o
- $bulk = new MongoDB\Driver\BulkWrite;" q1 |' C9 d* q5 B" }& B5 A! [- m& k
- $bulk->update(8 L" T2 N/ z! K7 N5 B: @# Z- I
- ['name' => 'JetWu5'],5 P0 l6 s6 X P2 l; I$ ^- N
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]$ y6 F4 {4 z( Q# ?7 D
- );* j, W, x5 g& |8 A$ \* E V7 e
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 L/ H& m9 o# ~2 A) Q+ a
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" M' D) o* w' G% w. _* g, ~# S6 p
- echo '<pre>';
% w, k2 e5 Y4 h) t$ `) }- w1 s - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
7 O' c+ J0 e: V* [( u. ~- D3 V - $bulk = new MongoDB\Driver\BulkWrite;. N. f& i' {, k, s9 }, {
- $bulk->delete(['name' => 'JetWu3']);
, U4 M4 M, [+ ]" I - $bulk->delete(['name' => 'JetWu4']);
( t$ ^! ?* d9 s+ x4 P - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
8 d( M8 _3 i7 G: V P - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" \" h( d& M* F1 A3 D) I4 _; `: E. D, L
- echo '<pre>'; y' D1 O3 J, T' A- I' G/ ]
- print_r($res);
复制代码
3 r/ Y8 z, B/ h
: Y: k0 \0 D0 d1 A: J9 C7 I- D& t O; [4 |0 T% p
6 {0 ~( W* Y' L* o( \3 Z5 i% e# d# a- O
- |) R Q9 h5 f
|