|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
; L% C) t( i7 H! m* a0 h - //参数1:一个数组或对象 L; k9 v* c) p2 v7 |, u$ w: \$ w' L$ a
- //参数2:扩展选项" M( e& a& k( C! O2 G
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
1 o7 t: N* i5 K3 H1 w& a1 k2 ? - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
- ]8 c$ p! E1 D; ~: S: C( q' a - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认2 n% e! t) W/ h8 R7 {' N) L
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
2 T0 S" h0 D( `9 ?/ r5 @ - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒), N$ r; o3 C( w# t* U2 ~: _1 P
- $mongo = new MongoClient('mongodb://localhost:27017');
+ c; _ Y. F8 M - $db = $mongo->mf;//选择数据库
) Y, D+ b& \+ J5 t) y! ]. n4 } - $collection = $db->friend;//选择文档集合8 w8 w2 x4 [# Q0 m) Y
- $doc = [//定义一个文档,即一个数组
8 }$ F/ @+ h& }$ W - 'First Name' => 'Jet',% R3 H( ?+ t& C- ?. e7 M
- 'Last Name' => 'Wu',
8 A# O2 f2 _, ?) K - 'Age' => 26,% |3 T1 M4 Z- Q
- 'Phone' => '110',
+ X6 n2 ?; j: F - 'Address' => [
8 @% e! _# m/ y/ _ - 'Country' => 'China',
" C! L" e. u+ e - 'City' => 'Shen Zhen'
. [3 o8 z2 p1 N' J/ t - ],! X; i O6 D: B
- 'E-Mail' => [- @" C, I9 s, F6 F) W& k0 p' F
- '123456@qq.com',
7 J9 M8 g/ `4 V - '666666@sina.com',
( Q: ?, w8 @3 l4 v - '8888888@qq.com',- p7 F9 P* t. K8 M8 Z
- '77887788@qq.com'
& {" w8 r3 `/ P6 L - ]/ ~/ ~7 e( g6 m+ t# G
- ];/ w+ ^8 n$ E, Q) a0 U F% v' t
- $res = $collection->insert($doc);//向集合中插入一个文档
' H$ ]; X. P* F' x7 C - echo '<pre>';' h& g2 F) ^) z! i
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()/ S0 J" m9 n# _6 n( v
- //参数1:搜索条件
- j! j n; C; {3 i0 g - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段% q. N8 f7 [7 p$ J2 l' ]- U
- $mongo = new MongoClient('mongodb://localhost:27017');7 q1 r$ q( w8 V& G
- $db = $mongo->mf;
% V+ h; ~% {5 t - $collection = $db->friend;
# o1 C7 [$ u$ r; E* x4 L - $one = $collection->findOne(['First Name' => 'Jet']);7 C/ v O; s# x! C% |/ V# |
- echo '<pre>';" V6 D, I7 n/ a# V+ [0 M" C( ?
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()6 {- M" y S) p/ d( i. E7 b. d
- //参数1:搜索条件2 b) k' B2 a( c% I& X% j
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段4 s2 }% J' l; i% w
- $mongo = new MongoClient('mongodb://localhost:27017');8 J# {: v6 L& x" A
- $db = $mongo->mf;; R. K$ J0 R. x- B# k' A
- $collection = $db->friend;: O H$ ~- V, e! E0 g. A
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
' h2 M6 f( l/ l - echo '<pre>';; t# w6 ]1 V. S# R, L0 D
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档 R' _0 l1 a+ K s8 @; C9 p/ b
- print_r($doc);
4 K$ B; \# y3 }! h - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' S9 k1 p# K* B% W- c' f) i
- $mongo = new MongoClient('mongodb://localhost:27017');4 W! b5 G' d: o9 J- ]) Q+ Z. ^
- $db = $mongo->mf;
1 Q5 D% k c7 _/ l/ j/ I - $collection = $db->friend;3 s W6 z$ i/ Z3 `) H
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);0 ~$ l& D( g- X/ ^4 B3 s& a* E3 v
- echo '<pre>';: l+ O1 l1 l4 b* @. @4 Y
- while($doc = $cursor->getNext()) {
; D: a# v$ y8 P6 h" q( o. \ - print_r($doc);$ Y5 }- z2 G- j% J
- }
复制代码 //查询某个字段的所有不重复的值
1 U' L" F! j; P& @ $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
9 H1 ^, Y( d2 q# w0 q! A+ } - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
3 ^0 k- t/ I1 I6 j) g+ f -
% j+ y. }3 ?$ M/ ]5 c8 X - //$all:匹配多个值中所有值(用于数组字段查询). I4 n( I q& y8 g i2 z+ X. w& c) V. ]
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);$ |2 u" T! {3 y+ B
- 4 m9 ^: j' }( |% c$ v7 r
- //$or:或查询
" T L; M7 n1 {% P - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
. e* z" p. }7 _ - ; J9 }- i g; E
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* v. I0 w: G: @% Z4 A' f
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email0 e- P5 q9 I6 F& C" Q: ~1 _& j U
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email! ^% e1 D! W6 H' I4 b: V
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个1 K* O0 l9 v# v) q5 o/ }2 n
-
. v5 c7 ?$ }3 S* C( _: S# S - //$exists:根据某个字段是否有设置值进行查询7 ?. G3 s: V8 n; J8 T/ K
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档& {% w( X4 N ]1 @( {
- # X3 B* s4 o' Y! w" |0 L
- //正则表达式查询
?# X8 f' ~7 }& j, k - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序; v6 M$ h, ^0 v2 Y1 m& y
- $cursor->sort(['Age' => 1]);
; E& \- E5 V! v/ J% N: Z7 h7 s -
6 Z" i# V& n7 A! l - //忽略前n个匹配的文档, N% ^) R4 T$ ]: |4 z
- $cursor->skip(1);' \; Z2 j- }, A) c' x$ z) I
-
- f2 g, ]1 i7 ~& l; a6 i+ P - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
# ^' G1 [$ ^+ T9 Z - $cursor->limit(1);; y @# g! S+ V/ e* B. I, C9 k9 V
- 9 i/ G, w/ |& j0 S& u" d; y
- //匹配文档的总数
' l6 d/ f# j- x0 C6 s - $cursor->count();$ O# B; u% A8 [4 [$ _
-
# o. i) Y7 G: ^ - //指定查询索引
" O9 M' `" \0 {* Z7 A- m6 D1 N: G - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计$ y( F0 t; w" @1 ]0 m6 L, N: S
- $mongo = new MongoClient('mongodb://localhost:27017');
% w: t' G J- N; |: G$ v" l i - $db = $mongo->mf;
7 W' O4 p+ F0 X0 P; s5 i, N4 S - $collection = $db->friend;
# B. B' g8 @& p6 ^/ H- F - $res = $collection->aggregate([% A, z8 V5 r: V& F& s' g" r' J
- '$group' => [' w3 b4 a! m* e% A7 c
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组. U3 y P/ L. @( G B0 d$ |
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1# q$ r, |0 U. s" m% t# N4 t
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值, \! |" b1 f3 e- g9 s3 G* J
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值5 [) s7 a& X) H3 Y# b% L+ d6 R
- ]
/ O3 x+ ?, s3 ?- u6 U* I0 J" v+ X - ]);6 B3 s; T; p& X" K$ }
- echo '<pre>';
( y: b' V! k- g - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果; f7 E& w1 j$ K
-
$ ?6 U! \. u$ }2 v: m -
) k! q! z1 Z" e/ \4 { - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
3 I1 n% X0 i: B9 }' W2 h# f - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
& v2 k9 h# Z1 l* d - $mongo = new MongoClient('mongodb://localhost:27017');: d1 o/ D3 j* u( |
- $db = $mongo->mf;
' ~- t, N" n. e; ~* a - $collection = $db->friend;/ P4 m& i' [+ v7 W- S+ ? u
- $res = $collection->aggregate([5 {, t% Z5 f6 G3 b1 K V& p F4 r
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
0 p! L8 L4 R$ [5 Z, W- P. Z+ C3 c - '$match' => ['Age' => ['$gt' => 30]]/ A& R9 n5 _+ |3 Z# h1 p
- ],/ [- q% C; X0 s# [9 ~
- [//指定分组字段、统计字段
, _2 f& x1 s& d! B \. u5 ] - '$group' => [
( r" c- t' L1 I" A8 a2 W - '_id' => '$Address.Country',( V$ B4 x+ e. }: V" V$ z
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
; {& q F- I+ Q2 k5 u: z - ]
4 I) ?" r3 W$ F; R8 P8 t4 y6 s, Q - ],$ I/ S) X1 P' y1 u
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
1 N4 ^; z! A- c0 V& | - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
* s' p3 [0 m* r- c) a9 K - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名0 F2 d$ X+ A: x1 x9 k
- ['$skip' => 2],//跳过指定数量的文档
4 G" y, w3 `! h% L9 g2 }+ t - ['$limit' => 2],//只返回指定数量的文档
' \: X- j! U( o$ Z \ - ['$sort' => ['totalAge' => 1]]//排序( |- u9 `; j. S' I# @! A0 Y- B
- ]);
/ m& I+ q, I+ ?6 V - echo '<pre>';& A+ B, k0 S, e2 F! Z: t3 t
- print_r($res);
复制代码
* l- W( F, ^$ s+ \$ R2 }/ ~( w7 o三、数据修改 - //update()
2 z' P0 f, r ` - //参数1:更新条件,指定更新的目标对象。( ?: R5 W( y5 c. Y ]+ u8 g5 \
- //参数2:指定用于更新匹配记录的对象。+ O% n( Q( c! {% z V
- //参数3:扩展选项组。" p- \1 R8 l: B1 ?/ u) @5 |3 [. K% p
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
* G2 F6 c' A, ]. A" k" w! Y% g - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
4 o3 E6 e4 L6 g* y x5 @7 A - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) Q+ h" |. h% e- f
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
/ a7 L* |; u! ~! s5 m* \* e( ] - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 H0 }) g. j0 I) Q
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
1 a8 I R' @# h6 C; n( w; b% [: M: W3 b - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
1 ?, Y% `1 {% ?9 i( |5 X - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
7 `, ?$ x' ~- s$ l8 D3 [5 i! t -
; {: }8 s' h. M2 r- h - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
5 I: `" w3 T" i i5 C - $mongo = new MongoClient('mongodb://localhost:27017');5 B4 J9 U' W; ~6 N" D
- $db = $mongo->mf;
7 [- X. m7 g+ M- y - $collection = $db->friend;
m4 p. O- w. Y9 {# l8 w - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);1 I& v6 j U- g6 O
- echo '<pre>';
/ Q( x& w T. v! X* Z - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
) z+ X7 j V3 z* [0 M" {+ S n4 O - ! n. E, D/ g7 x( k2 |5 h0 F
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
3 M9 @$ [, I; V7 A; ~1 E# u: x" I - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);/ W0 q' c3 H! v I0 l/ b) p! K
- ) g4 D J* R2 ?( y
- //$unset:删除字段0 r8 d- s. f) p1 m. y# ]
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);1 | M2 h* P% t% Q0 U
- ! w" B; ^ U4 C p% A! g3 O/ F
- //$rename:重命名字段,若字段不存在则不进行任何操作! `6 a+ F9 ^) M: C9 c
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);1 l9 K5 U( h" S G7 P" X. f) c
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。! k4 H. J1 }! n
-
, f9 |1 m5 K3 M% p% A" `3 F - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的- k" y0 T1 l4 d7 K. J" Q/ n
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);4 V o* u' u3 T4 r' R
-
8 { s4 y# v8 E' `4 ` - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
+ L4 {5 h7 p6 M8 d% t8 T- m2 A! I" _2 | - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
+ Z1 h6 @4 D- L0 V -
+ H5 A" h; P" C9 Q* d; `- z9 Y - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# V6 W7 @0 {4 E
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);5 c2 R& J6 t" {# ?
- 0 ]$ i$ k. ~& r& v
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 v' I8 V; ~" t - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);2 T1 _( \ h4 ^& B: \# q. a: n8 Q, x/ p
-
8 X) G: l0 g& p' q6 `) U y/ ]" W - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
7 x( Y4 H% V( O4 z - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
! s/ `& y T5 x. v - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
; }* H1 ~) P2 P' M( N -
; ~; {6 z9 m$ O1 }% X! i5 k - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
, h7 B( D; R+ s! |+ ]- Q; J% p - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);8 f; q5 B" t' P c
-
' m7 @/ D$ W" s) O) _( j% \ - //$pull:删除数组中所有指定值/ l# Q. E0 ?9 j( J/ g8 d
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);; s4 b c- q0 F7 D
-
3 O+ T9 z& q) r; p - //$pullAll:删除数组中多个元素的所有值, m2 b# \+ B- q4 h1 F5 _
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
* e8 V- ?7 E3 t7 C3 A3 ~& L - //参数1:希望保存的信息数组8 S9 W- p2 A: r) s! I. V# F/ z t
- //参数2:扩展选项
' b; `: h0 I8 S/ H" D, S1 O - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
: z Z9 K( u6 b$ Y" O2 o' b- @ - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 x$ M+ u' M w7 f* O. b
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- A% g3 H, p- t4 c# a7 @
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
: p& v4 _/ V" T - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒). f% A0 R' y- e
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。9 ?: ]4 k0 }' [( E' f$ k9 [
- //若想更新则应该在参数1中指定_id键的值。
0 x. r% i; ?" p3 s - $mongo = new MongoClient('mongodb://localhost:27017');
) Y# U5 I% h! e k' X - $db = $mongo->mf;
8 M! P; C1 o) H8 U. D - $collection = $db->friend;
) m, z1 o* y# ~4 R0 c - $doc = [//定义一个文档,即一个数组 L% s! @8 v5 T% i( Z& j: P
- 'First Name' => 'Jet',0 k; v# [4 s1 f. b% A
- 'Last Name' => 'Wu',
, P- ]: M8 N; n - 'Age' => 26,
9 i+ Y/ o' R# t$ D+ n - 'Phone' => '110',0 s \: h) _. e" T6 d
- 'Address' => [9 d$ I) u( I6 ~$ N" n# U; s
- 'Country' => 'China',, z+ R+ u6 J4 _8 y
- 'City' => 'Shen Zhen'5 ^+ O* H4 O5 ?7 ]' Z4 {
- ],2 u$ C( w4 X5 w+ h/ M
- 'E-Mail' => [
3 D8 O9 C b0 ?% u. v" M - '123456@qq.com',
( t8 y( `# g- j# a - '666666@sina.com', j1 Q( n; Z. c" b8 Q
- '8888888@qq.com',
) v# Q* S% E, f- i" ]7 K! J) E: W - '77887788@qq.com'7 U& K) k5 @0 J1 @/ H6 L' r
- ]
8 V4 m* `: O! I7 x0 P" P" T' h - ];
& j( S$ W; |3 c- z6 B - $res = $collection->save($doc);
% R; B) E, g- \! w - echo '<pre>';
+ w2 u) Y2 r {. d - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入) A1 e1 r) [7 N, L* ?% ]/ C: b
- 7 C) H3 V! ] ^9 y* m
复制代码- //findAndModify()* s7 ^- X- S2 C7 N" Q j
- //参数1:指定查询条件: p1 J1 V! S* ~* W1 k( ~ ?$ \6 n$ h
- //参数2:指定用于更新文档的信息5 z7 Y* z, t' P: a: o$ r
- //参数3:可选,指定希望返回的字段8 b$ D0 H( v) ^# b. T; M
- //参数4:扩展选项
6 z% i' l0 q3 f4 x' f - // sort:以特定顺序对匹配文档进行排序% G( x$ y2 g5 y8 Z5 S
- // remove:若设置为true,第一个匹配文档将被删除* S: a$ L% [; `. J% C0 o" g( j
- // update:若设置为true,将在被选择的文档上执行更新操作: t5 a2 W; d' E$ p
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
: K8 k5 n* T+ I( Q# y: q - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档. B( P, b$ c) X
- $mongo = new MongoClient('mongodb://localhost:27017');
0 B; n7 J9 b/ a) c& J ? - $db = $mongo->mf;
3 J* Z( b+ V' z: S1 V7 E' F. z" ^ - $collection = $db->friend;+ T7 S5 j& l% C$ v! m7 U) H
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);+ X) p# g0 E6 V7 e, p
- echo '<pre>';: o0 ` k. O' C L# H+ n
- print_r($res);
复制代码 四、数据删除 - //remove()6 s( W# G: |- s3 E; C' ]. {! B6 q/ t
- //参数1:查询条件
! i8 F5 b- _6 s: t: N- u, e9 }1 b - //参数2:扩展选项7 [, j, d: F, w j8 `
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
" c: D6 N3 B; m8 d" F8 t, o - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。# _5 N2 d1 A9 T+ _& A
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作5 ]% C6 }: @0 H# i% M: E& b" O! C
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ y) G8 p( h; @! h7 C9 s
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
* L1 \2 v5 c. x4 s s - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒) j9 ]: t% @% P. n' u
- $mongo = new MongoClient('mongodb://localhost:27017');
3 R& g3 o. W# ]$ `5 g - $db = $mongo->mf;
9 u D- C: c/ j - $collection = $db->friend;( P* p. ?$ \3 z u
- $res = $collection->remove(['First Name' => 'jet']);
3 v% s+ `+ _& \8 d5 i4 O - echo '<pre>';
b2 Z; ~/ z, N - print_r($res);//$res['n']表示删除了几个文档
复制代码 _ M5 V9 l7 n @! @. v: M
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
8 k5 s* v1 N; G* c( x( b) Q-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- + S. F- F7 d% `4 M2 i
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
7 r. n8 l% L1 |0 Z2 x6 S( E; _8 W8 X4 A - $bulk = new MongoDB\Driver\BulkWrite;
: a1 [: }- m/ f4 X3 N- J0 Z+ ` - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
4 m6 G6 Y" F2 ^9 s2 q! j( H - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
% ~8 b1 w2 Z. H$ O& d - 6 I: M3 Y3 ]' I$ ^; _- {
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
! Z \: A" }% Q - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
& Q* m( G0 l, V) _( K; [: j - echo '<pre>';
- x/ H4 k5 s5 k/ a - print_r($res);
复制代码
+ O$ Y/ ` n1 w4 E+ u6 m. a! l# I数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
6 C& e" B* H M `6 m7 g! g - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
) d- h' H, q1 r4 {3 Z3 H - $cursor = $manager->executeQuery('wjt.friend', $query);
" D1 U5 m, J2 G, I8 ^( o0 \' l6 ? - " W- v5 _8 _/ _1 r+ B
- $data = [];# a( i- @7 O3 r2 _ E
- foreach($cursor as $doc) {
. {+ @$ o9 ?1 F8 `& K - $data[] = $doc;2 o. L) Q0 P$ O) Q8 x, v
- }
0 x+ J8 s) m+ _ - echo '<pre>';2 _- T: O2 k( m% I+ t ^
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# L0 s R8 H$ p# Q
- $bulk = new MongoDB\Driver\BulkWrite;# i5 w. z9 ?& g1 f8 \/ v
- $bulk->update(. V! M- s* W& r0 B, @
- ['name' => 'JetWu5'],
7 ~+ }6 }0 ]% V( {' w - ['$set' => ['age' => 30, 'promise' => 'always smile!']]# Y1 R( f' T% j2 A. e
- );! j2 Y5 p% S' W
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认# s! A2 w1 j& F1 K9 p' }
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);0 z; ], n4 A P+ t
- echo '<pre>';
8 R' K+ @: A7 T9 d; o1 o - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 Y+ w3 q. Q& [4 w* s2 m) B
- $bulk = new MongoDB\Driver\BulkWrite;% s. o' n( ~1 d
- $bulk->delete(['name' => 'JetWu3']);: x1 C7 x* Y% P4 h3 @
- $bulk->delete(['name' => 'JetWu4']);3 M( g7 B8 r% N+ _7 s* k8 m
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ S5 c) {$ ?- g0 i2 I+ E5 x5 w
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
8 R* { _, _/ ~" A8 }2 k - echo '<pre>';
M1 Z& ? B5 a& D5 H" ~" q - print_r($res);
复制代码
& i7 b# B* I5 x. c: Y) [. P' h0 y2 y
" W# r9 t; v \: i
8 X: S' U" e+ o( R2 r
' r/ o& E, Y9 G- c3 v+ i# l$ |
|