|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert(); c, j* }5 T8 g8 ]$ d2 F
- //参数1:一个数组或对象( Z+ |3 C) i& Z4 R- F0 ?) o6 |# `; Z
- //参数2:扩展选项
! Z0 _8 Q9 M. d6 |% V q, ? - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
3 i' m" L: K0 B1 ? - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志/ t9 j) X# O' R$ C! {( W% Y
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认 E( |% D G- B. Z0 x6 S. C1 Z
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
3 n) ~3 t3 U& y ]: p$ _$ _) e" ?4 l - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
( H2 U# R5 [$ v9 J7 G) w; |6 J% ?7 } - $mongo = new MongoClient('mongodb://localhost:27017');, ~' c2 B- ?* G9 @8 n
- $db = $mongo->mf;//选择数据库
$ X2 ~* O% t0 E# H2 V+ Y - $collection = $db->friend;//选择文档集合
+ Z8 X1 w7 ]1 Q+ ~6 K- {. b - $doc = [//定义一个文档,即一个数组
2 D/ f' `' z5 q- y1 V# D - 'First Name' => 'Jet',
7 a/ ]. Z- t3 C5 d; O2 O# J - 'Last Name' => 'Wu',
0 ]5 G, P) F- |$ ]: c2 [% d; E - 'Age' => 26,
/ w, u1 I3 w! D* D8 {$ y' H+ O - 'Phone' => '110',
# a4 n& P* k; C1 i - 'Address' => [
. l; Z' p, t& J7 p( H$ `8 q - 'Country' => 'China',
8 G+ u1 B" t7 V - 'City' => 'Shen Zhen'
}7 g$ A: K: B0 A% T" p- } - ],* @2 U( V" x+ c& {
- 'E-Mail' => [
% J4 n# } i3 w0 W" j e - '123456@qq.com',3 s o% \! y5 s. h$ ?
- '666666@sina.com',$ Q$ Y% S, v; k, M) X( n& T" v
- '8888888@qq.com',
; S6 o. `( R- Q$ }, |! D9 Y0 k - '77887788@qq.com'6 t; y1 }, z( a+ c! L3 c
- ]
( U* C2 j, j/ t - ];
. O' j u( I% M) v) y - $res = $collection->insert($doc);//向集合中插入一个文档
8 a- M: E- O! t0 ? - echo '<pre>';2 x3 V o$ e& Y5 @6 w
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
9 D& y' L6 k# s; R+ g# E - //参数1:搜索条件
1 } _# `% l. S; h8 Y - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
0 P- C% H! d; Q - $mongo = new MongoClient('mongodb://localhost:27017');
: g+ @, X- w4 t; s0 Q/ y7 \ - $db = $mongo->mf;1 x+ g, q) ~! a1 k6 X* F! N
- $collection = $db->friend;% g" O9 u' ]$ E3 K# b
- $one = $collection->findOne(['First Name' => 'Jet']);0 {6 K" b( w+ A
- echo '<pre>';! n) W* k; q- n4 h& A
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
; l( v4 g) _: ]0 E4 K. d% f - //参数1:搜索条件& o& E" s; H; J" j }
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
$ N M. N; q6 D/ `/ M& p \7 w2 O - $mongo = new MongoClient('mongodb://localhost:27017');: Y# k" h/ D. e+ m4 Q
- $db = $mongo->mf;2 q0 t4 i, ^8 o# g$ w
- $collection = $db->friend;
' f- `- z0 ]! t6 F) _ - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
7 s( r" F" w5 _4 x5 k - echo '<pre>';" w1 v# e. E V$ O. ~* D8 f4 j
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
1 v8 c8 V% g9 f" W+ O - print_r($doc);
* E* L* ]) J' ?: K- h$ U$ T, a - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
/ } P4 Y6 k* g0 [ - $mongo = new MongoClient('mongodb://localhost:27017');
/ s% c O9 j! E; E+ D# r2 h0 M - $db = $mongo->mf;1 a& k, q. S2 E2 a: Q6 h& S, w
- $collection = $db->friend;
& C) N/ k, B; E+ J - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
6 m. f6 d! P" \! f' o - echo '<pre>';+ ~7 L1 c9 L% g
- while($doc = $cursor->getNext()) {6 y; w @/ m6 r3 g. ]
- print_r($doc);
+ f1 X0 l @5 v x5 F - }
复制代码 //查询某个字段的所有不重复的值
# l( V6 j# ?9 _! ?# o $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
9 y1 ~# C: j5 o1 X A - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
" N/ i* o# W! y, H9 B6 V) Z- j/ _ -
8 a# e u0 }& W) w" T8 D" E' E - //$all:匹配多个值中所有值(用于数组字段查询). Q# x4 M, S i7 p' K
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
* P/ f, ?9 ^$ p; @ -
% y/ O7 w" A y X- A5 J" S1 b - //$or:或查询, G0 O6 g# t; [' R$ L d2 f2 ~9 Q
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
& w, m( ^7 c3 h* k1 N - % m5 ]) F7 U3 K' S0 v0 \, L( s
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* W: Q/ y& V/ l
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email3 t/ w% [& C: c2 |, X2 `
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email3 n3 [& z4 y: b
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个" Q# q9 `2 G) F$ O" y- O9 T* F
-
" Z) D% ]4 f8 ]0 Z3 k: R. i - //$exists:根据某个字段是否有设置值进行查询
; i& j4 u3 b9 A, Q, v) h5 S# Y0 v [3 i - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档4 W; ?% `+ u3 Z H+ O3 ?
- + s% [% ?/ u# l
- //正则表达式查询0 B; M& c$ G) ?% } \9 K& ?% ^
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序+ I. I0 T. Q; S# y7 ^' j: a- I
- $cursor->sort(['Age' => 1]);
0 z4 |% e! }5 S$ y - 5 N' }% i' m8 x) T7 f/ o( {
- //忽略前n个匹配的文档. t5 c) ^1 u+ d8 l3 X7 |. {3 Z
- $cursor->skip(1);
9 }' v1 u( \ l$ S' M3 ] -
a4 `1 ^# {2 r2 t: m; y - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 ~$ [- e# i+ C( k. q& Y9 U% W
- $cursor->limit(1);: u. N C: @6 U/ x- d0 @
- ) s+ i. {: s* e! \! ~ j' _
- //匹配文档的总数5 z# N2 `9 I: Q6 m
- $cursor->count();
4 U: G% S. Y3 O4 \ - $ `8 K, L6 d8 w4 }. G) n
- //指定查询索引. S. Y1 O9 c' E- L' {
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计: l* i. @+ P% ]) k( s# S3 b6 C* H
- $mongo = new MongoClient('mongodb://localhost:27017');* V$ m M8 u9 }' o# D
- $db = $mongo->mf;/ y& k% T- ~( Y" [
- $collection = $db->friend;* T/ C# O4 M% w- I6 s+ b7 v
- $res = $collection->aggregate([8 g8 B; b( |- `2 o) A1 J8 s! I
- '$group' => [
6 N( }- Z3 y: i o r - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组( z3 \7 T. `( _! H
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
7 u+ e6 t( E t: L. g; @ - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
4 u# D# C" g, ]' n - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
u, ~( { c3 U: ?2 E7 \: D | - ]+ q* c% b5 S5 a
- ]);8 m# u, ]; W, B& i% V
- echo '<pre>';
, n) K% F9 E$ h4 y; U7 H - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
0 I. o. f8 d( k% w. L -
/ x! N3 `5 `% r: I -
! a- t; X/ _- B: {2 O1 ` V& J8 W) Y) _6 A - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序/ L# p/ [% ~* z2 i
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
$ i) f. J" W( E* K - $mongo = new MongoClient('mongodb://localhost:27017');* H! B5 Q4 Y5 [' t+ Z
- $db = $mongo->mf;
1 q+ D! X/ _2 q5 n* D4 X$ k - $collection = $db->friend;
8 x. d3 Y1 V4 E* {5 `" c - $res = $collection->aggregate([1 a$ q( z4 E! z/ T, l9 ]1 Q: ~
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档, M0 m$ W6 F% w7 q7 y+ g* @
- '$match' => ['Age' => ['$gt' => 30]]- C$ ~) p" R9 w/ g& I( R
- ],. q0 d, T. F. W& _
- [//指定分组字段、统计字段! n, h: m8 N6 C$ B' Z, I) {: y
- '$group' => [
R+ A. t6 {" q - '_id' => '$Address.Country',3 ]; n& J0 J v8 q
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和3 w! a' V) q- a! v0 P
- ]
: m1 R5 q% R7 N4 Y9 ` - ],
) a# V+ {1 g% x& A0 O- k - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档6 x1 C6 x8 i0 x
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。+ q2 a. z: z) ]9 \; v' j2 s/ t
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名$ _5 D; q% `, ?& _3 J- B' Z0 }* H
- ['$skip' => 2],//跳过指定数量的文档
6 K: U) H- z; p2 k4 m R - ['$limit' => 2],//只返回指定数量的文档 w `/ t& J, Y
- ['$sort' => ['totalAge' => 1]]//排序, \3 g4 ?+ O; _- i7 @
- ]);
5 H5 L) j$ E/ h# x5 A3 ~, M - echo '<pre>';
/ z4 j0 Q8 g* l% G' t - print_r($res);
复制代码
, o0 s' p4 D+ M ] h' B1 g, P+ M三、数据修改 - //update()
/ U& y) ]1 u0 e& q" B8 B - //参数1:更新条件,指定更新的目标对象。% q+ [% q( M4 Z# }' `- S9 P
- //参数2:指定用于更新匹配记录的对象。. U+ l" Q- Y3 [3 d2 [/ H5 |
- //参数3:扩展选项组。
" r2 b4 k: \5 g - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 M0 ?* C9 O2 R2 f6 q
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。* U4 r$ [* e6 D; d# w
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
5 Y* k( j) C, {6 d5 H+ w- K* p6 F5 D - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作" H6 I+ |( S* O/ _
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。4 `# l+ y1 X+ b5 p) i* P
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间 v" _1 @% o9 {; ^$ {8 E
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒), r A9 ]( W( g4 d0 q+ _
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。% u% ^' z3 }( ^
- 1 I/ {" t0 i6 _6 d$ h! L; n2 h# L
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
* o& }6 e( W( u - $mongo = new MongoClient('mongodb://localhost:27017');, x I* A6 X: Z
- $db = $mongo->mf;# |1 J+ ~3 Z- y( d5 v1 I
- $collection = $db->friend;
# H7 Q$ M$ @2 p4 ?9 ?7 w% k' y - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);. @+ k+ `6 F9 \1 G9 _' [3 r
- echo '<pre>';
7 k. M/ p7 R# ?, ]- Z. [$ t - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
4 j" `# C( ]3 |( B8 p; b$ N* l - 0 ?2 c C5 Y7 Z
- //$set:重置特定键的值,若字段不存在则新建字段并赋值: v4 S, n" K |; e! Q6 N1 S
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
" r# k9 X1 a" L -
) r: {- u6 C, q - //$unset:删除字段/ f7 [9 \ n$ Y3 V) B
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);2 s+ P. \8 c# F& D1 k
- & C5 A2 S7 {+ }. M
- //$rename:重命名字段,若字段不存在则不进行任何操作' i& N' ]: V0 o, |
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 ?0 M# {0 n5 ~: u% y+ F# W$ q
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
& l& S+ _ }7 E* m+ s. h& h - 0 U0 e# m7 b/ z4 \
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的0 d4 s. ]" H( s0 i
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);, D5 `& S! `' B$ k: N( B
- ( V) v5 B7 [& A$ `: c6 M/ r; Z
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! E% [6 v: }! s+ W/ p
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
1 H* U8 L1 a# `) a -
3 F# |0 y u Y6 ^, ]" k, p/ c - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, d$ H& K( t" Y
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
8 h/ N! W$ b5 b2 L, e - . L! {( p/ D9 I$ V0 L! T- l
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错7 J& Q, V* C! a4 c/ j+ c
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
7 B2 r+ F _! Z, O1 f/ r -
/ y! r. {1 s% S# D - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
c0 |( ?+ Y5 M& t0 y; M - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);, Y4 W/ \" W1 g0 p
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' M' y1 ^; x6 ? u3 B0 ~" P/ J9 _8 r
- 8 A2 f- I' i/ a* @& M! ~
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)% N) O+ s2 V; _/ Y; U5 _# j1 U% ^" K
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ ?# V$ c% o. e0 W
- X& N& I5 a' Q/ R. s- p$ f2 b
- //$pull:删除数组中所有指定值5 h' A0 A; p- `8 \9 B
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
3 M# b6 Z. e* s' d4 y/ K, ~4 q - # x M0 w( G1 s4 M# b8 V$ d( d
- //$pullAll:删除数组中多个元素的所有值. X4 A }4 L2 J
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()2 B6 ?8 u% h- [9 F
- //参数1:希望保存的信息数组! C* [7 Q* o" P: Q. {2 S7 J
- //参数2:扩展选项+ k, q8 b. m. w/ D' r
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
! {5 t' E$ C1 L* p# M/ L- H' e1 G - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
1 e% s' ` }, ~; ] - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。: x; {$ `% u6 J) H9 W5 U7 M- d! E) W
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间4 P- T/ [; u2 X9 C5 W
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
9 P4 j$ X/ O7 l& W! p - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
. A6 E* e# Y/ @3 l/ g' T: [' ]9 ? - //若想更新则应该在参数1中指定_id键的值。0 U8 J% ^( z! M4 {6 R9 E# C, H; g
- $mongo = new MongoClient('mongodb://localhost:27017');
1 s, \% z& G+ T - $db = $mongo->mf;
" F6 r9 g9 K2 P9 p( g" p - $collection = $db->friend;
+ w k" s# X" [( H) L( \, g - $doc = [//定义一个文档,即一个数组
, b* n( o1 D& h0 l - 'First Name' => 'Jet',
9 [$ D! n7 C1 r: T2 Y - 'Last Name' => 'Wu',
( a5 x f% `" H; c - 'Age' => 26,8 O: t M) A! w* D9 Y& Q( Z6 K
- 'Phone' => '110',
: x$ {2 ^" S d* f& k. T- K - 'Address' => [
* d: y! z$ |4 ]# v7 g9 z - 'Country' => 'China',. r9 s9 o" n5 V& }9 C
- 'City' => 'Shen Zhen'. L, i5 V: ^2 B; ?$ s5 E
- ],
% C, F3 W, l `( ^5 } - 'E-Mail' => [
0 s3 G8 n& _. P; J- a - '123456@qq.com',
$ \$ a2 Y& o# D8 B' v b: }8 H - '666666@sina.com',8 x7 L/ T/ f/ i& r# |4 G' R- W
- '8888888@qq.com',
* r) M `+ }. X/ f$ X - '77887788@qq.com'% k8 ?" c1 L. ~) C/ F/ l( ~7 N+ L! X
- ]
1 h5 k4 k7 m/ I' O+ E& L1 z1 }( W - ];
- y- x4 n' U/ z& W1 K7 W) ^$ Q - $res = $collection->save($doc);" t; C5 m+ m; R5 M9 N8 N' C7 ?
- echo '<pre>';
" }# P U+ m+ y( P5 w8 v' x - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入! v: B% m& i/ ^
- * Q& C3 S2 O% S" L* G: p4 n
复制代码- //findAndModify()
! s: w- @6 r' K4 ^ - //参数1:指定查询条件/ l. w1 B* H! o* P4 \( W4 H
- //参数2:指定用于更新文档的信息
" A" a& O+ s# \1 @0 x @. ^ - //参数3:可选,指定希望返回的字段
: @& ], e" p; y7 n0 A2 k. c+ X" U - //参数4:扩展选项
, g! b B5 Y0 G7 ]+ \% t - // sort:以特定顺序对匹配文档进行排序
, C( _0 j! V0 p. X - // remove:若设置为true,第一个匹配文档将被删除
' q! f V$ ^, o n) B9 x - // update:若设置为true,将在被选择的文档上执行更新操作$ m9 {+ ^- g0 Q: L0 u
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档$ y t3 `; ]! ]
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
1 m8 J; v0 i1 _7 ~$ S7 X% M - $mongo = new MongoClient('mongodb://localhost:27017'); q, _+ t1 J* S1 Z% O6 b8 T) C. G1 Y
- $db = $mongo->mf;
j: R" k, O b) [ - $collection = $db->friend;
2 @5 u: e% n# t4 J/ |& q1 o5 a - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
6 f4 y7 S3 Z: h! Q0 g - echo '<pre>';
; a% E1 }3 l3 b1 @9 D/ h5 v, N - print_r($res);
复制代码 四、数据删除 - //remove()+ a9 M# ], n$ h& h- d; f4 H- W/ E
- //参数1:查询条件
! ^4 @: Q: {+ t- g7 u - //参数2:扩展选项
D9 S1 y, p$ a0 l( S& g - // justOne:若设置为true,则最多只有一个匹配的文档将被删除) w0 A5 [5 k) _ l
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
: o% R" m7 P$ S+ ?5 u- a# `; E- ~' x Z - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作2 O& N/ n0 h& I2 \+ k' t
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
/ E. c; J7 r4 Y( T) V, F - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
) m1 E7 S3 ~& s; n8 J5 O - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! |) ~& D: E, ?: P; P. S
- $mongo = new MongoClient('mongodb://localhost:27017');
v& t6 V2 A1 D/ y6 g& X - $db = $mongo->mf;9 @) I2 D1 D& h" I0 O
- $collection = $db->friend;
. h2 m+ ?, e4 _, E* e+ y# P* G* w - $res = $collection->remove(['First Name' => 'jet']);
9 {* |( N1 v1 b+ D0 T1 L9 n - echo '<pre>';
2 ~" v7 d% M' y8 G" c0 W - print_r($res);//$res['n']表示删除了几个文档
复制代码
' k, m8 Y0 b* [* n4 k$ [" v以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 ! q7 H' N1 f, N) s; n$ w
-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- y6 Y) y% s) |' h" N
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 [8 W! H% H6 N( S1 i
- $bulk = new MongoDB\Driver\BulkWrite;) f7 H( W3 C! w9 ^! X! F
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
( E o2 l% s4 I1 q - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);* \" Q9 @# u" k' I( w
- 0 |2 \. _5 b% E- t/ M# s
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ S b* L/ k, y+ d
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
" ]( m2 N7 K& p* M: A - echo '<pre>';
) H C1 _, O& | e3 ]. F+ y - print_r($res);
复制代码 6 r' z; I- A3 z/ Q
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');) e/ s6 I$ m( e$ }4 j. x
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* j) ?% U2 }$ k: {( c$ t' Z- ^
- $cursor = $manager->executeQuery('wjt.friend', $query);
& N' E. |6 G) P2 D& P7 f* ` -
9 v& j8 ]5 C1 |" X; C( A. C - $data = [];* v* b2 ?# A" B d x+ H
- foreach($cursor as $doc) {4 N$ V) {1 \1 M3 s& Y$ Q; Z
- $data[] = $doc;
$ q0 Q. H( C. a, f2 O - }9 R' F4 Z: X/ \2 r1 c0 p4 k( n1 o
- echo '<pre>';9 ?( L U0 Z k6 U4 ~/ X* | p4 J
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
- L {; |2 Q" e* |+ Z4 b* ]! u, p - $bulk = new MongoDB\Driver\BulkWrite;
5 X$ ~# H0 h2 t" V8 ^ - $bulk->update(' h! }1 |" l* Q( M: g
- ['name' => 'JetWu5'],
& M" {, L; A- l4 h - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
6 l/ X* j, @* V$ G$ q2 i9 J" S - );
! T7 s9 ~: {6 v, `; @4 f - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
2 b7 P2 Z6 C0 q6 Q - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
+ U3 s. A) |, x2 b1 v - echo '<pre>';# z0 t& w& B# V9 ~" K
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');9 J& k3 A% @+ t9 }4 k2 j
- $bulk = new MongoDB\Driver\BulkWrite;
/ ~- u6 S E7 Z% n O% P9 K9 B - $bulk->delete(['name' => 'JetWu3']);
, h& t( b) Z+ o* {% u# z - $bulk->delete(['name' => 'JetWu4']);
! V! ~$ ^6 h* }" f9 }& ?& t' a - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认, g! c- w- M" N: a% { n0 c
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" Z3 c* B ^, ]2 E$ h
- echo '<pre>';; J8 u+ D$ w' ]3 J" `: k- x9 T# M+ J
- print_r($res);
复制代码 1 @3 e" Y3 p, e& {: ~8 l
( S% c' P8 ?4 j
6 W% ]9 X2 w; U! z
$ d4 _/ f& b+ h3 R
8 B9 N4 s, m- T1 C |