MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
. `9 ]/ z) ~4 c% i# m$ T - //参数1:一个数组或对象! `( L6 v+ s& [, L8 L% \2 g! y
- //参数2:扩展选项1 H* ?& b( d, l7 _. {
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
/ Y3 ^- _3 X9 X. A; S - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
$ U+ g( n& I4 o - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
5 @' d% ]* n1 d* U& d; w - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间* K' Q$ d& z$ S$ A
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
q* A Z, K5 m4 t3 c0 P0 v - $mongo = new MongoClient('mongodb://localhost:27017');
$ g2 F/ U7 U9 ?6 r( T B; f3 } - $db = $mongo->mf;//选择数据库
3 h; m6 p1 D4 a. L8 X - $collection = $db->friend;//选择文档集合$ W3 Y( K; Y5 {6 o+ {
- $doc = [//定义一个文档,即一个数组
4 H. [- h1 w$ g$ c. J8 N/ c - 'First Name' => 'Jet',1 @/ [, {& b n* i/ k) h" R# b
- 'Last Name' => 'Wu',; Q+ b( q& f- p; V0 _! ?
- 'Age' => 26,
9 @! S5 a/ I2 y - 'Phone' => '110',7 [ ]9 E0 e G+ G; N
- 'Address' => [
0 |, F/ I8 E$ n8 {" W - 'Country' => 'China',2 @* ~2 ?3 N$ f, x+ A- b3 s2 M
- 'City' => 'Shen Zhen'0 M: ^, s- G9 p6 I
- ],
7 U: R1 U2 `6 x7 Q - 'E-Mail' => [. _8 G6 j: c# T- M% v- S* T
- '123456@qq.com',( ^2 ?' N1 I) Z! {( `7 O" w' V
- '666666@sina.com',
3 p! }3 Z# v1 A" @" A. @ - '8888888@qq.com',2 w2 [1 u( v2 \, J( R; r' w
- '77887788@qq.com'
* J6 a. S( g' R$ i* W+ E! A - ]3 _2 T' R9 B0 Y1 }
- ];# j! E& x7 g. j% E
- $res = $collection->insert($doc);//向集合中插入一个文档
0 N2 k, n7 [, @# D* @ - echo '<pre>';
% p8 T* x! L; T0 O - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
+ z$ l. k+ R4 p0 b$ I: p$ E - //参数1:搜索条件! R4 D5 b8 l# y: ^
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
. d9 ^, J: d; u" c3 Z7 T& c - $mongo = new MongoClient('mongodb://localhost:27017');
) {; W5 Z% J. R' t! p' t - $db = $mongo->mf;7 L, u* G& H9 c7 i
- $collection = $db->friend;
. ]! S1 \: o! ^7 z, Q5 x6 W - $one = $collection->findOne(['First Name' => 'Jet']);
l$ ]( z; m/ B# h, N. j - echo '<pre>';# l9 \- ^ o* q6 ]5 N$ a
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()) l. T% ?. |# c. `
- //参数1:搜索条件, c& J9 f( T# r7 q& P0 z
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段7 y* Q3 X4 m* c
- $mongo = new MongoClient('mongodb://localhost:27017');4 r$ b: W* T* S( Y" r( Z H
- $db = $mongo->mf;
; a/ ~+ T+ R9 |1 T1 p, X+ x - $collection = $db->friend;
) \4 s w4 P* U/ q B: w - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素0 U# `6 F( N7 l0 i: V7 v
- echo '<pre>';
' |2 B9 y6 M* Q4 _ - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
9 h. V3 ^2 b+ O - print_r($doc);1 h0 f9 |" D. A( u' K9 ^
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
5 _: ?; A4 L6 {5 Y - $mongo = new MongoClient('mongodb://localhost:27017');
' i. c1 H) p, B - $db = $mongo->mf;
; |: I7 j: w! b m. A - $collection = $db->friend;
/ g4 s' [6 G+ ?# b( t - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
2 L" H, t5 O6 g6 k - echo '<pre>';5 }, Q9 ~" e; V4 @; C
- while($doc = $cursor->getNext()) {# ?( @# @6 w$ r) e( E; k7 K
- print_r($doc);
1 g3 i$ L8 M8 I! D3 t/ z - }
复制代码 //查询某个字段的所有不重复的值% i8 o: B! {/ [' [! U
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
. Z5 j! {, c$ F4 D+ z m - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);- w: c* I7 O& r+ \8 j& {- O) c
-
9 v4 y! d$ C; o8 P - //$all:匹配多个值中所有值(用于数组字段查询)
9 x0 q) O7 v; `4 [7 B - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);0 @, x: h# p- f/ p
-
6 b1 b! m1 I, Y# o - //$or:或查询
E2 J6 d+ _3 L - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);* M/ i1 }8 R/ t, O4 j
- ! P! Y L# S) ^. ?1 q4 U
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
8 m J. C" G, _9 C - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email2 C, Z* k) Z0 ~2 M1 p
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
) A1 Z1 w0 ?9 j& e - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
% `7 S2 l( p! t9 o" c - . Z# h q2 D: W6 N p
- //$exists:根据某个字段是否有设置值进行查询
4 v, X$ R3 R# ? - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档; L) E6 V* K; j J2 [: ]* J& B
-
% X) {5 S B! }+ h+ T - //正则表达式查询 ]: ?1 f, t9 m
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
2 ^% w+ f2 J& Q/ q% S - $cursor->sort(['Age' => 1]);4 Z' g7 U- k z$ m! c
- 6 g- b3 K: i! i/ U' R
- //忽略前n个匹配的文档6 D; L) a7 y, `% C, T$ m7 ^
- $cursor->skip(1);
$ _; U) P' E; y- J' O -
% \/ D& q0 K+ O% {0 G# o - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能): _. k' ?+ m& ^6 Q$ A1 Q* Z+ j
- $cursor->limit(1);( |. ^+ {" V# x2 {
-
2 ]% q) ?8 x v, o b% t - //匹配文档的总数
; n1 \ I2 _% r2 C8 } - $cursor->count();3 c9 F; Q, v* Z
-
6 r! D+ I5 m$ @7 ^0 f6 B3 m - //指定查询索引
( k7 j5 T/ F) P4 t$ m! \" `& t - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
! r/ U% t& c4 G* u0 m5 c; x& \ - $mongo = new MongoClient('mongodb://localhost:27017');
+ Z( u3 R1 x$ o - $db = $mongo->mf;
* _, u! w8 e+ |' q( y# W; J - $collection = $db->friend;
6 ^0 ?6 A& w2 I) f. p. [5 a; g - $res = $collection->aggregate([
- h$ o/ y0 x0 q( ?! e0 _ - '$group' => [
0 Y2 M" N* q: ?/ O - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
5 [( x" j) t( ]: k/ X - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
7 ^& M8 W$ u7 j3 _; P0 H - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
t5 E( [, P8 v) m* h; f* C - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
$ C5 n! {$ `+ _: i0 k/ \8 a' R" j - ]5 F- P1 P: M( F7 \! r! w
- ]);
0 E& ?" k- C4 O( S6 m) q - echo '<pre>';
% ^' ?# B6 n+ B0 C- ~ - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
* \+ Q& G3 R& |. E0 {. I8 O% ^ -
v, K; d% d$ m$ Y% V) B1 I - * m% a- N! s6 N! o& U9 W0 b
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序% A; Y, N+ I" f L
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。6 w) B4 u, }1 }) b( H7 T
- $mongo = new MongoClient('mongodb://localhost:27017');
4 c; a6 z, y8 w+ K* \; ~ - $db = $mongo->mf;
. F7 ?' X. l% Z0 W* ~% [ - $collection = $db->friend;% l$ U/ o7 L p* Y
- $res = $collection->aggregate([" U6 g5 g4 j6 \' `( r6 L
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
' J+ R% H/ ]0 a3 G2 O6 D$ U. J - '$match' => ['Age' => ['$gt' => 30]]4 |! ~3 a$ w( h5 Z8 d
- ],! T) p; h* y( u+ h
- [//指定分组字段、统计字段/ _: P. x8 u+ L$ j; M' ?0 @
- '$group' => [+ v' d3 w, r. P; l, S$ h+ }
- '_id' => '$Address.Country',/ c% k( V6 F9 a' p6 {3 C
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和! o/ y0 Y' `& g8 Z }
- ]' h2 x: F6 P2 z
- ],. Y5 i1 ^2 m; M: D+ \
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档& Q9 t( J9 P0 W1 D
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。1 \& b- T' a* z
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名! b) Q/ _, U$ Y* Y
- ['$skip' => 2],//跳过指定数量的文档
5 u4 L+ k8 U/ S: O: a; U p( ` - ['$limit' => 2],//只返回指定数量的文档$ s/ ~5 D! m: X6 L
- ['$sort' => ['totalAge' => 1]]//排序$ `/ G! @6 U8 C5 {. [
- ]);9 M! p; B. J( L7 k: n
- echo '<pre>';/ h( k# @# l8 [
- print_r($res);
复制代码 4 V! ]8 h7 N( c [8 _
三、数据修改 - //update(); `* v4 |% a; o! R& e
- //参数1:更新条件,指定更新的目标对象。: b$ ^) q* w! f9 o/ }4 d6 F% A5 D
- //参数2:指定用于更新匹配记录的对象。/ N, a+ p9 Q! R$ _; D" D% y: Z
- //参数3:扩展选项组。
8 C6 D( I4 l3 P* y+ T - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
# p% H. `8 d6 p3 z& V - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
, d1 a- i3 j; ?2 n - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& C8 g; {7 f0 T/ I. [3 g, V V
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作: X9 y" a* ^' L2 S( o- [" M
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
( p( i: l8 H! \/ p - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间, K" m* s# \- U5 K
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)' ^0 |% X3 }) B& s6 @
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
! g* z7 A) V O: W& | -
( ?6 m f, H: a8 X - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
2 ^& H" V# L7 j - $mongo = new MongoClient('mongodb://localhost:27017');% G |$ U7 u2 {/ v/ r( P, v* V0 h& M1 P
- $db = $mongo->mf;( [- t( n2 F' C! z0 @
- $collection = $db->friend;
8 K$ j, F1 V. n; K5 s - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);( v% N( b8 ?9 v" f' \' a. c
- echo '<pre>';' d: ~4 [) s( E* W& m' o6 q
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量% y! t- T* v4 b) Y, u/ J3 ?
- 5 Z/ [' G, C. o" G* q3 [4 g8 Y
- //$set:重置特定键的值,若字段不存在则新建字段并赋值8 y/ s. G: D2 x3 E4 C G
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);' o! `- {% A4 w- f
-
& c d% x/ z! y& z5 U" Y) I - //$unset:删除字段
! c' t o7 t, |% Q - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
& |3 M$ e0 `( D2 {* H( L - * s" q7 }7 ^, R2 p) [6 E
- //$rename:重命名字段,若字段不存在则不进行任何操作
) k6 N: v2 r7 L, _; B- V - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
- j/ W" e" f( X( [ - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
" S- `- Q. S* s+ H6 | -
4 `" L8 p& @1 [' X( j6 u J% ?1 L, y - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
, r8 U* T1 Q0 o6 |3 D% P, @& P) z - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);3 W. T& n* D7 {6 _6 \! d9 n& f
-
' J; q* f: C7 y* S - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错7 K K4 P1 n, Z
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
# U! ?( q0 ~3 |+ p( t* l8 h) w - 6 Q4 Y2 K O4 u) E8 q
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错/ k8 d( f+ f6 [! U1 [: }1 ]
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
8 f d4 i$ Y2 P a3 a -
2 }. m0 M2 V# `. Q2 _, u5 [0 v - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错% J# {( d6 i4 g, o% G
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
/ J5 j8 e5 `4 N6 ?) N# O6 V -
! e7 n+ i3 ]! I8 C4 V$ K - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中), i2 ]! j% y% \& ?* U% h
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
* p3 `& Q _; L( X# k' g; c - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);& c9 @ l; F3 t: X$ v+ f/ _# p
- / o( H7 r$ L# f
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
$ Z$ p+ H+ b# j0 v - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
' k7 J2 k1 {$ r8 ^3 m -
2 q) m+ T2 ~/ m4 i: i. A- R9 [ - //$pull:删除数组中所有指定值
5 v4 u0 F) r. N2 u( x - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
" {( E" \* \; }8 L, F: X4 f7 y - - x$ }9 W) Q9 J2 w! L
- //$pullAll:删除数组中多个元素的所有值
7 X" k6 I: ?1 m5 i7 Y: W5 g2 K+ N - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()3 \. P& S! G$ l( `9 }* V b; \8 F
- //参数1:希望保存的信息数组. g: K2 `, w, t) ~) @0 a+ V) [
- //参数2:扩展选项% |# n- l+ s) {) A6 x: c
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
0 z2 o4 q" d0 v6 |* U: |+ s - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作4 \4 u2 X& O* B* T/ h) `
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
2 N& o3 Q8 R: v5 R, f' \+ H7 S - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间) t( P, u+ y- d4 C
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
5 b6 m0 q- N' \/ @ R - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。( a8 i& R. K7 c" l- s% d8 u
- //若想更新则应该在参数1中指定_id键的值。
1 |5 |; W# r6 [. M - $mongo = new MongoClient('mongodb://localhost:27017');* `. |0 m/ O- ^7 U
- $db = $mongo->mf;$ }' W. t. _$ z" I3 c
- $collection = $db->friend;
! o3 \# v: E% Z9 H, ~! M8 h - $doc = [//定义一个文档,即一个数组
/ z8 d! W. y* B3 H. L% q7 K4 ? - 'First Name' => 'Jet',, `# L0 Z9 W0 g9 x
- 'Last Name' => 'Wu',* |5 e0 c8 p& [- a( x) f
- 'Age' => 26,
4 ^" I0 K4 O+ X# w7 r: W - 'Phone' => '110',0 `# n3 e5 w# A( o& y
- 'Address' => [
z7 E+ q+ e5 ]. M# M' j4 V - 'Country' => 'China',+ t9 }& `3 K5 l- C$ P, s
- 'City' => 'Shen Zhen'
+ G: ?% \' Y1 Z* z' q3 \6 I! G - ],
* c7 k! n, V7 Q. M ]6 J* m6 j, f - 'E-Mail' => [
, g) E$ c' Q( i1 x9 L9 q7 N - '123456@qq.com',& o3 o& a8 @1 A/ d+ a! y- S
- '666666@sina.com',
- C( G7 y/ @# l; L# M1 Y - '8888888@qq.com',0 J* G0 H! x# i; c9 a. h: v& k9 W
- '77887788@qq.com'
! x8 }( D9 f( H5 q2 k1 J6 u - ]% q3 F' `3 }' f6 a9 |
- ];+ l" c8 Z) l$ Y" [8 _2 K- @
- $res = $collection->save($doc);2 i9 X5 a3 c4 u4 m2 b; ~, u
- echo '<pre>';
6 P! T+ T' x) @ - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入6 p; [: j0 j I {6 E
% h. j& ?2 q: B, R- m; j% K+ |2 p3 ^
复制代码- //findAndModify()" E( w. K, e2 i& D b3 c( P m
- //参数1:指定查询条件: g. z4 e% J9 J0 ]; C$ ]2 G0 U
- //参数2:指定用于更新文档的信息3 d4 V1 ?1 F6 A5 y, z7 W; o. A
- //参数3:可选,指定希望返回的字段* e- N! x# d% p) g
- //参数4:扩展选项6 |* i& \# [+ ]0 N, g
- // sort:以特定顺序对匹配文档进行排序
2 y( m" v: W3 y - // remove:若设置为true,第一个匹配文档将被删除
# \. @, ?+ r6 I e: b) } - // update:若设置为true,将在被选择的文档上执行更新操作
, i& r/ v: z U" S0 ^ - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
% c# { j' } B1 { ? - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
/ O* H$ K- I# f! S - $mongo = new MongoClient('mongodb://localhost:27017');
+ u- g1 E$ D. U# @* q0 Y - $db = $mongo->mf;; j: Z& E( j; @8 f6 P
- $collection = $db->friend;
% R4 G& b3 D7 b3 E, N3 v d+ W - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);$ i3 e7 Y# `& |$ s e8 d6 B: `! \
- echo '<pre>';
" ~1 d# K7 j2 V# a9 {1 r# d4 G - print_r($res);
复制代码 四、数据删除 - //remove()2 [1 O4 V8 h& [ S9 s+ O& v
- //参数1:查询条件5 R6 ~) T. N( m% Y
- //参数2:扩展选项: R7 S/ X) Y" a& Z
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
( Y1 H3 i. R- |4 i7 \ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
; C9 s L/ T1 a" w% x1 s f% e. t - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
5 p" e: t/ `7 M, ~* c% Q - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
/ c& e* g( z1 s1 x& Y- v# m1 L - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
( g1 _% n& _0 p3 K% y - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
# g* K1 Y# M- G9 e% F( K+ e) A; b - $mongo = new MongoClient('mongodb://localhost:27017');8 V0 c0 ]) W2 W% X/ L: q
- $db = $mongo->mf;
3 p- Z% K9 ~* h0 U* t* N* R - $collection = $db->friend;( v+ B9 i7 u+ m0 R: R' z" {
- $res = $collection->remove(['First Name' => 'jet']);' e! _' o5 M$ u% r+ {6 c
- echo '<pre>';! w( ]# _: ? J9 C7 f4 W3 x, r
- print_r($res);//$res['n']表示删除了几个文档
复制代码
% B j$ D$ K6 U$ ^2 ~# E* L以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 : G2 B$ z3 m" k
-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- 0 q: X+ w d8 {, U* E# `: k0 k
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; w, q' i% c. h8 W' c- R
- $bulk = new MongoDB\Driver\BulkWrite;
8 U4 E( x; H$ p# S9 R( | - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
( K" g4 I# a/ @, t - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);- [4 O& i1 [* b2 v4 B7 ]9 Q/ l7 x
-
7 c% N. ?9 [" A i& i - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认- M) o8 F$ o3 i: p, T
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# o8 a" }3 u* M8 ]4 j T9 b8 x/ O
- echo '<pre>';
0 d8 T, U/ U+ y) \ - print_r($res);
复制代码
3 |. C1 h) z/ D" l数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
! M/ b8 u( ^7 o) I% s+ [ - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);' \% E' j J7 Q6 C
- $cursor = $manager->executeQuery('wjt.friend', $query);0 C3 }+ Z7 K3 P5 i# S. h
-
: d1 N: A0 e+ r& ? - $data = [];
' d, c7 Y/ s! f7 [: n - foreach($cursor as $doc) {" ?* P/ U: q9 [- ^2 h* v4 u* C
- $data[] = $doc;
$ X, c/ k! i- q% v* I - }
3 d6 W/ J' e9 x# { Q - echo '<pre>';
+ ~ M% e0 I( g1 V8 t! R/ p3 x - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
: A4 y. w0 M. x - $bulk = new MongoDB\Driver\BulkWrite;4 j6 K w" g5 G
- $bulk->update(
+ Z6 c/ L2 p2 B% p" C% K4 A* s - ['name' => 'JetWu5'],
& R5 z: s- ?1 B4 d4 \( K3 q - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
+ A- K! S2 R( W) B) ?9 D/ n, o - );
T, H' u' k4 Z4 U" c( Z9 ?3 V - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
0 e) E7 h$ W$ L7 j0 L - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
* x, u# E9 g4 a; X/ e - echo '<pre>';0 \( A" J# W g, X% g
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! W Q' u- m* k% O
- $bulk = new MongoDB\Driver\BulkWrite;
; {' [/ e( H+ z; ? - $bulk->delete(['name' => 'JetWu3']);: r8 }: v; u' `
- $bulk->delete(['name' => 'JetWu4']);
8 d) g" O3 m& U - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认( y2 E9 H$ [# t
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);' o, x; a5 K; Q. F+ ]' M
- echo '<pre>';
* K$ S8 H; Q/ b" ^- a8 @9 G - print_r($res);
复制代码
4 C) J. k/ }+ m" k' T
4 U5 k$ a, _1 v; c9 F: g' Z0 y; W
& a+ y6 ~) H8 p' s0 }, b8 Q0 l/ y- E. |- @/ t2 g
( g* J) G7 o% ?( I) {
|