cncml手绘网
标题: PHP操作MongoDB(增删改查)php7.0以下 [打印本页]
作者: admin 时间: 2019-3-5 13:50
标题: PHP操作MongoDB(增删改查)php7.0以下
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。
一、数据插入
- //insert()
! ]7 D6 S' `& P; z - //参数1:一个数组或对象- J5 T7 W) M- U8 G2 B* z5 ^
- //参数2:扩展选项
7 i+ G, D3 s- @. s i - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘3 q$ z. l8 K6 ?5 C. w
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
8 q) |8 S! m4 Q) D3 H - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认4 K6 U6 k8 @" \9 Z1 N+ j
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
' d* ^- v& P# C6 D9 ? - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
" [1 o, o, N5 q, L9 z - $mongo = new MongoClient('mongodb://localhost:27017');* @4 o0 Q7 P' L6 G/ x/ {
- $db = $mongo->mf;//选择数据库
. M1 y5 s( @6 T9 y4 Q - $collection = $db->friend;//选择文档集合; E4 d" u+ ^5 O0 _( p2 F+ n
- $doc = [//定义一个文档,即一个数组# G" S% f2 w0 m
- 'First Name' => 'Jet',) G- L' G7 w0 n8 X, ]$ k9 ~9 J
- 'Last Name' => 'Wu',) X: i; A, G' A2 {. Z4 u) n
- 'Age' => 26,
) U, W" {$ ?( b5 F; r3 w% }* n - 'Phone' => '110',
) @* X+ _7 o" y1 N1 L" d/ \ - 'Address' => [' k4 m- C; S: m7 _6 ?+ _
- 'Country' => 'China',5 W& V9 l# J$ a) p
- 'City' => 'Shen Zhen'6 [7 w% ^* \3 c0 I: I* l
- ],
4 x5 I4 P; ?, z. D7 h6 ]6 Q/ O - 'E-Mail' => [: _4 v2 c! C- r7 o3 x! u
- '123456@qq.com',
0 Z. u1 [3 N. _5 A - '666666@sina.com',
j/ J- C9 Q' s - '8888888@qq.com',
4 O+ K4 L* s8 } y8 u7 h - '77887788@qq.com'* k4 S. K* y, e) b. Z
- ]9 S3 F* [: o, x4 ?) K" @1 P
- ];
+ f- I h+ j! h w' q8 T - $res = $collection->insert($doc);//向集合中插入一个文档
2 w& i/ G( k: ~4 e8 o5 ^: j- m - echo '<pre>';
) h' U$ X# V: K; ^ - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne(); P# z" S& z' j
- //参数1:搜索条件
* p$ l) [, ?* O/ V1 w( k - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段1 |" a* p( C4 N" q" R9 W
- $mongo = new MongoClient('mongodb://localhost:27017');* v9 O7 w' w p& I5 S9 T0 T; ^
- $db = $mongo->mf;/ J( v" q# d" E8 J; [
- $collection = $db->friend;, t+ z9 b, d& L, f; r) j, R0 e
- $one = $collection->findOne(['First Name' => 'Jet']);
9 Z) y. ]6 ^3 ?3 | - echo '<pre>';
& S( y2 o8 R* y i - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()
0 [5 m& U& u2 r/ x! c - //参数1:搜索条件
n( L3 @& i1 h1 k - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
% M2 N) o% i9 }' L7 D& k - $mongo = new MongoClient('mongodb://localhost:27017');: D/ D3 V8 k( o( Z
- $db = $mongo->mf;
! H" \7 d& h/ f% [2 J( v1 o% s0 ? - $collection = $db->friend;
" }! b4 P9 m) k O - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素, o3 v9 C4 K2 x$ O2 i1 }$ q
- echo '<pre>';
6 M8 Z4 o# m7 c' |+ v - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档* D3 M+ ^4 X* z, V* t+ |' v9 f
- print_r($doc);" T4 m2 H: A/ r
- }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询$ F* @' M; F: [! i4 O
- $mongo = new MongoClient('mongodb://localhost:27017');
7 J! B* D/ ^% u7 O8 ] - $db = $mongo->mf;7 q( P; z; E; e2 L# N* T4 U
- $collection = $db->friend;
9 ^; {! N/ K. P- ? - $cursor = $collection->find(['Age' => ['$gt' => 30]]);6 Z! F& a# Z# H U
- echo '<pre>';! C! w7 h; @4 j2 b4 }+ L1 H0 q8 g7 Z* d
- while($doc = $cursor->getNext()) {
j) n" w4 K5 m3 U - print_r($doc);1 V) T5 G# G' }2 C1 W
- }
复制代码 //查询某个字段的所有不重复的值7 y: d. J; g! O" X
$res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个
$ I, n# Q0 ^. A3 W/ Q - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
/ q8 O) e! R& J+ w -
4 Q+ H' {# @, @5 K1 q, x+ x7 t - //$all:匹配多个值中所有值(用于数组字段查询), c6 a4 ?+ O- M4 J. w# T Y6 j
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
, y# Z& T: }, S" n* s0 g8 x/ a1 u - 3 h3 w f5 d3 ^+ G( o
- //$or:或查询
4 Q) }& E6 R( Y: u) v - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
, y: T" e* O* i; g) I - ' k2 |2 R# {; F9 s$ V& Y
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中) N; k- J; e2 ~2 B! X; ^
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
* W3 ?& x: x- ^9 E" L4 z& m - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
) `. D+ [5 W% R5 S) f, @" G - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个% w; |9 M% l8 C+ p
-
8 n# X; I+ G+ m; h- T0 f9 h - //$exists:根据某个字段是否有设置值进行查询
+ M! ? ~$ k, S4 ? - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档 t: z/ k4 ~2 j& U
- 9 l6 u1 {7 K& k" F8 H* V9 |
- //正则表达式查询: ]6 f; ^1 S: q( t
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序 _0 f0 U& t, V' T! P
- $cursor->sort(['Age' => 1]);. O- Q, y9 V( l$ J3 q
-
/ o( x8 o' J+ o - //忽略前n个匹配的文档* H. A9 s- x0 ]) @& n
- $cursor->skip(1);
% d! A7 ?! j' Q5 f# d -
" X' `$ o" @$ J9 R* O; ~/ e. O - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能) p6 E7 S! h; o
- $cursor->limit(1);; O i% Q3 u; i( ~3 S; p: |2 X/ Z0 `6 I1 P
-
0 N+ L# f) d6 J( n' u - //匹配文档的总数
' |* U& E t' `# b - $cursor->count();2 J/ ~$ P" y/ Y& G8 I
-
1 l( j' A, e, F6 N - //指定查询索引
! f; q( f: R- j% a - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计$ b. x* h% N8 {, ^4 c
- $mongo = new MongoClient('mongodb://localhost:27017');
! Y# Y% y7 ^* v - $db = $mongo->mf;6 c6 O" v1 _( H
- $collection = $db->friend;- Q3 O0 E/ Y, _2 W# \
- $res = $collection->aggregate([
9 y2 Q7 |7 x" z. i% o, M8 M - '$group' => [
|5 x' r0 _- t8 E - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
( q/ i! t' C/ X. M+ J* Y - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1* n8 }+ o- B7 s) |2 ]* y
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
' z( j3 {. O4 n9 X - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
/ ^3 O r9 W" C% W- z - ]
, O. Q# j) k; S5 ^( n4 o - ]);
3 I) Y/ E: J. c7 ^% |# l - echo '<pre>';/ R) b& B; t$ n# t* Z
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果0 V/ A' f! W% e
- 8 O2 t7 K2 R2 b8 t
- # ?5 j; W# M4 j2 b) B
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
5 }% o( ~* K" j& w% l6 |: M. N - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
: B" G$ [4 C9 i. W' T - $mongo = new MongoClient('mongodb://localhost:27017');7 R6 ]' e# O1 `: W6 I
- $db = $mongo->mf;' I: \( Z3 v! X4 O
- $collection = $db->friend;
7 M3 a* \' F w6 E, v& C6 B - $res = $collection->aggregate([9 a0 W. R' _' ~' r' b% O6 h
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
4 x1 E; u( b1 V: I5 h5 b - '$match' => ['Age' => ['$gt' => 30]]
; t6 t8 d+ d- x8 U; S - ],
. B) k4 \+ t2 z( h4 q# u- R - [//指定分组字段、统计字段6 g# [( K; e6 X4 j! w$ n
- '$group' => [
7 V- m2 P6 p8 v, B - '_id' => '$Address.Country',
" `1 m4 u, r+ }9 o - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和% X5 X, [) o O, J) Y1 `
- ]4 D v3 _' d! S4 \
- ],
/ e! B/ T+ z7 [6 u9 n+ \5 \ - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
& G% \ |0 |+ _& n9 \! p) Z - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。; l% \* h( [: m/ }/ r( K
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
* s$ ^8 R) u) e/ n3 \# u - ['$skip' => 2],//跳过指定数量的文档
- @! ]: z" M+ _# I, V: p - ['$limit' => 2],//只返回指定数量的文档( K; M+ u) F0 S* y
- ['$sort' => ['totalAge' => 1]]//排序
5 @3 x2 n: h$ W& Y - ]);
3 J6 J# n8 R( [; ?* f& j! q! m! u - echo '<pre>';
4 f4 {! }: J, l, A( J0 q - print_r($res);
复制代码 0 i7 F$ N0 b5 N8 `
三、数据修改
- //update()
/ w5 h# r& i7 `& r( f, @ - //参数1:更新条件,指定更新的目标对象。
& s9 i; z' ?( m7 E0 T+ b - //参数2:指定用于更新匹配记录的对象。
& `% s) k, I4 Q6 V8 b - //参数3:扩展选项组。
1 D9 Z" H0 S$ s4 [4 h2 o) S - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 F& H9 _" U3 t2 I0 k9 N0 l
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。9 g2 j4 _7 Y& l: W, e2 ^9 t/ S. c
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
* U- E" J7 `) U% e$ g - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- @6 Q! _( B6 C" m" }9 L1 K" L H
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。! }. o- n! n. k; L/ i. x6 @
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间8 s+ [/ p5 t) g2 @ Q& Y6 g3 n/ \
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
7 n' l/ @. P& ~4 r+ } - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
( g4 \- O1 _# D5 c1 m) V. H -
' T7 m) N9 P! n' h/ B$ p. _8 V - //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 `0 T7 {. ^8 ?. E1 E) T
- $mongo = new MongoClient('mongodb://localhost:27017');
. o9 l' o$ C$ b- B: m- e/ n" c - $db = $mongo->mf;: N; |6 p% b4 C; B- K) R y- p6 L
- $collection = $db->friend;
9 H/ A- ?3 a; l) o7 [ - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
; q$ u: d) U* r2 f9 m - echo '<pre>';6 l9 M$ s$ V, T7 J2 t
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
6 W; J) ~5 M2 j: M -
/ R; m8 g5 j6 V/ L- q! k) | - //$set:重置特定键的值,若字段不存在则新建字段并赋值
: Q$ n( K8 }% ~# A# G* }) |5 z - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
, V6 [7 M5 H& Y& C" ~: }! m7 K - - M8 p; {; P8 L/ l9 ^2 V
- //$unset:删除字段
7 e7 c h& t* N - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
$ o. V& e8 ~: i* h. L [ -
# Y7 T3 V1 j$ o6 F0 j - //$rename:重命名字段,若字段不存在则不进行任何操作
1 h, R4 k2 {) A7 {* R1 y" [2 } - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
% n/ c$ L g |$ \8 g0 U( p/ W - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。6 w5 q/ c" |7 t2 q
- 1 {" F* O( B, U% W( x6 ]% ?
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* y0 { \4 t( g5 j+ e6 C - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
' C0 M2 f: J5 Y. }6 P) B - . J7 f& G; t0 |' s. G
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
$ f1 p; z% m: | - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);: `% x' P+ R$ d
- . X7 `2 t- e( f: `, p1 ^# I
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错" O" y8 _$ A5 k! l. F* m1 w
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# p( O- H) B7 c: b6 w! E
-
) e4 }0 g: _3 m - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错( O0 h+ Z& e+ V7 ~, `( V8 f2 K3 z; W
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
( r/ ^' Q+ D7 M, T" ~. z( E -
5 s# {" D9 G9 i3 J( ]+ k, Y' f - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
, S2 r; w5 [$ w& J) B2 i - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);' i7 N+ z1 _& O4 I) o; I) `
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
- V1 l/ e2 a- s/ V3 o$ J4 G - ) @/ I7 H' y5 c8 H( H
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)% ^& i8 i' Z) O' u+ K9 W+ ]
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);, S! _: L0 Q, }: N
-
) ]: h; c. D) b5 @# p - //$pull:删除数组中所有指定值' ]) N& ?* a- j4 a$ V G7 P
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
8 |; X9 Q/ h6 F - 7 s, Y7 U( l" O8 R5 I2 {! L
- //$pullAll:删除数组中多个元素的所有值
$ W; ]/ X U" a1 j$ I) [+ J - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()$ o6 w) }; l8 i
- //参数1:希望保存的信息数组
6 e- ~' H8 m3 l9 d6 y - //参数2:扩展选项
8 O5 a" Z& L- |7 N8 i# _+ S - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 m) c% T6 I$ h T G: g
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
7 R' J& c/ Q4 b - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 W" |+ Y. z4 W; ]* @) {$ x
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
5 a: o0 |( U& F# d+ y - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)4 ?% M0 f, d9 L9 q
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。2 h! V" j$ [ ?7 I2 a
- //若想更新则应该在参数1中指定_id键的值。$ V1 p" C( x6 z2 b3 R6 a7 L
- $mongo = new MongoClient('mongodb://localhost:27017');+ r; ]1 ~4 d5 ^- t6 D# t
- $db = $mongo->mf;$ V. s* e9 U# n5 d7 Q8 R# u% W
- $collection = $db->friend;
m+ o* T5 S$ F& \1 O - $doc = [//定义一个文档,即一个数组
) y+ o$ }3 m3 q5 J/ e - 'First Name' => 'Jet',2 _# ?; }, ?5 X- o$ I& ~9 N. U
- 'Last Name' => 'Wu',
0 A. t. R9 n8 \ - 'Age' => 26,7 J$ d' q! Q- ]4 ~3 ~3 X
- 'Phone' => '110',
5 B, z* G6 E8 n3 g - 'Address' => [
- |5 U( o* g. e K, o6 q; m - 'Country' => 'China',4 X7 X% P4 l1 z# }( J4 D. A
- 'City' => 'Shen Zhen'5 h, A, w) I. g; k2 T
- ],
5 m+ [( j& Q7 F. L - 'E-Mail' => [
& V) Z# d3 |: n - '123456@qq.com'," d [$ v8 M: S7 V& a- F
- '666666@sina.com',+ U% p: @4 R: Q+ E' F1 x! S" w+ {+ A, y
- '8888888@qq.com',
4 m. r& ^ g. i; q5 ?- X. F m: b - '77887788@qq.com'
- ^7 w) O: D, T B g" y - ]; r. u7 C; ^; I# M$ O0 \4 g
- ];
# S! U4 }* a" r- q* X - $res = $collection->save($doc);
" o6 [/ t, Q: q - echo '<pre>';2 e8 `6 {- X8 W. U9 f; ~; w
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入6 a! f' f2 x+ M
- / s1 X9 z# P, X8 X c: C& S
复制代码- //findAndModify()3 k7 E: w& ]4 h% [$ P/ K8 a
- //参数1:指定查询条件- L7 m+ j6 k$ k# V7 ?6 l) \
- //参数2:指定用于更新文档的信息
% y0 W0 ?% n- [& G - //参数3:可选,指定希望返回的字段* G2 Y D( u2 h+ {# Y
- //参数4:扩展选项
$ Y- p% P& X6 B$ T- I - // sort:以特定顺序对匹配文档进行排序
% \6 b. i. a" E0 e8 e$ l2 d' f9 x - // remove:若设置为true,第一个匹配文档将被删除0 J; ~) s/ Q1 n# ~
- // update:若设置为true,将在被选择的文档上执行更新操作
) q; D) g; }* D0 {2 c! l) z - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
: n" P: h# q C) F2 U2 E/ x - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档7 c ^4 I) F. `2 f: b7 P
- $mongo = new MongoClient('mongodb://localhost:27017');& u% }0 x6 p2 X* e7 Q8 L; |
- $db = $mongo->mf;
+ l) Y: J5 o }& [2 N8 F, u) P( ] - $collection = $db->friend;) g* p* L/ H( n& t
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
1 z4 J5 T; w3 I! [1 h - echo '<pre>';+ a# i: K' ^" Z% b) D2 Y; ^+ L. ^
- print_r($res);
复制代码
四、数据删除
- //remove()- `/ S7 [' {+ D2 y8 k' k
- //参数1:查询条件
# \6 v6 a8 {6 a; B/ n$ t - //参数2:扩展选项4 o1 P/ w8 ^6 b% @* Z4 ^/ r
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
9 F6 K1 N3 i; V0 `1 G: Y. Y - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
$ ^) t& l2 L: R1 _$ h3 s4 Q - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作, n6 [0 R: p: @" X9 W2 ]
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。* V2 X' d& k0 i5 ?3 R a3 @* r
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& j) c. W6 n& j7 k1 A! z0 P% R) A1 k
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
: p- S# s2 }; N& L, x4 h3 i& @ - $mongo = new MongoClient('mongodb://localhost:27017');
$ ]# X8 A& V6 q' _# ~* m - $db = $mongo->mf; B0 S' y& d+ X: |' O
- $collection = $db->friend;
& f, q$ o1 V: J2 N4 i7 q - $res = $collection->remove(['First Name' => 'jet']);/ { S* t7 R1 e! D0 K
- echo '<pre>';' v5 Y5 I; H! S" J
- print_r($res);//$res['n']表示删除了几个文档
复制代码 3 c; t! }1 }( ^
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
' e; y# X: f/ N4 H8 f7 I
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
; P0 n3 \8 \( \" y2 K
数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
6 X# z. V. y* F, {& N+ c - $bulk = new MongoDB\Driver\BulkWrite;
+ U4 y# p1 r% Y$ b* v - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
" S* a: X& \5 V; K$ m& | - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);; s/ d* y8 k9 R" `0 }* V- f
-
& G! ]3 F) v( R: X' G$ e; A3 @( X - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ p( i! }. `, C! F" ]* k1 D2 L5 V
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);: [2 [: s( d2 a% N# r! Y& T1 J5 f' ?
- echo '<pre>';
0 H. X3 h# N- V- X" M* h - print_r($res);
复制代码
* Q6 S# \# k1 }5 u! c# u; C/ i) [: H+ ?数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
" l6 d- c' b9 ~1 W3 I - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);' N: {$ X. C/ B3 U2 `
- $cursor = $manager->executeQuery('wjt.friend', $query);; V5 A$ i& N; Y: V1 ]2 D2 d4 ~7 j
- - y* g" ~, h+ V6 a' c( |
- $data = [];
3 `; J' C& F: D2 o( O0 k - foreach($cursor as $doc) {4 O* \+ J1 q' g4 p/ P2 \* u
- $data[] = $doc;
' e" D S( n" g( ]2 V - }3 o0 y* U% o5 t% q3 m- m
- echo '<pre>';
; F1 J# e. j% ?4 s - print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
/ H# M" k) p' t x - $bulk = new MongoDB\Driver\BulkWrite;! t. e) k/ l! K
- $bulk->update(
- n$ @0 o/ f0 {; v5 T9 }" p - ['name' => 'JetWu5'],
0 f8 q4 J: \' C" \: i- i - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
0 X: y* T6 T8 Q, `1 K5 t9 d - );
/ W; p: h* b) S - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
2 C; M8 n2 B6 m0 a8 a2 n& W( n3 n - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 w- H8 w e% p( _
- echo '<pre>';! J$ m7 l# g* g6 U. c
- print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
! K6 `# e8 ^0 P1 M, {. P6 o$ e - $bulk = new MongoDB\Driver\BulkWrite;9 [. Y' x9 ]* M3 X' T; V5 ]
- $bulk->delete(['name' => 'JetWu3']);* J) Y7 F7 y2 ~3 U; X- Y8 U: l
- $bulk->delete(['name' => 'JetWu4']);
& c- U1 ^# Z% I* K% v( e - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 @$ c X( v$ V. n- e
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# q( Q% z" G, l# Q
- echo '<pre>';
6 g- p: l! ^/ N. T, C: X \( S6 A - print_r($res);
复制代码
% x) G' `) u3 ^0 N: o- F, i+ L0 A# e, s! o; ]$ H
( H N9 F( G7 {) l! m- i! a
4 o" ?; h; a { x( h
6 O a, |( d) P& M( y
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |