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()
, o* x o5 p) t; u5 H# X! W - //参数1:一个数组或对象
4 `. ~. Z! q$ l9 z8 ~* S) q - //参数2:扩展选项
6 ~8 m H: M! m7 e$ }' h - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘( k% I1 \) h+ j' G
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志. O) T# O) _$ q
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认+ {# c1 K4 d( ?. T$ g: b" ?
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间! i g3 ?8 J5 w: @
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒); J8 t, e- |- S
- $mongo = new MongoClient('mongodb://localhost:27017');8 _0 {8 e: c5 k0 F
- $db = $mongo->mf;//选择数据库
% f/ A; Z) Z$ R/ G8 } - $collection = $db->friend;//选择文档集合
1 c% f! u9 f- c6 q4 o+ B - $doc = [//定义一个文档,即一个数组& R, u0 [1 s7 P3 ?' D
- 'First Name' => 'Jet',/ R& |, Q5 i3 \! C8 z
- 'Last Name' => 'Wu',4 C4 j& s6 V( O& T) Y+ I8 u) I
- 'Age' => 26,
{$ }$ o: H& C - 'Phone' => '110',
' m; e# i* W, o9 [( e( ] - 'Address' => [, J8 W8 o) D0 E/ c
- 'Country' => 'China',
2 L1 Q4 `5 s2 @) Z9 s$ P - 'City' => 'Shen Zhen'4 D2 Y2 j# R- Q: W% i
- ],
: @* T3 L; J+ T4 } - 'E-Mail' => [5 f: O1 G8 Q j. b' z
- '123456@qq.com',& n/ \5 A! p. u
- '666666@sina.com',
3 u6 K' D0 [' u" H) [0 X) { - '8888888@qq.com',
' n: \' ~& @! I3 b8 P P - '77887788@qq.com'! R3 A( N% z6 U9 e8 L6 |3 ~7 j" j. n) T
- ]1 E; {2 P. l8 v0 R# B* w9 v' e
- ];! L' ]. e$ ]6 {; I. {" e& j
- $res = $collection->insert($doc);//向集合中插入一个文档& g5 H* I) }3 o% o% S- ]3 X
- echo '<pre>';0 g! c) k9 l; o! J6 I
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne()$ K2 Q; H% _, ]0 D
- //参数1:搜索条件
. ?1 f9 Q. F3 Q- s1 W - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段% `5 w- v' N2 c$ j
- $mongo = new MongoClient('mongodb://localhost:27017');( y8 S0 v0 p' j2 }, R3 b, w: u9 N
- $db = $mongo->mf;( u: w# k$ g0 n
- $collection = $db->friend;
1 R5 |/ D0 r7 f. r5 E8 l - $one = $collection->findOne(['First Name' => 'Jet']);
$ t" T. y- r! u* Y - echo '<pre>';
. T1 v6 u+ N, d" m7 t - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()
2 t! P- p8 f4 _; O T1 P - //参数1:搜索条件6 k" v1 c7 }" j3 e+ L
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
+ M$ s9 y; |: r( M4 J - $mongo = new MongoClient('mongodb://localhost:27017');% W7 T# N; d' w% \" F) A$ P$ K
- $db = $mongo->mf;2 m1 ]7 B! Q( r0 d* c
- $collection = $db->friend;
8 B" F+ d/ e8 B8 n3 ? - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
; C/ a* Q2 f9 ]' [ - echo '<pre>';
' P4 K5 L% Y+ j! ?! o4 [ - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
+ t+ m: U3 T% _6 _) r( A7 f% S, Y2 } - print_r($doc);
( J) T; J- z2 O' d - }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
: P7 [6 }0 [+ m9 s2 T - $mongo = new MongoClient('mongodb://localhost:27017');) c9 Y& ]& y& e% D+ {: g
- $db = $mongo->mf;
+ G. ~9 D% S5 k9 z% e6 a1 Q7 t - $collection = $db->friend;
" M! _8 c! l7 |4 H - $cursor = $collection->find(['Age' => ['$gt' => 30]]);4 h4 H6 Z4 l$ @: i: k8 [
- echo '<pre>';1 \' ?' h! [8 f, W' N# ]
- while($doc = $cursor->getNext()) {6 r6 ?6 ?/ g& d' f- s
- print_r($doc);
* u8 @( A" r6 ~ - }
复制代码 //查询某个字段的所有不重复的值
# ?. {- M! H0 ^% {' g9 Y5 J $res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个( B! ~& l3 k' f' K- ^, Z6 U
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);- T& a" N# m. W3 \0 H0 M* V
- : Z" o# K7 f6 I
- //$all:匹配多个值中所有值(用于数组字段查询)
. e6 G% d7 T" n) O D( p - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);- {) M/ A+ z4 v; r$ k4 }0 L
- % e- F% o, a6 x" L6 N/ u
- //$or:或查询/ {% D. M% j$ z- N
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
" f7 E/ p v V6 M& t2 [* p - . g; M' K# @" w9 C+ C
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中+ L! W& k$ X- Y( q! O
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- [3 P- E. A) d8 m; E+ L$ `
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
* W( n& a; V4 R4 O; _2 m - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
! g3 }4 R* I+ i& {/ X - 6 E; r1 }9 d7 O0 ]4 M
- //$exists:根据某个字段是否有设置值进行查询
6 b- y, @7 E+ ]& g- C - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
& j/ ^9 O! R% w4 F - F% b+ {( ]; w! O% M/ \# ~- u
- //正则表达式查询
5 [7 x: B/ I/ @% I7 x: R- U5 _ - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序
6 v. C4 j/ R2 n0 K7 i - $cursor->sort(['Age' => 1]);
1 d8 Z8 t/ c. } r- z! I -
; d$ o' D' L; q/ e! ` - //忽略前n个匹配的文档, N" H4 h% [2 _+ p
- $cursor->skip(1);) f( B8 ?0 a4 X& X/ K; Q/ O
-
1 j8 H) A) o( S9 N# \ - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 h/ c4 `% {/ y
- $cursor->limit(1);
- S V, B2 n/ `7 |( G+ d -
8 w0 k7 e( a3 L3 K9 i8 X( Z - //匹配文档的总数8 p, v$ V1 [8 j
- $cursor->count();
! J1 I7 v) O% I$ X+ \" u$ p, Y - & }# u0 y9 D; ]/ R$ p: \' Y
- //指定查询索引' |+ f" M" F. `& r$ D i4 f
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计. q* I/ m' ^ y6 I6 v0 a9 C8 q
- $mongo = new MongoClient('mongodb://localhost:27017');% [1 X, }; V9 U! a0 E+ u
- $db = $mongo->mf;9 V) f# a/ C# ?% X
- $collection = $db->friend;
7 P" r, X6 e% X% N - $res = $collection->aggregate([
' d( M2 x& }3 M- `) }8 z - '$group' => [
9 q4 F9 j: e0 i - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
( B% C6 B( M( a+ j9 R - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
" A8 L: W7 U0 L - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
, W) [9 p2 d8 U: I9 B+ I& Y - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
- Q9 E$ Q% |8 _# Q4 y8 }" ^ - ]: j- b& v+ q& t0 A
- ]);1 u9 t2 x2 n2 k
- echo '<pre>';
( G% |3 r, o; N" V - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果5 E% m' @8 |0 @
-
$ {2 }& a+ S2 _: i' p" E7 ? -
& p& g1 `4 d, j7 G! }- u) Y - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序; f, A6 d b) O+ u
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
* |, R+ Y6 e- v. l1 Z1 X- ?9 F4 y - $mongo = new MongoClient('mongodb://localhost:27017');3 H% N& f# j4 b* T% K9 B; j
- $db = $mongo->mf;3 M7 g4 w, v. x+ ^
- $collection = $db->friend;
7 g2 e7 G6 X' R, s4 o, F6 j - $res = $collection->aggregate([% [8 p( o. n0 P4 h4 `, b
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档2 i0 {, o ]6 p5 k+ T; e7 \
- '$match' => ['Age' => ['$gt' => 30]]
! i' p( T/ c3 R$ W- j8 V - ],& y$ e+ Q& O% n) G2 V3 L
- [//指定分组字段、统计字段
' m. h/ H5 n5 h: A( \) J5 D- ^' [ - '$group' => [
* X6 n6 b6 f" y/ p; e3 E3 a% S% \ - '_id' => '$Address.Country',
' Z" m P& n, H8 G - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和) v; N0 ~$ j, s
- ]
( m$ J# H% q7 [3 ~+ _" Q - ],
; N. e& f8 L% R- k) ^0 P0 V - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
( F# e) B' v% A1 a( ^6 L+ Y7 Z: ` - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。4 L) n3 C6 W* i' y4 {
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名) z5 S+ t, k: a" ]7 o4 C
- ['$skip' => 2],//跳过指定数量的文档
) @& U o4 X; d# j, s - ['$limit' => 2],//只返回指定数量的文档$ F# @/ Y7 j" ?1 z v8 R
- ['$sort' => ['totalAge' => 1]]//排序* X) M6 t4 L9 O. x% m) u
- ]);
. X B, m3 V: B - echo '<pre>';- {" v* q/ Y& j5 p
- print_r($res);
复制代码
! @4 K" s& z; c7 ^( J/ Q5 |; l7 L三、数据修改
- //update()
" l4 Y' d: z. Q/ G) F - //参数1:更新条件,指定更新的目标对象。6 T/ U1 q+ P. K3 R7 p& v" ^2 J6 w
- //参数2:指定用于更新匹配记录的对象。
/ _1 w7 p3 D2 i$ { - //参数3:扩展选项组。/ [8 n0 [3 }/ @9 @5 ]; o
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
1 B8 |+ |4 u" U# h' I - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
6 I! K) c3 s8 O - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 ?/ C- L6 b5 i# [1 `7 \" `
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
' W$ t3 W8 c8 b4 K - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- f" w) _( i% X7 S [8 x
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; A0 B6 ]" |; {/ d8 H9 z2 V: S
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
8 {. U8 H) [% \6 j; r$ a4 I - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
4 c7 m+ f' j; |1 i5 x5 D - % a9 W8 }$ L% r0 z, A. G( B0 {, i: X
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值( _) f/ D3 S' L9 _
- $mongo = new MongoClient('mongodb://localhost:27017');
3 D g, t r2 A& o* P+ K# V& G - $db = $mongo->mf;
4 i1 c. Z- I( l* I - $collection = $db->friend;/ z/ a. f& x+ j; c6 w
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);7 ~, T, V' K% Z) P4 F2 r4 X
- echo '<pre>';
4 {. X9 G1 }* x% S# t& e+ F* f - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量5 X6 t- N( S' H- r
- " b+ F( u( r. m6 o) O" z
- //$set:重置特定键的值,若字段不存在则新建字段并赋值) k- z0 W' M0 `5 i
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);2 e8 {: ]& G+ R( n3 f8 \* }
-
" N9 x: O8 ^9 f) {! S$ d# P- j - //$unset:删除字段
# B7 I8 {( J, s& J: J6 O4 S) Y2 A - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
$ |( d+ G9 y2 k- S! d - : ^* D. |1 l5 z( F* h- w
- //$rename:重命名字段,若字段不存在则不进行任何操作+ X- { J* c* u# J6 l5 `1 U
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);, V3 b8 p$ `7 _- d5 X) h+ P! D
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
) v& f. E w5 s; h- N: q8 @ -
4 q. x9 ?. h3 B+ J- Z8 m1 N l - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
0 P0 @* r' P9 D - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
6 e3 F e+ f- A - . G( a! ~: m1 [. U
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: J# E- n# F; l. R! |
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
- F& N, s& `' x. E" j. F9 W - 6 M% }- q% Y8 }# v0 @7 Z7 v3 h
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错- N E- k `# ]8 } y [
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);: p$ f; G8 y6 N4 h7 i. r
-
9 k! T' @/ @$ K5 |) k$ K$ J8 u - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错3 {' u/ P) a: R0 h9 h
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);+ N7 V2 ]$ \% ^* o
- 3 R! k! Q* Z e) X% Y
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)' Q4 j) h' z7 d- O, F
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
9 E8 Y; @5 O4 k8 U - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);6 J( p2 T- P8 r# ~5 w5 J' `1 |# S
- & d" M& `( n9 `/ q k1 V0 {
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
( H' n$ S- d6 K" C f, R0 j8 h - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
( h1 Z+ n8 U# ]4 c! e2 s - , y/ Z/ ~4 H# x0 D% K" n1 ^, C* E
- //$pull:删除数组中所有指定值
# r, k+ A5 M. C2 r0 O' k7 ? - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
T- o: y, b- E9 F - $ A3 j- y) h$ `/ T2 y$ n
- //$pullAll:删除数组中多个元素的所有值6 n# @5 N6 o/ n' Z1 D: A
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
5 S# ~; T: o! a# K - //参数1:希望保存的信息数组1 H& o9 w; W, D8 I! |) n
- //参数2:扩展选项
; S7 t1 }. ~+ z$ K - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
! e; ]! ?" e- z+ s- x2 ?& J! H8 C - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
+ S, l' k+ G' ~ N6 o: R - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。5 P! L: b! N- i! [2 C
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
, p2 o6 A! h ~( ]1 S- P7 X - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)7 k: @5 w* _0 `
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
1 t# M2 V/ A0 c& P V& d - //若想更新则应该在参数1中指定_id键的值。2 P' s6 V" @8 X/ M; q+ o% J
- $mongo = new MongoClient('mongodb://localhost:27017');
6 s" M" Y" v- q" A0 N - $db = $mongo->mf;
0 f9 Q5 v! w; |- Y) | - $collection = $db->friend;
8 x% K( p0 o8 Z# U& Y. p - $doc = [//定义一个文档,即一个数组
; J/ U: ~6 Z' R O* A& { - 'First Name' => 'Jet',- D# T4 j$ J3 r8 u3 E
- 'Last Name' => 'Wu',
8 K: \4 F$ C7 X( I' C0 x; w - 'Age' => 26,
/ \* p! {% c% s) _. u - 'Phone' => '110',
y6 C5 o [! m& Z- s( ]: p0 k - 'Address' => [* r; l3 M+ d" [8 |& r; v7 ^
- 'Country' => 'China',9 m4 h; Y) `0 `* O3 z, X
- 'City' => 'Shen Zhen'
( f, ]0 o9 L8 h9 A4 ` - ],4 O% L$ {- b8 ]/ ^ T: f8 c- K
- 'E-Mail' => [
T" M' Z2 n- j; y" ] - '123456@qq.com',) `+ L9 }9 `$ |& h1 e
- '666666@sina.com',& q, R& h) S3 i* V% N
- '8888888@qq.com',
1 `% O/ [! D& ? v) j$ ]* x0 P" s - '77887788@qq.com'' j3 }+ E1 B+ p' ?1 e1 S
- ]
4 G* z$ s3 a0 h - ];8 _3 H4 M# G d' P' d0 a1 r
- $res = $collection->save($doc);. {' m6 e( a. T' Z
- echo '<pre>';+ B& |: ?) x$ w* ^* O b
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入$ L. N @3 ^; I& ~% j b% ^
5 x& S4 H' l* p" j
复制代码- //findAndModify()! Z# v2 M5 W; m; g$ }, X* j
- //参数1:指定查询条件
+ h! z/ l+ `' g+ ^0 |* | - //参数2:指定用于更新文档的信息
/ V' d5 H5 V$ f7 _2 B - //参数3:可选,指定希望返回的字段
+ @ y M N9 V; }4 \2 n - //参数4:扩展选项
% F3 a+ Z" T1 s- r" Z& m - // sort:以特定顺序对匹配文档进行排序
S0 }( X; L0 T3 m( I- N - // remove:若设置为true,第一个匹配文档将被删除* _, u$ ] M- e: E' a" ?
- // update:若设置为true,将在被选择的文档上执行更新操作
; v- K5 D/ c! _% N! d9 v( c - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档7 L9 ? P0 C1 Q4 j& D6 Q
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档. p0 m, b1 u; l) g; U1 c( Q
- $mongo = new MongoClient('mongodb://localhost:27017');
/ j( \* Y' H2 u2 Z) K* g - $db = $mongo->mf;3 \' q w" l5 b \7 w$ Q5 V
- $collection = $db->friend;6 I0 K; j) M+ R' s( \* [
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);" Q0 N" \. ~/ r+ m* y9 i. _
- echo '<pre>';- x9 o# j' J5 t
- print_r($res);
复制代码
四、数据删除
- //remove()* y# r2 A. z3 i9 Y6 f& `: v
- //参数1:查询条件
- K1 p" R6 I% L F - //参数2:扩展选项
" Z6 _) ?, N+ a) }0 C - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
( z& F$ N5 y0 C7 ]4 t( c$ M - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。8 _! x2 d5 ^' j7 m+ j8 R3 W
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作) n! t6 l9 Q! ?: Z# F
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
; u1 s; h8 g7 b6 `8 B- n; n( i - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' H# y) x# d% {, e- c" @9 y3 ]
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)9 E1 \* R& \. s% {/ A, l9 v
- $mongo = new MongoClient('mongodb://localhost:27017');+ r( Z5 U% ^- Q" Y/ P9 P2 |
- $db = $mongo->mf;& X/ T! R* T& {: r$ D. B
- $collection = $db->friend;* n( u3 c4 c( V* [' z
- $res = $collection->remove(['First Name' => 'jet']);) ]# G& u7 X! O) N8 [( q; U1 F
- echo '<pre>';
4 T! R% ~3 S9 D4 p# H - print_r($res);//$res['n']表示删除了几个文档
复制代码
; c/ k$ I( W+ Q) T8 ^% r以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
6 n7 s; ~$ ^3 B! Q4 Q
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
; a0 |3 l2 T% \1 T& M7 j Q数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 b' T; N0 d. L p5 F
- $bulk = new MongoDB\Driver\BulkWrite;0 ]2 X- U1 w; v; X4 h- @6 s4 a
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);6 o7 `+ m/ k* m f+ r
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
2 X1 r0 H" o# ?( z; s; l, ] - - L0 ~9 X5 Y( f3 T% m
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* T* U- h4 T% C; p U- q
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ o" h6 ]8 d) c' P0 b
- echo '<pre>';
! c! e8 ]% \& o4 K% x$ w+ }9 X- I; \ - print_r($res);
复制代码 ) n$ L8 @$ E- N$ Y! q+ q
数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" m# w0 j( o6 ^( U0 c% I
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
6 | e; H$ P4 s. H8 J1 c - $cursor = $manager->executeQuery('wjt.friend', $query);
7 n" T4 m. }& g u/ g% o! \, ^' e - " V2 `7 V3 r: ~0 I% v7 S
- $data = []; j; ~( G- y% `" `1 g
- foreach($cursor as $doc) {3 N% J. V4 A. s9 s: N: ]2 `$ O
- $data[] = $doc;5 B8 }7 W4 A2 n* q, A6 v
- }7 f, L$ y) M: |; l2 ~
- echo '<pre>';' ~2 g. s/ ^4 W& _3 o" k, X l
- print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
8 K! S0 [6 y; @ ~0 ^* c - $bulk = new MongoDB\Driver\BulkWrite;: }6 s( N' U. Q% v
- $bulk->update(* A: Y$ [ {' R P+ b1 p& q- @
- ['name' => 'JetWu5'],9 D1 P1 }$ W# {* m0 a3 h: Q- B9 D
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
% U7 H9 W3 J/ O - );2 o6 ]) Z( o: a' ^( g# D
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 k c2 ?* F( U6 G
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
4 H" o7 M4 Y1 x2 q( l$ K - echo '<pre>';& a) n5 n. u! I; p5 s7 z
- print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017'); z8 Z( T4 @: B. h; I
- $bulk = new MongoDB\Driver\BulkWrite;3 a ~& r( o. s% L% d: x
- $bulk->delete(['name' => 'JetWu3']);+ L: L- f D e, w t" U$ c
- $bulk->delete(['name' => 'JetWu4']);
. W3 d2 T; Q8 c6 i - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
, S1 z& P7 p8 M \, {% H - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% K8 X6 b* ~8 @
- echo '<pre>';
4 i$ y) V1 n* J' y& X - print_r($res);
复制代码
; G3 v V/ w3 _
% r* d0 c. ^7 s) \
1 M9 p% {# t9 {% ]
( \8 y5 b |& @. o! w
1 o. p0 k! C( o
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |