|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()% H4 l5 h+ u3 L& s6 P7 {
- //参数1:一个数组或对象. Q0 s9 x. z( d; ?
- //参数2:扩展选项* i8 F4 @) T& J A# _
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
0 O' |8 C, ]: H$ L/ X - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
9 j' @5 f: }9 d. n r8 ?8 _" H6 u/ ~ - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
- `3 K" D" P* W9 s - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
/ l1 O) ?$ U4 _* V - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
& x; l% M6 k- E - $mongo = new MongoClient('mongodb://localhost:27017');! R/ b' c- U, u2 o% `" E. g7 R+ U
- $db = $mongo->mf;//选择数据库# e) _/ @' J' a5 A. i
- $collection = $db->friend;//选择文档集合
6 A$ s9 V1 T" @7 v - $doc = [//定义一个文档,即一个数组* G. V* x5 H0 W: |5 V/ L
- 'First Name' => 'Jet',
1 G! Q8 l K! g, d - 'Last Name' => 'Wu',
) e3 J. h2 F+ O( s' Y - 'Age' => 26,1 }6 o; `4 I7 |0 }7 z4 [
- 'Phone' => '110',
' X6 n* \$ a& N* C* Z - 'Address' => [4 }3 F+ I9 I+ D' H; p
- 'Country' => 'China',
7 {" ^/ Z" k6 s- X - 'City' => 'Shen Zhen'
" G8 w4 C* o' o" C8 E( {& N8 [8 @ - ],
9 ?# [2 n2 N' r2 Z+ u - 'E-Mail' => [2 j( Z- o" K: t v8 L7 I
- '123456@qq.com',9 p5 p0 ~5 Y( i' ~; y# K- Q
- '666666@sina.com',
/ _% J9 O+ n b K - '8888888@qq.com',
, E8 e% F/ f$ p! S3 v2 P - '77887788@qq.com'# [. D7 O: B: Z+ R7 V$ I: L
- ]9 ^! y6 t" C6 N7 K
- ];
6 n. G& Y3 \ g ?# F8 ^6 S i. q - $res = $collection->insert($doc);//向集合中插入一个文档
6 P8 v% M' f9 Q2 t. Q: g& T - echo '<pre>';
: M' Y. l+ ]) Z" F# Z - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
7 B8 g* g+ h2 A; r: ] - //参数1:搜索条件
& b# \1 q3 f- f# l1 L9 a" c, Q3 S - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
3 _7 D' T6 N# h( m% q {: q( ] - $mongo = new MongoClient('mongodb://localhost:27017'); Y- ^0 P4 s2 }$ v5 }8 d8 A
- $db = $mongo->mf;
, N3 @+ z) E: e8 I - $collection = $db->friend;; m& ~5 |; F0 d% I! A3 P
- $one = $collection->findOne(['First Name' => 'Jet']);
1 K1 a. Z# I, Z# }3 m - echo '<pre>';
* t5 q* ]6 \" o ~8 z - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()4 S, s7 R) M$ v2 T# k/ B
- //参数1:搜索条件, T0 A) d: _7 B7 a9 F
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
. n# @$ J# Y g( B3 `) U - $mongo = new MongoClient('mongodb://localhost:27017');
' Y4 f! q9 w9 e( m- w- ?: | - $db = $mongo->mf;
% a' `5 d6 |- z7 Z/ Q7 h - $collection = $db->friend;3 E- A# j7 d1 R% ?2 |
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素2 q$ o4 b: E0 J. B$ O
- echo '<pre>';
! Z7 X: {* {- u$ N d+ A - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档& S) b, N& v% C! V3 A) f
- print_r($doc);
2 R1 ~# R9 g/ c3 r2 m) F; E/ Z. _/ J - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
9 o8 ~& ~& n: Y; A4 F - $mongo = new MongoClient('mongodb://localhost:27017');
" G4 k; m' |* y) A! X, f - $db = $mongo->mf;$ J# D) e( ?7 N& \( V
- $collection = $db->friend;; u5 e1 s- O- Q' a6 |* ^
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
6 @: P; C) p; e9 N5 d! g# j# ^ - echo '<pre>';
8 z' @3 f- g% F2 p% j - while($doc = $cursor->getNext()) {7 i2 |( m- F* T$ |. t
- print_r($doc);- @8 F; O9 C' M) ~! K3 e
- }
复制代码 //查询某个字段的所有不重复的值- F* Z) O) p. q8 R4 b" u" @: ]
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
% l0 s( A8 x1 d b0 s - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);: [2 r( f; {6 ^$ P, H
-
- U- u) M7 H) \ - //$all:匹配多个值中所有值(用于数组字段查询)- Y: H2 U0 B& n) T
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
* v0 e9 Y2 a2 [ - 1 h3 u, a0 ^% k" k6 V' P# h# {# x
- //$or:或查询1 Z. V' l% }. F' G) D
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);2 a. e- ~0 H3 x9 U) X- ^2 }2 u
- $ o* P# A* Y X: l% Z1 V" ?
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
% q* T0 j* e" S& I0 i - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email7 @8 X' p" a. d+ |" M. x S+ i
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
, }4 K4 p. x, T7 ~ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
6 y/ P" H. B$ I! l; D -
: {/ k6 [: M2 S - //$exists:根据某个字段是否有设置值进行查询# Z& @! c% l3 z" D9 w6 ~
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档" |1 j7 \" i* s$ `% j
-
0 x5 r! w" c0 i# y% ` - //正则表达式查询
0 [0 Q+ J" S/ I+ k( y - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序% H$ j* F! g: X9 Q$ y: J& H; f$ G( T
- $cursor->sort(['Age' => 1]);
j& |# O8 Y3 r" p -
. |0 d8 z8 ?0 F" P. u0 Q - //忽略前n个匹配的文档4 X: y2 |( c& ~2 S1 l& S/ @+ [
- $cursor->skip(1);: D# y/ I7 v9 `: o; t
- ( Z2 l1 l1 q8 [ W7 p) t6 i8 R7 x
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)6 D' F! e2 U/ E' M
- $cursor->limit(1);
: c- b# |( b2 B/ O3 S0 ?, I - 5 ~$ k2 M: |( H% i
- //匹配文档的总数" N+ V+ m! \2 Y: U- C
- $cursor->count();- H# \' {' t: Z4 ~
- 4 q. K. M/ W/ u) \: G: h
- //指定查询索引/ m7 k3 P! q! a; c+ b8 H
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
7 E: _* ]: o! V, z) |7 e - $mongo = new MongoClient('mongodb://localhost:27017');3 T% Y7 g& P. j9 e5 X: b
- $db = $mongo->mf;/ m: r. N5 \* O/ Z/ F& X
- $collection = $db->friend;
2 a: ?; m- V! }0 Y - $res = $collection->aggregate([
/ n2 u+ X' E9 Q% O: n+ z! k' ? - '$group' => [- `% a6 H) b' Q! n7 ?
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
( \9 c! @: K- c$ j% [: L& E - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
* O6 \/ n" i5 k/ ^4 l2 B - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值9 v! J4 b& Z: B$ x5 ]! a
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值$ q+ o" o/ i" H" o) } i
- ]( ?. O/ m/ n" A) e7 P
- ]);
. H' d, m5 r/ [; R" e. ` - echo '<pre>';6 [2 F; ?. h; C( C( X! E! D8 T
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果; \9 k2 @* V- w
-
" L: f2 b7 i2 s: C# m" i -
; y4 e7 T6 _! G- ^ - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
. F) C3 S6 ~1 F) E* V p( a - //聚合查询中的所有操作,包括'$group'在内,都是可选的。% W( d! P7 u& ]
- $mongo = new MongoClient('mongodb://localhost:27017');
2 D" o* M+ o0 P3 A/ K - $db = $mongo->mf;
& d; u! [) Z' s) M* K0 V% J. g - $collection = $db->friend; e& S: l" \1 c0 `9 M% N n
- $res = $collection->aggregate([' s% |) r' u4 V# }
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
$ d+ }- q% @3 y - '$match' => ['Age' => ['$gt' => 30]]
5 D8 a1 r7 M3 }* T8 q+ Q( j - ]," _& ]" r/ m7 Q, J0 t' X
- [//指定分组字段、统计字段
+ _, A0 \, o6 v6 U! V" [8 \ - '$group' => [
1 x& F4 I3 S0 R2 E - '_id' => '$Address.Country'," q# u a2 f3 t9 j9 |/ c! P
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
3 H$ U( V% W, [9 k7 L - ]
3 j! F; B3 N/ q! d - ],
! |1 S0 M/ v! U* f5 U) [ - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
6 i4 c& o6 Q9 p% e# a6 E+ z' v3 v - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。% r, ?5 A2 g! Y8 Q# w8 Q& K U
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名# @1 y# d' Q% e9 k3 z, T
- ['$skip' => 2],//跳过指定数量的文档! m: X% j" O- r
- ['$limit' => 2],//只返回指定数量的文档
/ a6 m8 L9 p; g2 O! M - ['$sort' => ['totalAge' => 1]]//排序
: R: j8 u7 H$ ^7 T' f% h - ]);
2 f4 Z* o1 `& O7 e( w( e - echo '<pre>';
* p, N9 L8 H" g! [9 g) N6 Q5 [ - print_r($res);
复制代码 # D5 H# D b+ Q" r& d
三、数据修改 - //update()5 h) E/ N; t4 G0 M/ g% C; |
- //参数1:更新条件,指定更新的目标对象。
$ W5 k' V# w: Y! R9 o - //参数2:指定用于更新匹配记录的对象。% k; z F) H3 L4 p( \/ h# G3 Y( p# e! _
- //参数3:扩展选项组。3 O3 y! R# {& }7 n6 P
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
. H1 U/ }. @. D) a; M* E( C - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
* g' \" d5 O% g: R - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。1 `; `5 c4 r7 {
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
' K8 f/ ^$ n0 n* Q7 h& e - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
) o5 Z5 j) [/ l* B* V9 _7 W8 O - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
7 h e0 \* {! d4 Y' x - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
: J0 ]/ \$ x2 z7 r2 u; S - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
! g2 q. ]% ? x l2 A) J4 Z8 p - $ y U* q. H- ?- Q; ~0 j0 R
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
1 [* H' O0 r3 y% t - $mongo = new MongoClient('mongodb://localhost:27017');7 a, t8 Z" M- u5 z
- $db = $mongo->mf;
0 \( ?: u" ~) O8 v8 {- D2 { - $collection = $db->friend;
1 H! z! F1 ?& O9 h - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);& @! j) K% Z6 A& |/ c
- echo '<pre>';
# p: w( s7 r4 h( |3 R - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量6 [0 C- g9 X9 b+ }2 ~2 Z
-
0 w! u/ e6 v! B( |! [+ X" p - //$set:重置特定键的值,若字段不存在则新建字段并赋值
# W) W9 C2 H) J - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
- S/ P7 @1 K; G* T -
$ m# ~1 q' A! G - //$unset:删除字段# Z1 F6 A! S' f; A
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
: ^& l; W' }" C" F - 0 k- e/ K6 c7 S( @
- //$rename:重命名字段,若字段不存在则不进行任何操作
3 j4 y2 d. p+ k) Y; G4 F - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
, ^+ K7 M# y. \ - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
' i( g: k, X4 m+ Q# `, a# W - # w- x6 J/ X6 u& s
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
; M1 g# a$ B) e5 @, o. R5 a- G - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);4 g$ w$ r7 s' K: a' {" `! D1 y
-
% t% f/ c8 d. k6 ^' w - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
4 U2 d' t( r8 P+ b& M7 A - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);! y8 J1 C' z [ P
-
9 W, k! o' X) R: ?* F6 f( w - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, L$ C' X2 Z; v; y4 g; p
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
$ k" }2 M0 }% t -
9 ?/ W, \2 |& f, x8 E - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
( _" d! K6 o' `/ U- H - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);9 D& }; D) N0 Z+ d
-
6 q% H5 e0 |" W$ j - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 w4 p( D, F2 w4 q7 h/ n
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
5 E4 h4 W7 G: m2 U - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);, p3 l6 j" Y0 Z0 j! L8 b
- + t/ N% a: {8 e z4 D z5 o8 I
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)1 L: [6 R1 K5 ]
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);' K; N. O$ O: {& A; h
-
0 m0 y+ c" x5 z - //$pull:删除数组中所有指定值1 w, R5 X2 {( h: |* a; c& |
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);/ V; K& A4 s6 F' |5 h# t
-
5 ^# ?8 n x+ M3 \ - //$pullAll:删除数组中多个元素的所有值
/ U! N0 N. W# T - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
2 D$ `9 g; @6 J$ `4 ]! }2 C2 J - //参数1:希望保存的信息数组$ C! P% M8 {+ N ]
- //参数2:扩展选项$ c2 O( I. _( n1 l- ^4 q
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ v7 D0 ]7 w1 [# d6 ]/ t, J
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
4 I5 c) a) T; ?# d. j6 G - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
( d A H) u. N9 Y: A- [5 ^$ _4 X - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 x" c0 d8 U5 I# o- s `+ }3 t
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 K6 A9 j8 C# C. `! s2 x. a
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。6 j9 X/ w$ S/ Z5 V' D* U
- //若想更新则应该在参数1中指定_id键的值。
2 P/ F8 e# I% B# V! g5 J# X3 h - $mongo = new MongoClient('mongodb://localhost:27017');- T% ?# `& h/ N. T' h! Z
- $db = $mongo->mf;" Q+ g" w H- b3 j. U
- $collection = $db->friend;
9 q& X/ q' m/ f - $doc = [//定义一个文档,即一个数组
2 g5 z6 A& e _+ I) V! W' Y - 'First Name' => 'Jet',2 ^* J# B1 C7 K4 u, g; h. C3 [
- 'Last Name' => 'Wu',
- z( I" Y' J2 n; ]! O' A - 'Age' => 26,
+ X! Y7 \4 S' p3 P+ B8 n - 'Phone' => '110',
( D" l4 D: R9 B - 'Address' => [
3 k+ K$ |% a; s N - 'Country' => 'China',
2 a, x5 Y8 a# {9 O - 'City' => 'Shen Zhen'- G9 K0 D8 J' c' V- B6 s
- ],
' ], J M9 Q- b; @" e - 'E-Mail' => [
8 Z. w% b4 |/ T - '123456@qq.com',+ d: v$ Z d' D
- '666666@sina.com',
5 @- N g2 e8 ^2 S2 O# m" f - '8888888@qq.com',
: q$ @& ?! |2 Z# a - '77887788@qq.com'2 m# c% f1 ~$ I
- ]
4 ~8 i* o, Z8 m; ]% r - ];
, h. x/ K2 Q$ t5 i2 o - $res = $collection->save($doc);/ \. j1 [8 n% E1 Z$ P0 e$ G* `
- echo '<pre>';
! O* z, U7 N4 C: P9 e2 @) b - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入; n& ?2 P0 {" x9 |
- ! E+ `5 s# h7 T. H
复制代码- //findAndModify()/ q/ l2 p! R2 G: ~6 S
- //参数1:指定查询条件
7 Z9 I# y d% l8 U6 f5 \ - //参数2:指定用于更新文档的信息0 t6 p1 G0 V, S4 b
- //参数3:可选,指定希望返回的字段
+ \* f4 S# z5 s- F* m - //参数4:扩展选项6 c& J0 q7 A0 X+ y3 k
- // sort:以特定顺序对匹配文档进行排序# p( H/ S! |$ J/ E" C
- // remove:若设置为true,第一个匹配文档将被删除, `" m5 M3 E: \# e1 F$ i
- // update:若设置为true,将在被选择的文档上执行更新操作, P2 y9 a, r/ Z+ ~' E2 x7 E
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
. q1 O& [4 `* b# N3 f - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档- [2 R9 w9 I7 v
- $mongo = new MongoClient('mongodb://localhost:27017');
1 X. F: h$ k4 w: C# G4 M& I' I - $db = $mongo->mf;
* [* B9 {5 z" ^- E2 }& o n - $collection = $db->friend;: i( g8 [8 O- I8 B9 i6 F' K# Z+ L
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
% l/ ]4 c) R d5 i8 h5 e - echo '<pre>';
) b+ N8 p( w7 [) |" ` - print_r($res);
复制代码 四、数据删除 - //remove()9 q& q/ H V) s; e$ s; {1 r6 a: F
- //参数1:查询条件
) N6 t7 T' z" Y& v4 x* h# `8 y - //参数2:扩展选项5 g8 p0 U$ C$ f) F9 ]
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除2 g6 R; |9 V }3 B
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
# G% T2 }9 n7 |6 z% j- t" K+ y - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
) j4 l, |( M) y, N: |+ b, ?/ N. x& w - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) j9 r% d5 L4 l0 t3 k% N" U/ I
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ j: E) V5 N. H6 p$ {* E - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
8 ]8 K6 l: o& G. |7 Y6 E. A - $mongo = new MongoClient('mongodb://localhost:27017');' y6 J- |( l( J# ?: l& _
- $db = $mongo->mf;. z3 p+ X1 t7 a) Q, T$ s
- $collection = $db->friend;* ?, Q# Q- b& ?" {3 c6 Z
- $res = $collection->remove(['First Name' => 'jet']);
$ d6 r' [7 b3 L" r2 @$ {# B+ d* y9 { - echo '<pre>';
7 L7 V0 G* N- ^+ x+ A | - print_r($res);//$res['n']表示删除了几个文档
复制代码
& g# \9 s5 s; F5 h O" B以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
% l7 X* s! h/ w0 K4 Y-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
% M1 c. ]$ z4 O. f) R数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# @8 I( B2 }! `% `
- $bulk = new MongoDB\Driver\BulkWrite;( I" k9 b8 Y, a0 [
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
/ X3 y% t! V, ^7 m$ B. H1 U - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
' ]+ j [" o% I7 O1 a3 ^+ K8 |& { - " h3 {! S; j% F3 a9 o
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
' ?& ^* t0 p) g! Q+ `9 c - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ e ^# u5 J6 G2 C# [0 M4 K
- echo '<pre>';3 B, o; `8 C' M w0 N& {8 o
- print_r($res);
复制代码
8 [: c! t# p" j6 l数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');5 W/ @( J# v+ A8 s7 E
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
6 T# w/ h- J: y6 }% w, } - $cursor = $manager->executeQuery('wjt.friend', $query);
- o0 t3 C3 L5 S" Z7 t -
" Q D8 E- [ N7 @ - $data = [];
7 y3 K, |/ j @5 J3 t" C: j8 c. I - foreach($cursor as $doc) {- t" I( E5 ]( q5 w! F( \7 J c$ l" p7 Y
- $data[] = $doc;
4 ^1 _& g H9 _9 a# ]) X8 O: f - }% U0 Y# P$ K" d
- echo '<pre>';
7 L R4 N! k1 p: X - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
# Y; [: ]3 U4 Q9 W& w s6 ]( u - $bulk = new MongoDB\Driver\BulkWrite;
6 ^% \4 v7 m2 c; v$ J1 c _5 [1 D9 [6 @ - $bulk->update(
8 e w9 V+ H* f8 ~1 {; T+ \& ^! M5 y - ['name' => 'JetWu5'],( P- \+ y( E; \' ]+ A2 p
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]$ _2 S6 v4 ^) a: d, s
- );
8 R' |) w8 ]! U/ k8 X, d - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
1 G* k3 T) M) X5 Q - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
* B; w; Y/ B2 ~% ^' C - echo '<pre>';# g% |9 q& }4 q! D
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
9 J0 h1 x4 M, U3 S - $bulk = new MongoDB\Driver\BulkWrite;2 r: K$ J5 l$ M1 Y1 p
- $bulk->delete(['name' => 'JetWu3']);
& O& k7 M' \, f - $bulk->delete(['name' => 'JetWu4']);
( }1 x" n @2 e: m2 }, n* e - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
% w# q! J y. W8 h# u - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
' T5 O4 v6 m3 B- }7 Z - echo '<pre>';
2 h& D0 b+ l$ u0 C# O - print_r($res);
复制代码 / L( _# s |7 c$ j& ~
8 i* F/ d" P9 `* G3 @0 B1 {- F# Q6 \( l6 i
. B. Y- n+ k7 Z) q' q/ [
' c" ~9 ^0 ?! Q) w: K
|