MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()! I: x+ l, K% u! p
- //参数1:一个数组或对象
' @; Z+ m1 T$ P2 I- i/ n+ a - //参数2:扩展选项! B7 T6 D, Z# @" y; P6 s( w
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
3 k) X% o) V+ A( A( M - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
- }) v; V. }0 ?- g- w9 T% I - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认! }4 s% @0 \& P. w
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间) Y- v+ Y4 v8 G' v$ A% h
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
; i( Q. T' d6 G; Y, a - $mongo = new MongoClient('mongodb://localhost:27017');0 V" N3 f. n, @
- $db = $mongo->mf;//选择数据库
1 R0 h: m% F/ n+ G2 K+ A, E* j- W Z - $collection = $db->friend;//选择文档集合2 y- A5 E- s/ L, _& B" m
- $doc = [//定义一个文档,即一个数组
* t+ ^9 K; A" v9 I5 X' s! F& p - 'First Name' => 'Jet',8 ~2 w: t: K- ^1 H2 B# m, M
- 'Last Name' => 'Wu',
( p% H& h1 Y% i* S# ]' Y9 U( x - 'Age' => 26,
% P2 D, `- U; J& }0 q& N - 'Phone' => '110',
+ b) r j! i4 a5 e+ y" L5 O) | - 'Address' => [
- m# _6 w3 ]% ~# J5 }) F; K1 O7 [/ [ - 'Country' => 'China',
* T M) t4 Q) U6 u$ j# L) F - 'City' => 'Shen Zhen'
- M. _: U/ d9 u, l - ],: z& y- q% F7 S. \1 l8 K. [2 z
- 'E-Mail' => [* R' }5 \/ x5 }/ h
- '123456@qq.com',) \) ?) {, W- h4 w- b7 o4 [
- '666666@sina.com',
- |* B- H3 k2 y: p" ?/ ?& Y' s - '8888888@qq.com',
1 G/ p% c5 d" v - '77887788@qq.com'
$ c8 W+ p9 o3 b# Z; `3 { - ]
6 p4 r+ E' z, \7 O0 k% L - ]; ?9 E/ [, H- L0 t: z8 m
- $res = $collection->insert($doc);//向集合中插入一个文档( ~& B) d; @! ?
- echo '<pre>';
( g- c; a' ^9 p- g2 v - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()/ ^# A0 O7 `7 E& q+ y
- //参数1:搜索条件" C N5 }( p$ c9 R' |& o4 D6 X
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
0 V# E; | y! w- f3 P9 I - $mongo = new MongoClient('mongodb://localhost:27017');8 y2 q: O1 p. e* {
- $db = $mongo->mf;) z6 k9 P& g8 \- |3 c
- $collection = $db->friend;! L5 q( a+ ~5 y g; s, m* e" \4 P! u
- $one = $collection->findOne(['First Name' => 'Jet']);
$ i& O* V6 c5 J# v+ R* M) @/ o - echo '<pre>';
- }# Q p1 A- n - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()2 z. q/ a1 t# m' `
- //参数1:搜索条件
# ]+ V- b4 p2 n; ]% O4 F - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段: r! k6 b9 t( X+ h$ m Q
- $mongo = new MongoClient('mongodb://localhost:27017');
. s: v9 }$ r2 y* p$ {# J - $db = $mongo->mf;
3 E/ n/ `# X: @ - $collection = $db->friend;
9 b2 t0 P8 }, c$ @, t - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素( |: b. `& t. `5 R" z& H; i% _
- echo '<pre>';; p3 {2 `" {+ i) S
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档/ E% _" Q" R! X
- print_r($doc);
1 @4 ] N: B8 I& w3 T O - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
) N9 l& ~4 a& h - $mongo = new MongoClient('mongodb://localhost:27017');) ^2 S2 M- N8 b% \: u
- $db = $mongo->mf;
! [+ A, H2 C$ C; O: c, { - $collection = $db->friend;7 z% d7 y! U/ [! k
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
( k: p9 B8 b" P' M - echo '<pre>';
' } p8 @0 w3 ]2 k4 y6 l - while($doc = $cursor->getNext()) {/ O5 \) ]1 m) I" Y+ Z3 X3 ]. c
- print_r($doc);
) L# O( G4 a& x- n; e. w3 V) G - }
复制代码 //查询某个字段的所有不重复的值
. {8 G% B' [" M: E $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
& H) m6 Y/ {& f - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);4 U5 B* _' n0 z Z" P8 v. p; a+ G- G
- 1 Z) b/ A! O. r5 f) @7 ^1 V3 U
- //$all:匹配多个值中所有值(用于数组字段查询)" l& f. B; ^7 l6 J8 w8 b v8 I& t
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);: S* o ~7 a2 n
-
, U4 d8 s+ r0 r( q0 N& z7 o - //$or:或查询( j) L/ [# h9 Q! K3 _2 ?: Y( {( x. ]5 O
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);4 z; q; Y) h* |2 ^
-
8 m! R' }5 t F. C2 i - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
' l& q1 a* ]4 [7 }( B9 k7 g1 t - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
9 z2 |8 b, S% f) t( w* Z5 X - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
0 @) h" N" G5 r, I, A+ Y - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
. \! r( y5 q7 z/ U% Q - # d6 g7 {& `. w+ v1 ^
- //$exists:根据某个字段是否有设置值进行查询 P5 P: ^, F0 D: ]5 P5 }1 B
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档* u' ~" K3 t0 z3 z6 @1 U4 L
-
) H0 G3 {' k! C, N# H h2 s - //正则表达式查询* f: }9 V! W' @! I
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序% v4 T1 A d/ ]( p
- $cursor->sort(['Age' => 1]);. y' v1 R% k' L4 `
- " ]0 b' c9 p' Z( d v8 N& m- {8 a
- //忽略前n个匹配的文档+ w5 ?0 b$ t0 _& S/ M, B/ X
- $cursor->skip(1);' k2 X& e$ V2 D% x
- / Y$ y n) v) h0 _
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
. b7 s. r1 _2 { - $cursor->limit(1);/ [4 O3 G0 {4 P+ f% m- O' G
-
* ]' W% N% j2 J% `) C- z8 | - //匹配文档的总数
3 I- {5 W. j3 y9 [ - $cursor->count();
% Q- y v1 g7 ?& Z5 a/ L: N& d -
/ N8 r" r' L, P: J" G - //指定查询索引
$ Y* o, `+ U, i4 q! u - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计$ m+ u9 a1 A" w/ n' B* U0 I. D
- $mongo = new MongoClient('mongodb://localhost:27017');
0 X3 A% c4 E. p - $db = $mongo->mf;8 i# ?( o K; u
- $collection = $db->friend;$ ?, I6 C u2 x% s) Q9 O
- $res = $collection->aggregate([6 T! B- q) W; E$ \. h& L7 g: q' k
- '$group' => [' U- T4 ~: E. t; }7 n
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
4 \) D) @3 ? P9 E: \ - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
l! a7 U+ m& R0 o - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值4 j( h0 }- s; l0 l0 m; F5 k, v
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值" }* E k! C; Z6 I* N
- ]" C3 P# t: Y/ f; ]
- ]);3 L0 {* b7 t9 S, V* _
- echo '<pre>';
" G5 y8 k* i, I" G3 I; ~. l) i; p - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果& R* F( E4 A" P% e7 i8 o0 k
- ; N7 Y. X1 e9 m9 t m
- ! D3 G1 v0 i7 p$ K" F2 X
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序% S+ m/ }3 ?6 `7 g3 y, C0 a
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
) A) p6 b& {( w# W% I% Z8 P - $mongo = new MongoClient('mongodb://localhost:27017');
+ @/ m/ [) s/ s8 p8 s% ~4 P% y - $db = $mongo->mf;3 k( B$ }, s- u' P7 {' j0 \2 Y
- $collection = $db->friend;
9 W0 \& J, C( L+ x1 A; z - $res = $collection->aggregate([- A) f2 y9 o; B. M7 w& Z& y, D1 D
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
; k( E9 X6 ^( y - '$match' => ['Age' => ['$gt' => 30]]
0 U8 U" J) t' W) h; O/ c+ I - ],
& Z! l2 v/ Z9 ^1 q4 o- [ - [//指定分组字段、统计字段" n* {! c, m6 j6 k+ t1 X4 Y
- '$group' => [9 i. n! S5 X7 |7 D
- '_id' => '$Address.Country',8 ~0 Y2 x% r z6 J: N r' |
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
# o7 r7 Q$ L9 r7 D9 z# I' k - ]
+ ]6 W( S+ Q$ `$ m - ],4 v z/ `* @6 j
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档$ ?- G K: w0 A0 ^
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。: C! w T" G6 C7 k
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名& N' r1 A' i, R( C' o7 N' N
- ['$skip' => 2],//跳过指定数量的文档+ ~% E9 O2 K% m/ S
- ['$limit' => 2],//只返回指定数量的文档
+ [. v+ _" y; @ N - ['$sort' => ['totalAge' => 1]]//排序
* a `$ k" X0 g h9 O8 ?+ I8 K - ]);
& w7 {& f3 q8 G( ^ n: R - echo '<pre>';" _2 k. U$ L8 N' h z! ]
- print_r($res);
复制代码
3 @) I: n: e9 h6 A三、数据修改 - //update()
! T2 E1 A% a# e" x ] - //参数1:更新条件,指定更新的目标对象。
9 H, h6 l% a4 F! e3 c( p7 x1 u - //参数2:指定用于更新匹配记录的对象。' w2 b0 Y \+ q# J- |2 H9 Z4 l
- //参数3:扩展选项组。+ L6 f( o/ B& Z: K: _$ `
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。" ~( b. n" e) J2 k1 M& y- ~
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。" z0 Y* n6 ]- O# }7 j6 J
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
0 t7 P( c7 k5 |+ q% s2 S - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作* u* H8 J) M# h/ d
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% R6 {0 {2 p, [0 Z
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ k6 l0 `, I7 ~2 p4 q& {/ t
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
3 |+ r1 ^6 q4 I' X: @ - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。, a6 q, y. i6 |, g4 S9 k
-
6 R: W& h- z# J) H - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
( i- u9 [6 K5 P# s - $mongo = new MongoClient('mongodb://localhost:27017');
3 n; i# v7 y8 x( t - $db = $mongo->mf;: N* N+ k) i" l5 c
- $collection = $db->friend;) B3 y- V; ^8 Z, m. J' E0 x$ n; R
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);0 ]) \& I% j8 s) t
- echo '<pre>';
7 \7 Z9 [, \ ~9 o& X! t; i1 ~1 { - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量: f! C( w j* K5 {/ E6 m$ j
-
- \$ Z" T$ ^6 k7 z# r - //$set:重置特定键的值,若字段不存在则新建字段并赋值
$ ]8 X+ V& w! k B9 R - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);8 u" V" {) \( _$ V
-
" L, ~5 s0 I% L* V1 ^. G - //$unset:删除字段6 T+ H3 }2 F, D) T2 t4 z; L
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);* |7 J. l9 v/ }) m5 g6 y
-
: L5 S8 r! j" u# W3 x - //$rename:重命名字段,若字段不存在则不进行任何操作
. S O" E7 H) I7 H5 E, x - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);! s8 {' W# X1 F
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。; a' `- _: w$ W) z$ k$ E
- - B+ y, [: d9 ?6 t: }& O
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
: ] |4 z' w. Q+ P - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);6 N8 p: q B# }# @& N
- 6 \3 H3 P2 } M& u# M: _0 z( s
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 Z* J- z7 a/ ]! d3 O - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);6 k3 o+ C' g) ?2 Z
- ) k8 |$ J" `6 x
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错2 i! N9 S% C8 D( b% _
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);! _* d# P9 x: Y0 y
- , T; K u0 A* S7 l. s0 V
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错 g, }- E2 R- B' A4 r! ~8 s5 w( j
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
/ Q y, [/ {6 x -
8 p, u1 C- w' w2 F' a6 a1 s- [ - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
/ b& }' G; G9 @3 @% m0 k - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
/ a+ Q i+ ~" j/ U- M5 z' C - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);* B* w. X" v y, X+ Q( [
-
0 d0 g! N' \" o- b7 b# P0 `! C - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)9 Z5 Y+ \; E E7 \
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);' z& a1 ^/ N$ w- L& `
- + d$ v3 s! P8 G2 `4 K5 @5 O
- //$pull:删除数组中所有指定值
8 D, `0 _9 k8 U - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
6 \3 Y3 S3 i7 H/ g9 S0 k -
- @8 x9 B" h) t* ^; V - //$pullAll:删除数组中多个元素的所有值# z A$ f' q: R0 q9 V
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
0 w8 {; o2 x/ J - //参数1:希望保存的信息数组
) h1 q, W* ^& `8 ` - //参数2:扩展选项: J/ p8 Q3 G, V p! s6 a
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。1 s2 j2 s& e5 q
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作/ M& H3 q( K9 }4 \
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 V& c1 W5 T# w& u" Y( v, o( y& D
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
: J4 g; d6 J6 c% Q - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ H* J9 `0 s6 R& H& L H
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。5 _4 l1 {# D* a5 j; E& V) G5 I
- //若想更新则应该在参数1中指定_id键的值。5 f3 A! e8 r8 B% R( z$ K3 q
- $mongo = new MongoClient('mongodb://localhost:27017');- L6 P1 |% v1 ~9 D/ u0 ^
- $db = $mongo->mf;
2 Q7 h3 r5 v, g a. J - $collection = $db->friend;
2 L! P5 ~/ f+ l! y/ e* A, V6 z - $doc = [//定义一个文档,即一个数组
' e4 k$ z/ m$ P" _8 b. i/ N - 'First Name' => 'Jet',( W" E; |1 B# N: Y' I) \" U( G) J
- 'Last Name' => 'Wu',
8 R }% E1 ~+ ~ W* N9 u - 'Age' => 26,
3 b2 r, ^6 [6 e. \+ L' Q$ B - 'Phone' => '110',
. `6 |4 a& B4 @' Q) B& {, A H - 'Address' => [
3 ? W( R9 j8 O7 G - 'Country' => 'China',
1 m( y: B% U/ A! N4 R - 'City' => 'Shen Zhen') ]4 O8 b+ y( y, ]: u2 d+ `6 c
- ],
3 K. G# B2 S" o9 o9 U - 'E-Mail' => [# X) _: V: b- }5 x+ F0 a
- '123456@qq.com',
+ O' u- r: [5 k& |9 o - '666666@sina.com',
6 E4 Z6 \4 \1 K8 \, @% o - '8888888@qq.com',% x$ ]- j1 M3 _) u; w. q
- '77887788@qq.com', O H6 S& e( l: T+ h
- ]
/ l7 n. f) S; k$ z, P# x1 t2 H - ];
! f1 ?; L/ d0 M8 L1 N - $res = $collection->save($doc);! W" a4 s# m+ ]9 Y
- echo '<pre>';! N: H( h, T! L1 V1 p, M( v
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
0 C* j5 l2 o7 b: P$ a
2 N( \; S; M( s
复制代码- //findAndModify()
R9 R9 F/ O) v: Q7 @# O/ \ - //参数1:指定查询条件* U7 n& I1 [# [: I8 X$ U2 _
- //参数2:指定用于更新文档的信息% y: X4 | P' e1 ~9 h2 E
- //参数3:可选,指定希望返回的字段
; R$ z6 f* b3 u; B6 P - //参数4:扩展选项/ _! D# q: q% l# J8 p: G% h8 N
- // sort:以特定顺序对匹配文档进行排序
4 N: L* O( A/ E2 M1 I. r - // remove:若设置为true,第一个匹配文档将被删除& D7 e* T2 x- G3 `1 P7 Y: |
- // update:若设置为true,将在被选择的文档上执行更新操作
/ w/ }$ s) s! D" {' O - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档5 x3 x; N' P) L( ?8 o0 S& e* v
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
+ L( {$ B5 a7 f' ~/ w: n3 ? - $mongo = new MongoClient('mongodb://localhost:27017');
# g1 B* j _6 e/ ?% W - $db = $mongo->mf;+ W( P; N3 p3 d) K/ y: b( L7 a
- $collection = $db->friend;
' j( a( _$ ~$ l- H2 Q# S- A: w7 g - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
! @- p S' a9 E/ {2 _ - echo '<pre>';, A/ A/ {5 [2 K% F/ }7 f
- print_r($res);
复制代码 四、数据删除 - //remove()9 H6 ~0 G' V1 S
- //参数1:查询条件
' K3 m& F7 W6 W- J - //参数2:扩展选项
4 l3 D6 f. Z4 x" t - // justOne:若设置为true,则最多只有一个匹配的文档将被删除; c( w O. e+ [7 _- H( ^
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 [) L3 t% w1 W
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' @# L3 T# n6 X$ Q8 F2 l
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。& i$ V) j3 Y3 A; l: l9 X+ y4 P! I
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间% r3 A+ C& H# k: h- b7 o K2 n+ u
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
8 s2 |" U; ^: W1 p - $mongo = new MongoClient('mongodb://localhost:27017');
& }9 [6 N' G: X - $db = $mongo->mf;
/ G5 H( R2 _( @ p - $collection = $db->friend;
8 ~# v. ^3 k8 k - $res = $collection->remove(['First Name' => 'jet']);9 h& X! \+ b; e; A9 z. `
- echo '<pre>';1 Z+ x( G& j& t; p0 p. j
- print_r($res);//$res['n']表示删除了几个文档
复制代码 7 K; N) A- y* H2 g
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
7 W, a9 _ _' [9 L-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- : H: x+ Q( c; d6 ~9 G
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
# H8 P$ Y) G0 Q& c9 T) f4 E- u" `& `( ^ - $bulk = new MongoDB\Driver\BulkWrite;( N0 C6 K& u( D
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);8 v' Q6 C& Z/ Z5 g9 K. l2 v$ |
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
% f) t h {! } - Y f& V" O' p* p- \) l$ r$ a% W
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认5 Y, \6 a' p" M/ _
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
1 F7 G/ j$ B' _9 \ - echo '<pre>';
8 r: K5 v' Z& s; i9 ~ - print_r($res);
复制代码 ; M% v) [/ X4 w/ P7 D7 W/ G0 c
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
/ _1 U7 T& a- n+ j- g& b - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);! y" C% J3 |, s* Q
- $cursor = $manager->executeQuery('wjt.friend', $query);, W% C: G% _* O# d4 i5 R9 Q* i
-
5 ]8 y+ f8 U0 n. n4 L - $data = [];- r% }& W3 p A9 ^" S) X
- foreach($cursor as $doc) {
: g) ]" ]0 p; b) ]6 t - $data[] = $doc;
1 M% H3 a! ]. Y! v. `& D - }
) g/ e* W% ~& n - echo '<pre>';$ ]; o- T/ o7 |; E+ @ a
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
C2 m" S- Z K: Q( x - $bulk = new MongoDB\Driver\BulkWrite;
5 y+ r. Y( l7 @- D7 H6 A - $bulk->update(6 [. ^) d3 o& ~ P( z* d; l
- ['name' => 'JetWu5'],
& G6 B# u) u# u* R5 s; G - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
T8 N' Y: R1 b) e# O$ e# X - );
5 G+ R6 ?$ c7 {' h# I h, w - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
( T. D. h6 M. A N. H W - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
; m$ N3 B+ L, E0 s - echo '<pre>';
" d6 z& x3 j4 Z9 m7 L' q4 C7 [ - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$ u8 M- H& v) [1 Y/ o - $bulk = new MongoDB\Driver\BulkWrite;# [ d: u/ Q- x3 @0 H* o; F
- $bulk->delete(['name' => 'JetWu3']);' R2 w0 p5 a0 h/ _; O' z3 F6 c
- $bulk->delete(['name' => 'JetWu4']);
1 Z" f7 p+ w( z2 P! E. q& _ - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认5 U. @& ?' |2 L3 q6 P
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; G% ~' z; R0 R. j
- echo '<pre>';) ?, X; C& N! h& @3 ?
- print_r($res);
复制代码 3 }' F9 F4 [" ?
1 d( ~+ S" ~7 `
( t: p$ w6 W$ H6 p# D, |! Q* `+ x6 e, D( m
" p- v$ Y# R* }; S$ ~5 ~
* u5 z/ s# | _) n* U+ c
|