|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
$ B; Z, d: X. S - //参数1:一个数组或对象
0 {( A* Q) j4 T6 \ - //参数2:扩展选项
/ q+ z' e! k0 T# O" e/ k1 \( @ - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
3 m& G, ^& I3 P1 M0 `9 }+ A; ]# Y2 ^ - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志; z8 r1 M) w5 M
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
2 P- k) {$ d( i* V& B% { - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# E" p( |8 n8 F$ g. b - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! e# t, U3 C# O7 b+ }8 U7 H& ~
- $mongo = new MongoClient('mongodb://localhost:27017');) R. b, K0 P" e- Q
- $db = $mongo->mf;//选择数据库- I" [5 n1 \5 Q t1 c
- $collection = $db->friend;//选择文档集合
/ T% o# \* k' w6 k2 D$ o$ ^4 N. U - $doc = [//定义一个文档,即一个数组/ l. \+ R4 i3 i$ u7 u$ y; A
- 'First Name' => 'Jet',
$ U1 h/ f& D2 {, X - 'Last Name' => 'Wu',
$ e. l( Q% T! c/ P6 G6 R* t - 'Age' => 26,6 p; ?2 N% M5 n$ W
- 'Phone' => '110',# F1 h H, S" l* z# \4 ?
- 'Address' => [
" @" W3 R0 t' w - 'Country' => 'China',
2 o+ m& ~6 c8 d% K - 'City' => 'Shen Zhen'
2 G# {: r1 ]' N" a) r - ],8 s, `5 d& A: ]8 A' e
- 'E-Mail' => [( h; F5 s% u: f! v) ?2 k& b. a
- '123456@qq.com',
3 V$ D3 d9 G1 W9 m% ?% {4 W3 r. ~( q - '666666@sina.com',
5 g+ ~$ |. ^+ _4 B4 ?9 m - '8888888@qq.com',
" R5 u& y' F- c' {* n - '77887788@qq.com'
6 @; t. O+ @" g+ @3 \2 X" M" w; n# c6 L - ]$ g1 c" D6 Q4 b P( z, A* h+ z Q. A
- ];
& T4 w$ r! c; h - $res = $collection->insert($doc);//向集合中插入一个文档7 m g, g; j7 z: b5 s, [1 ^' h
- echo '<pre>';
; }- F. K# T" t! N; q( c' [ - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
/ h) d! |# Z+ c4 i/ v( z$ b# z - //参数1:搜索条件
: p% ]9 d/ C2 O6 n% c - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
, S3 j: ~/ [7 L( N - $mongo = new MongoClient('mongodb://localhost:27017');
2 T0 C6 U6 [, L - $db = $mongo->mf;
; E- t$ a. ^4 |9 d" G$ S- L - $collection = $db->friend;
) l5 A9 u# }( Q8 g - $one = $collection->findOne(['First Name' => 'Jet']);' ^; i6 I6 ~8 T* C! e* P
- echo '<pre>';: v, ~* z4 F( a: B* E4 X7 i; R0 W: k
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
3 E6 i) O+ Q3 r- `7 @8 j/ _ - //参数1:搜索条件. y$ X) \4 p5 S* T6 p9 N9 Q
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
1 L# C8 L8 F: u - $mongo = new MongoClient('mongodb://localhost:27017');& ?1 f0 `& l4 D; J
- $db = $mongo->mf;& x9 P; o, y8 `$ N$ l# c
- $collection = $db->friend;: V9 n: b' p/ I% v2 ]
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素: ?1 }: u7 y$ z0 d- Q# u$ r+ p
- echo '<pre>';
$ A# ]3 `1 w, @2 y - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档. M" D# w. U1 D F6 G5 x* Y3 I/ r
- print_r($doc);
/ X7 Z, M, E' x& C" b - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
9 `4 x" [0 L% c# B2 a - $mongo = new MongoClient('mongodb://localhost:27017');$ T4 I* L F" Y3 n
- $db = $mongo->mf;2 s4 p3 Y2 O# k! D% e, U
- $collection = $db->friend;; B. J9 s0 \( |7 J; _6 K3 Z x
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);( E' `" G+ e; G1 j4 |# Y
- echo '<pre>';5 a5 q1 g. V" }. M+ w0 q. b9 @
- while($doc = $cursor->getNext()) {& w' N+ w" a8 r5 H6 m3 t* E
- print_r($doc);
A! B: @' x4 L6 P) }9 e, ^ - }
复制代码 //查询某个字段的所有不重复的值3 ~5 X6 E, v# t8 E( o9 B
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个5 s# T X! `4 O
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
- O. `! c3 t7 R3 l- G - ' u4 F" V1 S" X1 F" ?7 z: J7 M
- //$all:匹配多个值中所有值(用于数组字段查询)
3 x( C/ M( V8 ?! } \# r G* Q - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);9 W1 u) M1 }5 V! p
- 6 v8 `- Z2 ~8 o, f/ Q- |. ^; Z
- //$or:或查询
8 v" n% U' e' i+ d$ `( k4 A: T* E - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
& M1 I2 ~) ?# q6 p/ c - " Y- g% `/ b8 T( i* a8 Q
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中( q& A* [7 P5 }' h/ \
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email& k" j, u8 r% W ~- ]' V; n
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
9 K2 C( U: [6 A/ l; A& ]; v# J - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
! F) G! ~, s) Z0 v! t -
' F5 S/ |) I0 n! B! b0 M7 e - //$exists:根据某个字段是否有设置值进行查询
' a( \$ P" b- Y; L5 } { - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
1 }6 U3 J) Y, E! ]! c- n& }) } -
5 T/ f3 H9 \. a5 l/ y7 F! D - //正则表达式查询3 b* {; M: }6 y& E6 P
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序+ j9 l. K1 p8 ~2 B7 P* U
- $cursor->sort(['Age' => 1]);
% e4 i# `) B2 @' r) h. F' k8 L -
+ d/ `" |; i/ G4 V( K K - //忽略前n个匹配的文档/ p, w- a" g& [$ L
- $cursor->skip(1);
' K, Z# w; p" m7 J# s( l; O - $ Z6 ? o, Q" m
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)0 G, t% a- O+ {
- $cursor->limit(1);
; E! K' O: g. x1 g; _( L9 w8 H -
! _8 u$ L2 j l4 F3 N - //匹配文档的总数
9 S4 I. [3 p: y% h8 `) @ - $cursor->count();
/ O+ O! j& W, M3 e9 v$ R5 O9 w -
: b) A- Q$ y: Y. H - //指定查询索引
+ j A- w) f4 U1 L# ?3 g5 E - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
9 Z6 O: d3 A7 Q - $mongo = new MongoClient('mongodb://localhost:27017');
: S4 c' z8 y' ^! M; m - $db = $mongo->mf;" e3 I3 @) Y% x, \
- $collection = $db->friend;% T; O, w3 k) G
- $res = $collection->aggregate([
+ w- G( y$ i" L4 `$ L$ d9 f - '$group' => [) u" e2 ~3 x# U* b* G, ?; g5 {! n5 k
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
/ }/ b# M4 o1 K, Z - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 k- M9 B: u( _9 ]* n) d, |
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值# V3 x4 E6 W8 [+ I* S
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值8 q! o& g% d' y# m+ q( b. ]
- ]9 Y4 a3 Y+ W+ h: t
- ]);
8 R; ~. t( p2 y1 q - echo '<pre>';4 c* a1 ]: B1 |+ M" |
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果* [9 H) w, [7 P
-
/ P; ?( R$ v' W1 u$ L+ { -
# F: s0 E3 S) z* G( n0 W - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
7 |- U/ k9 f4 `% B) i. @9 T; A* k - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
4 m, \( k- p; K& Z8 X4 }( n - $mongo = new MongoClient('mongodb://localhost:27017');" \% a! M* ~% b8 {1 J. ?
- $db = $mongo->mf;
$ ^6 d# t' ]3 f/ l7 J3 B - $collection = $db->friend;" [, Z( r( \8 \# h$ P
- $res = $collection->aggregate([
9 s- {0 @! O: A) } - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档- ^9 U9 \; K; W6 G
- '$match' => ['Age' => ['$gt' => 30]]
+ r, Y% q4 o/ u+ y% ~ - ],$ f* f1 A0 G7 ~- P/ y" ?
- [//指定分组字段、统计字段
M- T% Z. c) M F# D - '$group' => [
. B9 g/ {; e: V) R. i% Y - '_id' => '$Address.Country',8 m* ~8 C9 Y; ^8 N' k6 [4 o: T2 ^
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和" q1 ~9 {( F j2 L
- ]
. }" n7 ?, B1 N4 U) h - ],( _; P$ V: Y: q& r! n: T s5 h& U
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档3 i+ I: S1 K; J/ p# L- c+ J$ i
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
9 F. o1 A1 q+ s. n - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名* D4 a2 o- U1 f y/ D' ~
- ['$skip' => 2],//跳过指定数量的文档
8 [6 L( x$ P( }) L. W! l0 T, S8 E - ['$limit' => 2],//只返回指定数量的文档
1 e* b- L, ^3 X" A) F - ['$sort' => ['totalAge' => 1]]//排序. f6 J7 V! s" `# x' Y) ?
- ]);
, l. s* c1 I( o% o; [ - echo '<pre>';
* f0 L+ t6 t9 o* I# {* k - print_r($res);
复制代码 7 g! j9 [. B( n5 V. i
三、数据修改 - //update()( K- s/ o3 n, I+ d7 z1 Z3 l
- //参数1:更新条件,指定更新的目标对象。
4 m$ B5 G5 Z7 e; R- E - //参数2:指定用于更新匹配记录的对象。
/ B A; v* y$ P L" i0 k - //参数3:扩展选项组。
* P% r) d$ |( g7 k3 c3 C( j - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
1 E7 v# p7 S( Z5 L - // multiple:默认为false,若设置为true,匹配文档将全部被更新。 Q$ g3 C0 \. `) ]6 _
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。; Y! F$ [6 M9 x4 H- J M n
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
& d) ~# D; \3 N& C - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 T6 |$ @& w! C0 u" r S6 W
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
0 T% ]8 J4 L3 y# v3 j; c3 X - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
6 m7 }8 A6 A& D - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。 Q. d" a/ O8 s3 K; `
-
: f6 I9 D4 N2 N - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
% `( I& R5 ?" L/ g - $mongo = new MongoClient('mongodb://localhost:27017');. s+ S. _% I$ i) C$ K1 v W% G
- $db = $mongo->mf;
- b4 X% K3 K7 @3 b - $collection = $db->friend;
# l: v& [& m: E - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
$ k, c4 J: p$ h" b2 C2 z& ` - echo '<pre>';& f$ H9 ~- i8 d; k
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
8 }+ ^; C7 d1 I8 P9 R2 t$ b- Y -
. h% }" l4 j) H1 a - //$set:重置特定键的值,若字段不存在则新建字段并赋值
- `5 M6 Q" e! G0 W& W4 {( n8 I - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);* q3 f" r" Y' N" b2 g D
-
J9 _- E1 n4 `* x - //$unset:删除字段7 L \4 a7 F' q: L$ g- t
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);; X+ v- r1 ^; ?' C
- 5 F% {3 G) W# ]+ L
- //$rename:重命名字段,若字段不存在则不进行任何操作
( w; A! m6 ]; r( c5 E& @) O4 Q - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);1 U) {5 e/ x6 m( ^# C# Y {
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。/ S! Q' f( \5 y5 _' c( G9 H* l
- + c _/ b) {% _! H" v7 x
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
$ w" L- ]% |- N0 n0 T) Y2 d - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
+ ]9 c9 f+ @6 c" I7 r f& P( ] -
D V- [2 ^0 R6 _8 r - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错; V6 }/ I) ^. H- L% s6 k
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);! H: P+ O# Y( ?- j6 D& W T
-
0 x k( ~1 p; ~+ x6 _: t - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, { i5 e2 Z6 _* S4 m, j) ~; d& M
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
6 B9 y8 a. z& n/ o. c3 E - + h1 a7 i2 V& d# |3 Q" p
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
`7 d9 L6 r, Q/ S - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
4 m' w) x$ ~. F! ] -
+ R; L; N3 T( v1 y+ @0 B - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
/ c8 A2 `7 t$ ~ - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);6 K$ |" x& W: X" u3 r X. [; T+ f& _
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);3 H% s# v5 |+ |; z% w
-
1 P/ h1 `, T% w1 A& b4 }5 B - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)* y+ {/ w6 P9 R! ~+ J0 ]& y
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);& U: J% h3 C$ q
-
: }5 ?# C8 L5 [* J: K( P - //$pull:删除数组中所有指定值; l: F3 p2 W6 W* p2 G
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);+ b( z& l6 k2 @5 j. x" }7 o
-
# _9 r0 O' `/ L( o0 B - //$pullAll:删除数组中多个元素的所有值5 a5 Y6 u/ P3 ^4 H+ t* A
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
" E2 ^3 B7 Z. [! o5 v& S5 G - //参数1:希望保存的信息数组
( W7 K3 ~' o- r5 } - //参数2:扩展选项
. j- Z3 W2 h4 m- w; ~ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
% j" ~( }1 I- T3 ~- O& j' I - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
. ]( b1 Q3 q2 {# \ - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。# |" }+ {: o! B1 F6 ?6 B
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; l! ^3 i. L6 ?! |5 s+ W; i' @
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
) j, Y& J' ^- U3 x+ V5 O - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。2 u" ]1 |; w' p
- //若想更新则应该在参数1中指定_id键的值。
9 `9 B9 Z5 F3 x6 O - $mongo = new MongoClient('mongodb://localhost:27017');+ r' q- ~# L. Q
- $db = $mongo->mf;
) k# l1 t4 U. u; f) t - $collection = $db->friend;
6 b) l& e# Z' [' E" ? - $doc = [//定义一个文档,即一个数组
, k; A/ N: K' A. q7 c+ g - 'First Name' => 'Jet',4 T4 H/ T9 X9 [& z$ u
- 'Last Name' => 'Wu',0 A* N$ j+ Z2 J! ~& q
- 'Age' => 26,
+ y9 K; V) a, [" b - 'Phone' => '110',7 Y+ S* I; A, @
- 'Address' => [) r/ w+ i6 j. ^( ~; L* V% V" T
- 'Country' => 'China',4 c: C9 |1 r \6 j I& ^6 G) z
- 'City' => 'Shen Zhen'
% a4 z3 K4 T0 L- V% l' W - ],9 Q+ Z; I( y* H& a) {# O, h9 P% E
- 'E-Mail' => [
: X& D p/ _/ T" i - '123456@qq.com',
: M2 i9 D2 d. p4 n! S+ D( L" ]9 j - '666666@sina.com',6 G; [& N% c# J/ l
- '8888888@qq.com',6 U U. U' L; M! ?& [# S8 r
- '77887788@qq.com'- k2 v8 f* K' O- _
- ]7 p; \5 K% L/ r. i/ d. G
- ];
6 K, F- J5 ?2 V( A$ D - $res = $collection->save($doc);6 o7 w4 W) C7 g' }2 p0 q
- echo '<pre>';
) y4 P6 C& _9 `) Y - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
. i5 y! A- g( _" Y
9 L& N( a9 I. E) h3 D
复制代码- //findAndModify(). J& c- J& o3 n; I: P6 n$ P: l( A
- //参数1:指定查询条件
" x3 M6 R+ X4 g. T) t. X - //参数2:指定用于更新文档的信息- |6 Z$ e/ n* E$ ~# @' W% @
- //参数3:可选,指定希望返回的字段
% d+ G- _% j, M$ |: W* } - //参数4:扩展选项4 H( E1 t6 `" H" v
- // sort:以特定顺序对匹配文档进行排序
" N' n, {& W* F, h - // remove:若设置为true,第一个匹配文档将被删除
7 i4 t2 @) g/ E& ]3 { - // update:若设置为true,将在被选择的文档上执行更新操作
# `" N8 ^$ c8 G7 C# k - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档4 I# B; q9 b1 `0 o5 |' Y
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档: \6 k( l: v2 j" \4 b- ~0 H
- $mongo = new MongoClient('mongodb://localhost:27017');
: M; U5 _( s' ~7 l4 P - $db = $mongo->mf;
0 V4 {8 R1 V J2 e - $collection = $db->friend;4 n. o& n+ f8 ~" f- j
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
$ N8 |8 g0 H7 u' H8 x - echo '<pre>';
0 X6 T& P: z$ z! O) G# M, E' Z* R - print_r($res);
复制代码 四、数据删除 - //remove()
9 b; c8 t+ o8 L# h. O0 W" j. R - //参数1:查询条件% k. ^1 |* |6 T
- //参数2:扩展选项
1 ~$ l+ ^+ N5 G! {. e' a+ c - // justOne:若设置为true,则最多只有一个匹配的文档将被删除2 q$ r- ]5 Y! N* g; m# |
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, I7 L0 N& E* p% b: M
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作) L4 q- v) s$ ?& k( w9 I9 ^5 ]
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
& n" c1 r" i8 ^ `% ^) l - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
9 K. R5 c: y% O! `, O - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
% U, X7 K2 C% f) R; F1 H - $mongo = new MongoClient('mongodb://localhost:27017');
' ~- c. H3 O. J8 J5 V& h; {: ] - $db = $mongo->mf;6 k5 B/ Q7 v* _9 Y( Y3 h/ V
- $collection = $db->friend;
# O* U6 F2 H4 A7 ^3 }/ q - $res = $collection->remove(['First Name' => 'jet']);( [) h' `; ]+ Q/ z
- echo '<pre>';; w4 H; H( f* b
- print_r($res);//$res['n']表示删除了几个文档
复制代码
% X( S$ p6 p9 u& @以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
, d8 L4 @% i% E$ L-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
% {: C+ u' r. `! L/ G数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 c, Q, u: d# J% o: y
- $bulk = new MongoDB\Driver\BulkWrite;. ~9 d+ I% D% M! t3 H% e
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
7 L) @3 t* Y7 x* r. D+ A+ Z - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
W' l! _% A: k/ M# g! u - : J+ m- ^( g5 L
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 Y# l; s5 Q ~6 q2 z* }
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
6 W) H) K" ] h p1 @ - echo '<pre>';
& z& T I. T# G$ c# z- B - print_r($res);
复制代码
; i. j1 K1 u/ O+ ?数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" @8 K& c& f3 C' a" N$ E4 C
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
" J( A d; ?* O( H - $cursor = $manager->executeQuery('wjt.friend', $query);
% C1 Y7 E# ~9 r: w -
& P( ~0 [- B% B2 m! |) L9 @0 W: | - $data = [];
% Z: F- O1 c0 q3 s1 l, S - foreach($cursor as $doc) {
! k# U T6 S$ B2 w1 G6 Q - $data[] = $doc;% d( G1 B0 ]" I* p0 l& l! N+ M4 X
- }7 _2 W p$ Q5 N2 g8 t, C7 {) m
- echo '<pre>';- a, m2 e$ x' @
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');: m* ?: t% ?! r: N7 X+ C( G o" j
- $bulk = new MongoDB\Driver\BulkWrite;
" G7 E( Q/ @3 ` - $bulk->update(
' Q, B1 ^& |0 d+ o: {' m - ['name' => 'JetWu5'],/ Z: Y3 V+ p+ ]) Y2 t2 o
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
% T/ i+ k1 ?9 Z - );
$ X2 F& Y" i4 e) @% c+ O3 g# l* C - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
% {% K! N; _* S - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ V9 j. l- j2 Y0 @
- echo '<pre>';
8 \* G7 @" W3 @$ z6 E* H - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
: Q" d6 `$ o1 r" i: } M4 D0 Y- P/ m - $bulk = new MongoDB\Driver\BulkWrite;8 q; u8 X1 s% ~. m0 }! {
- $bulk->delete(['name' => 'JetWu3']);, ~6 e8 I5 a% v; r8 r9 n5 @
- $bulk->delete(['name' => 'JetWu4']);
( A6 m" t. b! H( M - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认 }* O8 W2 U5 T0 k. ?' d
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
* y" O+ a& D: S! p; k( H7 x e2 g - echo '<pre>';
2 Y+ x$ X" b* n/ D. e8 _+ c - print_r($res);
复制代码
# ]5 r' V3 A2 e
% L) i: Z" \7 G
+ O M- N4 I+ x0 W6 B* D
, ^! n6 Y# _! V x$ w0 J
+ |( q* [) N9 s4 @% V6 f |