MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()- Z! G' w& ?. {. P% B) `9 e
- //参数1:一个数组或对象
- e8 }9 V5 q, {8 c+ r' d - //参数2:扩展选项
9 Z( n7 a o& A: J: C4 w - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘6 A% [4 V8 J# m$ V2 l) |
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志3 N# E, V8 b1 C) k
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认5 V5 N9 [! B( s! D$ }$ j
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间1 @5 b$ q0 ^: F1 ?
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
9 ~- e- g% w6 Y' I - $mongo = new MongoClient('mongodb://localhost:27017');
" B6 L% {6 P% n1 I! B - $db = $mongo->mf;//选择数据库
1 y6 o, S& b; Q% [! k- F- x - $collection = $db->friend;//选择文档集合
$ s6 m B6 n2 ]/ Y' B' g - $doc = [//定义一个文档,即一个数组3 j7 ?) @3 L0 z! l( }
- 'First Name' => 'Jet',
. c! _+ t% P6 v% ` - 'Last Name' => 'Wu',( g$ W/ v2 w& e0 `8 n
- 'Age' => 26,
( Q1 Y7 D6 |- g6 U: A - 'Phone' => '110',
2 j' u) A/ u% b _% H4 ^) [ - 'Address' => [# |1 \: e' O/ F x1 L1 P: c4 \
- 'Country' => 'China',
+ ^8 I% x0 M# D/ g1 X - 'City' => 'Shen Zhen'; Z' ], e7 N9 v( b
- ],
q: v: X |% O - 'E-Mail' => [
* M3 v3 F* ~$ r1 c6 h2 w; ] - '123456@qq.com',, A, w5 W, m/ V0 E/ n$ h
- '666666@sina.com',* ]" i; s. k" h4 B) J) t
- '8888888@qq.com',
' I E4 j# F; L) t; W: O' I A - '77887788@qq.com'
2 I h$ H5 G5 O* B/ ?" N - ]
' q8 s9 ]. x$ s3 b' k0 p, T' L - ];* o1 q5 e; t( { B$ k# J6 c
- $res = $collection->insert($doc);//向集合中插入一个文档3 c: B5 h* o+ x" u- j2 U1 H" D* U
- echo '<pre>';; {; w+ a" B: ~, l0 q: _' c, h* w+ Q
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()! Q- h3 G/ j: {7 R# b$ @
- //参数1:搜索条件! C0 g0 u% q( j2 w; B- @; i; p
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段 Z# g2 g: @* k% w+ @, _6 R
- $mongo = new MongoClient('mongodb://localhost:27017');7 ^: o! K% \; @" p7 W( l
- $db = $mongo->mf;
z; ]6 ^* U/ O. w# }( J& [4 B - $collection = $db->friend;/ g- A, p, z! Y# t7 e" r
- $one = $collection->findOne(['First Name' => 'Jet']);
& P5 C4 y7 q/ g9 c2 |1 V - echo '<pre>';' |5 k* v( D: z' W
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
5 N/ ]% a3 A% T. L8 |, q" r - //参数1:搜索条件7 `7 g) j/ C# y
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
2 i' w6 F: ~" S k2 h - $mongo = new MongoClient('mongodb://localhost:27017');- d3 `3 K% V7 I* n: T* q
- $db = $mongo->mf;
) E; R; U4 d4 n* @) V1 }& u$ S6 `% O0 { - $collection = $db->friend;
! f7 i# Y4 ?, k$ h: A - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素$ P! _+ D; ?5 D0 {& o3 w% o5 |
- echo '<pre>';
5 L" m3 ] r: H - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
7 L3 l& z* r" D: } - print_r($doc);6 ]# g/ V6 }7 [" |+ f2 I7 p. S
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询, q) e1 v$ y+ U, w& f; G& p( c* b
- $mongo = new MongoClient('mongodb://localhost:27017');3 t2 ?8 ~) A( V; [' D
- $db = $mongo->mf;- Q' u V3 n5 f0 c4 L! M
- $collection = $db->friend;
( _9 S$ _" O$ e4 p, } - $cursor = $collection->find(['Age' => ['$gt' => 30]]);- o, t0 T ^. k i
- echo '<pre>';" o; P4 m: t" o4 F0 C3 L* L
- while($doc = $cursor->getNext()) {8 `! R; E2 D5 `# K4 C' n
- print_r($doc);
; @' j$ k' |/ [- L6 M( s( u - }
复制代码 //查询某个字段的所有不重复的值4 ?$ P9 t7 B7 q
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个# J( b. w' Z5 c1 E: g u# {
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);6 u9 G' S# l* X. `- d9 h( _& v6 g
-
7 B m. X. [% e1 {) Q0 m - //$all:匹配多个值中所有值(用于数组字段查询)
; s! {/ ~6 f5 i8 \ - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
4 G6 Q3 A0 M) i7 R -
1 _) L! f5 [3 W& I+ u N: { - //$or:或查询4 w' {+ [% g+ J; \- O2 C2 @$ T) s
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
; F5 ]$ q0 t0 K3 G1 w7 S9 Z4 p" P8 N( _ -
" B$ g5 y Z- g - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
5 n, T5 `0 T1 I - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email0 F+ x# q' ^( F& m8 @
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
7 k# _* K* a* B4 ~# c. h - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个. J0 H" V/ ~( z W( c8 k
- & ~% f* X6 D7 ]$ R1 o0 O8 Z7 ~
- //$exists:根据某个字段是否有设置值进行查询3 `9 W, c" N9 }
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档" p6 Y" { S; { x7 C5 a
- " |& R: U+ ^& _3 |) x, a& r
- //正则表达式查询
/ I+ H. v* Q$ i. J( Z0 q - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序+ ?% @; O1 |& r
- $cursor->sort(['Age' => 1]);" w" J k5 S& C6 p
-
8 b/ h8 m, h0 V" P/ K8 Y - //忽略前n个匹配的文档& I9 ?+ r, B* n6 R5 r x2 B
- $cursor->skip(1);( E" \- m3 P( Q$ w
-
. w3 b. K5 r. Q F8 l# o - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)' V7 i) D/ S/ S/ f- Y
- $cursor->limit(1);
0 Y9 d3 D ?* l @5 N/ Y - 3 y# G; }* H" L. w4 g9 Q% _
- //匹配文档的总数
' ]3 R- R7 \- l7 n - $cursor->count();8 s7 r) N- X P4 W
- * h; ]3 G$ u9 M V) b
- //指定查询索引1 s0 b$ A4 \# F8 o+ F5 A0 @9 @
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
: c6 u3 n1 \- Q" U' O6 Q% } - $mongo = new MongoClient('mongodb://localhost:27017');' j* x3 f8 E- O, x' U
- $db = $mongo->mf;
1 W3 j; K# x" ]: P/ l- e - $collection = $db->friend;
' F7 i& |% [- A( O. S - $res = $collection->aggregate([
2 Y/ P1 \0 X0 J* P' r - '$group' => [
$ @. C; w# H9 N5 s7 |; m0 _' d - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
0 T) j9 y- E: k% ]7 a - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
) o: e6 I- A- O/ W& Q - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
, U- |3 w" }' J6 m% F+ U - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
0 u6 {( [. c" T% Q' Y2 k - ]; v* H7 a& T; G' V" p8 X' R6 D
- ]);+ d) [( q) B1 @6 d1 }" g
- echo '<pre>';( `, h3 S2 C. Q1 |
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
7 l; Q# V. t, |5 ]$ d6 H -
+ R# t: z" x' y: P8 ]; }8 m -
& {( B, y0 Y0 X9 s - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序( }( j' Z' N5 C2 d' F& C
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
0 x: v. D( A$ b5 t4 k+ `- |5 g$ y - $mongo = new MongoClient('mongodb://localhost:27017');" \: ?8 m5 k7 f: G1 U* ^" a. W
- $db = $mongo->mf;0 l8 ~6 f6 O$ h) w% b
- $collection = $db->friend;5 Y; ]: d/ u2 k; f+ I) f, w* N
- $res = $collection->aggregate([
7 A1 P1 m0 t v# D- {+ K - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
- R; T" N# K; w8 s - '$match' => ['Age' => ['$gt' => 30]]
! W+ V5 S4 j; z6 O2 i1 r - ],: ~: c4 z6 Q s
- [//指定分组字段、统计字段
2 \2 n& _1 k W7 F4 u - '$group' => [ f3 B. k+ b' s) y! ?
- '_id' => '$Address.Country',! d+ Q$ O" q h3 i9 F
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
+ h* Z1 k3 s: C9 r - ]/ L9 Z+ b+ G# a$ E' j. v
- ],
% R% a7 i# J3 T( K, T: s- ?6 ^4 C - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
( O& Y' w% R5 u7 q - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
2 Y0 @, m/ T d( ]! s9 T - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
7 E; w+ g7 F7 G5 f" d8 T - ['$skip' => 2],//跳过指定数量的文档
0 @* _ u7 Q7 d3 D) Y - ['$limit' => 2],//只返回指定数量的文档2 }% \5 q4 ?, @4 w0 q, U4 S5 J
- ['$sort' => ['totalAge' => 1]]//排序
7 d' C) O) o5 Y9 N6 P+ m - ]);
8 j/ P) e8 Q5 Z9 U+ `1 v& X u - echo '<pre>';
T1 A/ x& |$ y. m - print_r($res);
复制代码 ' Q G4 v1 r/ D( p7 ]% P6 e
三、数据修改 - //update()7 |5 B3 W$ y. f. b. N
- //参数1:更新条件,指定更新的目标对象。
- w9 }- }8 K- X" U, ~! F) X0 g/ f - //参数2:指定用于更新匹配记录的对象。/ @$ f! }3 ?7 ` `+ G
- //参数3:扩展选项组。
' r9 h& q" C+ ^5 j - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。& P# F) x: S$ p" J* f: ~+ Y# o
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。. r/ }: R- i( S8 }
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
$ s* ^3 c. `. V9 X* I - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
3 n6 E) O2 H3 U/ @: O* D - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。; f! k. _$ X0 m5 l7 f$ l
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间5 |% F4 Q6 G7 O5 ~0 K: @+ B
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)# |5 C4 J0 ^5 O* S" }# O p, @. S
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
. l. }9 X, T- f* f/ i q/ x -
* O" ^7 O" v2 I1 {) S# V! D - //$inc:增加特定键的值,若字段不存在则新建字段并赋值8 }8 `: n3 V% T6 b5 [
- $mongo = new MongoClient('mongodb://localhost:27017');
& m2 l( l5 _- B) @4 M% u5 c - $db = $mongo->mf;
- x$ P% H- U* ^ - $collection = $db->friend;
- q* k" y8 ^0 l% }7 Q, l6 Q8 u# { - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);; P0 R2 R! J2 Y8 N2 Q& y- H( u
- echo '<pre>';' K3 P7 h! \& c9 N- D
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
7 T e) M$ y+ M2 s, @ - 9 X; b' C( H8 [: r3 t) M* x
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
0 s3 l, {- Y/ [/ ]: L# ^ - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);8 }2 p, F6 E, F# ~# v( F
- 8 y. E& _5 j7 m
- //$unset:删除字段/ \4 q# z5 N$ `$ Q8 r
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
7 I* J* Z$ s0 i8 g3 ?! M6 q -
8 ]- s& g# {/ ~ - //$rename:重命名字段,若字段不存在则不进行任何操作9 ]( k7 o. S3 x
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);* [. J- ?3 l" e' g. P: |1 |" y
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
6 s, N, Y; f9 ^1 M -
: I2 D/ i: K( ^, e/ D" c7 g - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
% K1 ?% {3 L! G8 ?; U. _1 ? - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
( F9 c4 N& O1 ]8 U - " x! [% F/ k% Q6 C3 _! N
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
, a% K9 q/ F- F9 t/ r! a; ?* _* O - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
( r2 B5 U7 W- W, Y" t -
2 P5 g/ r! R8 C2 n8 f1 c - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
9 C8 ^0 V' l6 O! a) s# l& ~ - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);8 a2 P- K2 u+ E, @" o
-
9 @* T2 [1 U5 C+ J- j - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错0 x2 S" F' ?! |
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);0 w" @. a( O* n q# ^& j- t
-
: B& g) N4 S6 f$ H6 k/ F* T$ u! | - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
5 `$ ]( h' l0 P6 U/ P - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
) P% t0 H( b( u& o* W - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
0 {+ T/ j, f, ?: B; T" { - 3 v7 ?5 w, A. Y* r+ t q# J9 m
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)3 C. | ^4 V5 W( Q
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
( O+ ~* a* j* R; {7 \$ L: B - * P& K1 N. D. g; l, _
- //$pull:删除数组中所有指定值
5 H; ]3 ^ ^' q/ J% Q( U' h - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
1 G9 ^2 \: H9 B" w+ a# { - * D; d* @$ t" X3 ]0 ^4 a# O
- //$pullAll:删除数组中多个元素的所有值
4 `! x$ k6 ~: L T - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()* e$ W6 ~1 Q( M! j1 \7 W# K7 C
- //参数1:希望保存的信息数组
- |6 r) V7 i! ?: J8 O - //参数2:扩展选项
u3 U$ t3 a. H3 z+ `' g; o1 E: U - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
' K! K, _* D: B' V7 ]! a$ ~& {7 D - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
3 k* T) N% Y8 E9 U: x; | - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) @) F y6 Q `+ T& h6 \1 _
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
_1 i8 L: v7 l1 w - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)+ N. t$ U Q; ?
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。& o) T: s' |3 r' O& H& x7 v
- //若想更新则应该在参数1中指定_id键的值。/ B$ b4 Y; k8 ?. c3 f' w
- $mongo = new MongoClient('mongodb://localhost:27017');
& S. r; n, p4 S' }4 k7 v; [ - $db = $mongo->mf;
( |2 ~" Q& }) B# e) K8 d - $collection = $db->friend;6 E5 L$ {' M* n, W1 G
- $doc = [//定义一个文档,即一个数组
& X: f/ s. G. V5 I# r; \4 K1 A2 _9 l - 'First Name' => 'Jet',3 { d. Z/ j2 R
- 'Last Name' => 'Wu',5 o+ Z4 i6 G) [1 {$ p: U
- 'Age' => 26,
# }1 u- a; e9 [$ k N3 V# W5 n# f - 'Phone' => '110',
5 E4 v5 j3 l$ g/ l' w! g - 'Address' => [
5 |7 j0 D) R; @4 }: E/ d - 'Country' => 'China',/ \7 L4 |' Z" Y- @5 h
- 'City' => 'Shen Zhen'
& _* i- c1 N" K - ],
. e; I) @6 G' Z5 b0 N7 a' a - 'E-Mail' => [- @6 l$ p+ g: L4 K4 |, ?+ d8 ^
- '123456@qq.com',' `" Z: k" Z; H' V" N
- '666666@sina.com',
& _# f" w4 ~1 f' }! W3 ^, c - '8888888@qq.com',# x8 Y. t5 `$ J6 c1 Y% Z
- '77887788@qq.com'
2 f# k1 _0 Q% |) L) r' X2 @ - ]
) v+ O# z* W ], b( [* a/ U - ];
% S. i2 W4 e9 K0 T+ t' s8 d& A$ G - $res = $collection->save($doc);
1 J1 m) H6 W3 E+ T. V5 v8 f - echo '<pre>';
2 G, t& R. L: ~2 _" D - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
: H; R! x* p! C, f" H: l1 b
" d$ ~2 t, g8 k0 ^7 p
复制代码- //findAndModify()! U; j3 \1 ]( G# [
- //参数1:指定查询条件
. t9 i9 M& u" a( }9 D ^ n$ l - //参数2:指定用于更新文档的信息1 h$ {4 e) k" G
- //参数3:可选,指定希望返回的字段
; {: p* |: P1 n8 w- j% o0 ]7 O - //参数4:扩展选项2 J5 [) U2 ]- D+ |+ P8 D
- // sort:以特定顺序对匹配文档进行排序: ?0 p) V3 p, G9 r* c
- // remove:若设置为true,第一个匹配文档将被删除: s2 e6 F/ n. m
- // update:若设置为true,将在被选择的文档上执行更新操作6 i1 ~3 l- {: s: ?6 o
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
5 l2 d' X* j! [. M% O1 V- O5 V1 { - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
( z; j n) Y6 r6 h2 |$ Z - $mongo = new MongoClient('mongodb://localhost:27017');
# h( D- V- k- `5 ]! ]7 n$ ], G - $db = $mongo->mf;8 x) J/ ^! S4 q; E
- $collection = $db->friend;
! }2 j& U" X% H c7 ^! L; V - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);. r8 h, j1 o6 O" j) c+ [0 D4 y
- echo '<pre>';
/ C. u' p6 w) @; b9 Q( x- _ - print_r($res);
复制代码 四、数据删除 - //remove()
$ |5 j: N; q( u3 s6 L$ X" C" a4 |! a - //参数1:查询条件3 [# z4 P7 j9 h; h- H: U
- //参数2:扩展选项
; q5 }) I$ L7 [$ E - // justOne:若设置为true,则最多只有一个匹配的文档将被删除6 m; s ^4 b( z1 S5 G2 p9 W) l& z4 u
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
# \9 E8 C! N. x, I, \0 | - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
- e, {0 ?" l: S" ] R, d6 b - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。6 }3 ]: C" x; n# M2 Q1 P- P9 j
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间( f- E V% h" A. R: r
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
& r2 ] ~7 O( a- _& I - $mongo = new MongoClient('mongodb://localhost:27017');
6 R# l0 o/ ]* w; Q S% q - $db = $mongo->mf;- L0 b# i2 K4 Q
- $collection = $db->friend;
% e' T' a1 p6 X - $res = $collection->remove(['First Name' => 'jet']);8 n; [8 F2 | l3 A( {0 J3 ?# x
- echo '<pre>';
* ]# O8 {: `( K. N2 _9 C3 ? - print_r($res);//$res['n']表示删除了几个文档
复制代码
% k; ^) t& N1 P, d以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 $ W p3 z3 p1 X' H1 I0 n
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
0 K I0 n/ m( d/ P数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
( g Q% V* {' L* d3 \0 S/ T$ F - $bulk = new MongoDB\Driver\BulkWrite;
/ r! \! [" f5 W; A - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);0 w6 _# H- {; q a8 \3 ]
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);2 C _3 Q: @ s: n
-
0 Y' y4 S2 d: F- x6 T. U2 l$ I - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
: z2 O0 A: y! U - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
+ T; q6 b+ Q+ O7 J" y - echo '<pre>';
6 N! s, x: ]2 V1 d6 M" U - print_r($res);
复制代码 4 i+ P- |# N: d/ W: I2 D
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" x* H% \' r3 A& J- G8 w
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);. ?/ } ]2 V& ?3 P( D( S( B
- $cursor = $manager->executeQuery('wjt.friend', $query);$ \5 X1 k( t: O/ V% N
- + I% Q4 m" c! N9 G$ u
- $data = [];
5 f' m* Y, k2 V7 U# A6 S4 N - foreach($cursor as $doc) {
& H! i2 Z1 R6 w G! j - $data[] = $doc;7 v5 S% f) i. A' v& b
- }5 A0 B) j1 a5 a3 M
- echo '<pre>';0 S# F0 f* F9 l: [
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
9 \& m" z! V& ? H$ w f" h - $bulk = new MongoDB\Driver\BulkWrite;7 A0 m' ^# x) m/ Q
- $bulk->update(/ Y' k$ k4 ]# @+ ]* C; V
- ['name' => 'JetWu5'],
7 ^& b7 z) a( q; F- c, c1 i* A - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
) ]0 p6 y( U N* [' ~+ ? - );3 A$ M) t8 c2 \( w" ?$ w6 F6 q
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
* m, g* z! L7 D4 U* \. o% q( f5 u - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);+ X$ I3 k% N2 F2 ]. Q9 Y7 f" R7 _
- echo '<pre>';/ C4 I6 `6 ~2 D8 H) ^1 e
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
0 y. w$ X' m6 i - $bulk = new MongoDB\Driver\BulkWrite;
/ {/ D6 O) y0 J7 F! d/ ]! m5 N - $bulk->delete(['name' => 'JetWu3']);- ]/ G3 G! S" h" L: w
- $bulk->delete(['name' => 'JetWu4']);/ W e# s9 a# N3 R* r
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
: a1 K$ Z" k1 ^; V# B* h - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
* Y6 J- P: h, f8 y0 K9 S - echo '<pre>';
?6 m L6 H3 X - print_r($res);
复制代码 3 `' K7 g" q* f3 j/ H
X6 a3 B% Y1 l k
* J7 x' z k, d: d, @1 d" y
# t7 i5 S1 @; j! E" G! P5 L
( e, c9 t+ i1 K |