MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()6 U+ K8 G4 g7 ~( u; e) ?7 I. F# u
- //参数1:一个数组或对象* z4 ?. ^% w) E. S# m! {
- //参数2:扩展选项
9 F& c; E7 M$ ~+ `# M7 v - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
; }* A0 b5 ~% V# e - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志2 l# ?( D" y1 u" y4 {8 ]# [8 q
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
* h& ^5 f, s8 t; f& ^6 x - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间% [9 U& u% W5 u; ]; J( i
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
" n( E+ e* a" u0 Y7 @% j - $mongo = new MongoClient('mongodb://localhost:27017');
9 ]& e6 L* i9 ^7 d$ Z3 H - $db = $mongo->mf;//选择数据库
}: J" v6 T# n% } - $collection = $db->friend;//选择文档集合
E# k m* f4 c5 w8 g; j* S4 g - $doc = [//定义一个文档,即一个数组
+ Q$ b' h# Z6 S2 \6 F$ m - 'First Name' => 'Jet',
" l3 U- Q, p. ]+ Q - 'Last Name' => 'Wu',/ g k8 d! B3 J: s @/ w4 ]8 M
- 'Age' => 26,
8 y3 n i j+ k2 g/ j0 \ - 'Phone' => '110',% E9 g$ t( d3 E v# X6 t
- 'Address' => [
$ _2 b5 } W. T2 ? - 'Country' => 'China',
. m1 o" ~' V6 F6 ]& x! B: H/ C - 'City' => 'Shen Zhen'1 M& f# ]6 K& Y% d1 y" `$ L
- ],3 x' {4 ]2 a7 z9 u3 u6 z
- 'E-Mail' => [
0 M3 ^4 M/ Q3 _ T - '123456@qq.com',
! j, C2 ?$ S0 j1 L) F9 K# ? - '666666@sina.com',* X4 n \" ~0 r9 N6 Q7 K
- '8888888@qq.com'," G6 q9 @5 t9 s3 _/ X& t
- '77887788@qq.com'
/ p( L+ A) z; p5 v; u: [7 F; { - ]5 e- P$ {. }. l s% d: c
- ];( B& b+ |( A- @4 L9 N
- $res = $collection->insert($doc);//向集合中插入一个文档
+ M' g$ n: H$ r - echo '<pre>';
, @/ S$ U) K; _% ~2 K) a; c - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
' s$ l6 o( L* H) ?& ]$ x: D - //参数1:搜索条件
$ Z e2 X: f7 z' y - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
( O% ]; k Q; P3 d( y" _+ S$ P - $mongo = new MongoClient('mongodb://localhost:27017');3 o4 ]4 j% z9 H# v6 ~% }. c0 @6 K0 }
- $db = $mongo->mf;8 s- x% L& }6 t- A# o/ L3 k2 `( x
- $collection = $db->friend;
- S7 ^6 {! ~- C9 G- l$ x - $one = $collection->findOne(['First Name' => 'Jet']);
4 ]" a W5 i5 P# q) O6 x3 Q) n' e - echo '<pre>';
0 J/ w+ @6 W! g - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
; ]: o m( @- D& {+ b2 t& P, G( F - //参数1:搜索条件
, A' i1 c: o K. }; |' s9 K* | - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段6 A, ]5 @' N, S e
- $mongo = new MongoClient('mongodb://localhost:27017');
! ~' d; A# G K+ c/ p) R - $db = $mongo->mf;
( X- s6 L N9 q9 b% z5 Z8 v1 b - $collection = $db->friend;% J: _; T/ M6 N, g9 t1 n
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
9 h: E' ~: \( X4 R2 `" F - echo '<pre>';
" K' l* H4 }7 u5 \- I# p8 S% _, s - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档2 }" F5 a W# r: A1 g( g
- print_r($doc);7 T: [: z7 d6 X
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
! }- U, V" k3 g2 \) {- n - $mongo = new MongoClient('mongodb://localhost:27017');2 o% I$ M5 E1 C9 `7 O2 K
- $db = $mongo->mf;
2 w' H7 y' v; M& ]+ ?; w - $collection = $db->friend;/ _ k7 x2 O$ k$ G
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
' z8 f. |2 N( B* v3 _' a* @5 w - echo '<pre>';
P" l7 k* ]1 H4 u x+ n - while($doc = $cursor->getNext()) {$ W4 Y' j) B9 v4 m
- print_r($doc);( ?. Y* F; p! y' I0 R/ l# m+ c
- }
复制代码 //查询某个字段的所有不重复的值6 n3 a8 w* z" s( b
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个" r! J1 V- u' ~/ c2 M
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);( C' g; P/ X6 O- i! d: x `# {
-
6 s' g o- R8 L. X - //$all:匹配多个值中所有值(用于数组字段查询)( \/ V$ a p; `
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
, o; b0 Y' ^# `, |! T. H -
6 f6 G! } t; u" Z - //$or:或查询3 c4 q* K; Y6 K4 v7 a
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
. k I1 k3 h$ J+ D* e -
- F% X0 b/ U$ P - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
7 {$ z1 F- L: b4 `7 j. O2 Q - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
! Y; k, N1 ?! S4 A/ J6 ]1 O - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
4 R4 U8 f" L) u: m - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
& e5 T: g2 d( p5 n - 0 n" m- P @# f! ~
- //$exists:根据某个字段是否有设置值进行查询+ Z/ O9 q5 `$ b! ~
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: X" n& o% E, h6 Q7 v5 @& Z
-
1 M2 g% V5 R3 @/ G! ? - //正则表达式查询2 t8 C; u) a* \7 ?) y% t0 U8 Q# ~
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序) V# ?" H) p, I/ I u- U
- $cursor->sort(['Age' => 1]);
! ~8 q+ `# ]5 P3 u+ _. T4 ? -
i3 A- x' W. P I/ ^- `- p - //忽略前n个匹配的文档1 W, K0 Q* u# F0 v q$ x8 {6 v$ c. H
- $cursor->skip(1);
! c2 v$ {; M5 _( H4 V/ K - % }! U& n0 K. t2 b
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能). g9 c! R( R: Z& n- C" E, b
- $cursor->limit(1);$ S' P( T4 e& a% r: }
- $ ? E( U, @: e" e
- //匹配文档的总数
: v2 t$ Y1 } m6 ?" E - $cursor->count();$ q- l0 H- @9 T( _, f% ]; S, q
-
, k/ Z2 w9 \, V9 W - //指定查询索引
1 \( _% N7 \! h& z6 ] - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
9 I6 E7 C) p/ d - $mongo = new MongoClient('mongodb://localhost:27017');: e, n5 r; e2 Q0 v3 [$ U: n
- $db = $mongo->mf;: Y& s% E. d3 o! Z
- $collection = $db->friend;
9 n: t* O1 s% n- P) }' q - $res = $collection->aggregate([
0 A5 n7 e3 `$ \; P" N - '$group' => [4 L8 G+ ]4 B' @8 A( T! a2 X
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组/ E, |$ y7 J9 j5 }
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
9 i* n, J- A( O; |5 m/ G8 Y - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值( V) y x% E& X. q
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
8 U% ^+ S( t4 U - ]
6 d5 I+ d* a \, z) G3 d p - ]);& \ h/ X& A! Z8 S V- I0 y2 R0 T
- echo '<pre>';* ~" i% t: S0 s. _. R
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果, H7 |, }( `2 K0 K$ L; W m& p
-
+ O" s+ Z, H1 t* h( s. T - ! \5 {3 }5 e$ |" K5 ^9 t: [
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序; S7 Y" Q3 _3 A6 v) x# e0 f
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。2 I# t5 ^5 w/ d f9 o1 l# _# x$ T' u8 o
- $mongo = new MongoClient('mongodb://localhost:27017');
' K. u& Y& D4 @) g( N6 M - $db = $mongo->mf;
0 X" b4 Z! o+ W: Z - $collection = $db->friend;+ }! r/ _ s3 E8 \0 O. t, c
- $res = $collection->aggregate([
/ J/ e c& d& h - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 `2 u- L- b! Z" j3 Z5 ~5 r9 B
- '$match' => ['Age' => ['$gt' => 30]]' {9 f; q/ D- c& A5 J# Y1 z
- ],
7 S4 i7 _) j; |' P2 m( N - [//指定分组字段、统计字段9 B: {# [- g) ~ }4 Y
- '$group' => [
, T h# z. O* N( R - '_id' => '$Address.Country',9 j/ R# W& S$ v* s$ G+ ?: k% ?% @
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
( C. O. ~. c" n' U' W: a5 h, C: ? - ]! x4 j/ [- S' O) g' {: s4 i& ~; i6 n2 G
- ],
; ]) \. g. }+ k4 \ - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
5 l G0 K' r8 g( {6 K* ~ - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
- \4 h8 e: j' ^; p$ ^: D8 r/ B - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名* P, z/ g# @: Y0 G' x
- ['$skip' => 2],//跳过指定数量的文档
& a+ C4 e0 l6 K1 O9 ^" V, \& ] - ['$limit' => 2],//只返回指定数量的文档
8 `) {* j) J4 h, X0 i( u - ['$sort' => ['totalAge' => 1]]//排序
4 {( ~+ \* T9 |# U, s - ]);2 T' d: r: C$ O1 S6 I+ X! |
- echo '<pre>';
1 o* k# Y1 U0 J - print_r($res);
复制代码
$ v+ W( w/ z) r: |0 `# j三、数据修改 - //update()8 ^, y5 Y5 K5 P# ?8 G: k/ o
- //参数1:更新条件,指定更新的目标对象。
7 w6 g9 d6 Y0 J9 {1 @ - //参数2:指定用于更新匹配记录的对象。
8 }: q6 j" C2 X7 I- g1 i - //参数3:扩展选项组。1 Y) q. Y j Z) q$ C
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
5 L& h. Q9 O: u9 K* E' y$ B - // multiple:默认为false,若设置为true,匹配文档将全部被更新。1 n: A: k# ^! g; V9 J
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 ?( M# O0 F" N4 f& _
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 D' z1 f: h4 O, |/ H
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。. h. [! y, E1 V& z( U
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
1 x* t$ }: a6 c! M2 Z - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
4 y( i; I9 C. S6 S o! h - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。2 J) A/ p3 n. Z1 m, q
-
1 f% q* i! o7 {, J/ \+ U' g# d - //$inc:增加特定键的值,若字段不存在则新建字段并赋值9 z f; ]/ I5 w% p; A: t
- $mongo = new MongoClient('mongodb://localhost:27017');! G1 v: A) C+ ^7 u" C2 t
- $db = $mongo->mf;4 B+ e0 i5 p2 E8 b" ^
- $collection = $db->friend;
[! N0 H9 Y4 i5 F" B% k1 W - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);% r; q2 Y- Z6 n3 U- D8 i
- echo '<pre>';
, K, k- k' A& o$ t$ G% ^' b- G, R - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量+ k+ H3 Q' `( {/ Q1 ` n
- $ r+ }8 v0 W$ g# j
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
) `, ^7 ?, G) r" o7 }6 b - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
! j. G: ?9 B5 i1 w! z% h- m h4 t - , i& Z# l8 d$ R. @
- //$unset:删除字段/ P* W, k5 G' S2 g/ s
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);3 g# k2 L- b7 o5 v9 a, z
- " H$ X/ L7 ~0 D5 |" s9 g
- //$rename:重命名字段,若字段不存在则不进行任何操作
" w, _8 N6 }( }1 x - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
9 m, _' p- \, e; J - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
3 F2 C0 X) ^0 ?+ f# }, S- x# @ - # _( G) \+ M6 \% ]
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* E7 ?" |- H$ ?3 n* J! ` - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);( T! ^" }9 `" u5 l% X' Q
- d7 A" ?; y! I. N6 K1 L
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错6 V8 |) h# m+ }( C. i
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
+ Y) I6 h* Y7 M! X- B1 p5 S3 L - 9 x- k' h, [ `% q! }0 j' y
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
, Y5 T* d0 D; {, c2 q% U( x7 p - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
5 a/ ^1 I# z* T7 t1 R- I& ]5 o - * l& l7 }' T ]8 Q
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错+ ?. o6 q* Z& X% T! y' y" k6 C4 _
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
7 Z6 U# b4 s6 F8 I( ?; Y -
( }" H( j a3 D# C* p/ t3 a; ` - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
. s0 ^5 k+ N$ Z - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
! q( D5 h- V! o, ^4 Q5 g: |6 d- ^ - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: w/ X! E5 _$ m# y, y9 T& N
-
# |1 O/ |/ ~7 V$ N7 v [/ n - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
2 i8 l4 b( ^& o7 I# _ - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);+ ]! W* |$ v1 I" q v% e0 @; J
- D5 X O+ Y" _9 `8 h0 E
- //$pull:删除数组中所有指定值
+ w$ j" B( }5 j1 ?6 k - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
! Y& M% O5 P T+ k' H -
4 [& |+ Z; i R8 y8 T& ? - //$pullAll:删除数组中多个元素的所有值' n' P9 V( F/ D: |7 J2 ^
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
7 s/ R' r0 @2 `$ V. P4 {4 _# R; o7 e6 s - //参数1:希望保存的信息数组
2 X: r7 l- |7 h+ Y - //参数2:扩展选项
! I5 ? Q: k, ~ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 i' E$ Z M: v" @ V+ U" B) W( E
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
$ q' R9 c Y- T: H( x$ w5 P7 I - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 t' _% R6 U" F1 a9 V7 x5 m& k
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
' D/ H* Q( b" h7 ]6 k - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒). Y: U' l6 Q- m/ B9 R1 T
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
$ g( j5 D1 Q4 U! Z- e% P - //若想更新则应该在参数1中指定_id键的值。
5 \3 D" b0 m# N - $mongo = new MongoClient('mongodb://localhost:27017');" C w" K( x# A
- $db = $mongo->mf;
' e! b7 S& L T6 v - $collection = $db->friend;4 e7 d: p% N$ H6 S- d
- $doc = [//定义一个文档,即一个数组7 a3 e3 l$ K! d9 S
- 'First Name' => 'Jet',1 W; W% f# R/ R' p0 Y
- 'Last Name' => 'Wu',
! y9 L: i& b- w) L - 'Age' => 26,
4 C3 K; x+ u' `! y h/ i0 P8 } - 'Phone' => '110',: N3 X# U, Z, x# X& W
- 'Address' => [
" X* E" D# k1 T: d& k) G8 z: m - 'Country' => 'China',' n) T) b: K* Z3 T5 @
- 'City' => 'Shen Zhen'$ K O/ S6 {3 N% `0 t
- ],
3 |+ u( s; t1 e8 j; M% m+ h# ? - 'E-Mail' => [
. u& R1 L4 [3 b8 J6 ~ - '123456@qq.com',3 ]9 Q! w: {0 Q: c: X
- '666666@sina.com',
9 \* H5 s) _) _) f* v - '8888888@qq.com',
& \0 w& X' T3 n - '77887788@qq.com'
. K! a0 z) T5 n7 o2 A* L - ]8 }0 T7 p$ r( G2 s! V/ q& |
- ];
1 O' {0 U# C2 s. L7 D - $res = $collection->save($doc);
$ `: u2 q" }& \# N) j; x9 E - echo '<pre>';
! L4 A2 H' Q" e9 n9 G - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入- L& ] e9 }# s. ~3 p
0 g3 Q" D1 L8 B5 H {
复制代码- //findAndModify()
; j8 d3 }6 I0 a1 a s - //参数1:指定查询条件. m7 B8 `' f% @& u2 }
- //参数2:指定用于更新文档的信息
; Y" B- T# a" [) L8 S7 q - //参数3:可选,指定希望返回的字段
. Y; q& t- C! n8 Q: f) f - //参数4:扩展选项/ a, P; Q. k5 s: V m( C' W
- // sort:以特定顺序对匹配文档进行排序( K. E0 G& V/ v. x
- // remove:若设置为true,第一个匹配文档将被删除
% Q8 C- C( Q5 m6 q) j# I: C( e+ @ - // update:若设置为true,将在被选择的文档上执行更新操作6 h4 f! [$ Q. y {/ g8 R: j" y
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档# w& p8 F! s$ ?1 K1 |
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档: j: m! J6 u0 F
- $mongo = new MongoClient('mongodb://localhost:27017');
5 Z) |2 s1 `! b9 g- N5 A - $db = $mongo->mf;" N* [/ j6 H0 ? r4 p$ r$ N
- $collection = $db->friend;5 ?( M2 `- M% s B4 b
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);% _, N) W" r# J; I! o1 [
- echo '<pre>';9 m, W( W: ~0 R n* J
- print_r($res);
复制代码 四、数据删除 - //remove()
1 y& L% Y5 V2 G% ]% L8 r - //参数1:查询条件& @: h3 I) ` v4 r' l$ @
- //参数2:扩展选项
6 W7 p/ b$ N5 h7 T5 a+ U5 _ - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
/ `/ @) ~- y& l" d- { - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& z+ f! w9 H" Y# {1 e
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
/ B( a4 p2 W3 U! C/ \: @ - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。# C5 k4 f8 ^( \3 @& X4 w2 B7 _. A. c* f
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
' b& t/ W; U$ a( c. Q7 J0 w - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
J: n" M4 d3 J$ t! v. l* u- z9 R - $mongo = new MongoClient('mongodb://localhost:27017');
3 I9 K1 m4 p& H: V' S2 w - $db = $mongo->mf;2 M+ z# V$ b2 c' ` H0 X
- $collection = $db->friend;
# O/ c7 }. W1 {9 ^( R4 q# w - $res = $collection->remove(['First Name' => 'jet']);/ r4 ~- S+ Z- H
- echo '<pre>';
- Q h- H2 Q; @- `2 V! D - print_r($res);//$res['n']表示删除了几个文档
复制代码 # D8 t; q2 m4 [7 A9 G: b
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
9 n& B+ ]$ M; F8 {-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- , V" M' J$ e! O! E6 h
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ n& e' U* U$ Z
- $bulk = new MongoDB\Driver\BulkWrite;
4 F) h' x$ F$ r - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);0 F z4 e4 X: M3 p) c" x; y V' D6 F
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);- W' ^6 Z) `0 F1 v1 b
-
$ h& `2 ?' r+ z+ H4 S4 u - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* X) N) M, X! [% z/ G5 w- g
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
0 Y) v# ?, D! P7 S N9 } - echo '<pre>';
' H0 V( p6 p n: b. H! R - print_r($res);
复制代码 $ s" l4 c9 n+ W1 E/ N; A: n- z, I
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');7 c! i% u6 H% s. v" p# `
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);" z, T. `. i2 _" V, s
- $cursor = $manager->executeQuery('wjt.friend', $query);
) s& p# Y2 t H! ^ - : N6 S, [2 j T! I1 l5 W
- $data = [];6 E, s) H" Z" w! g7 B
- foreach($cursor as $doc) {% n. M. H9 r# }+ g3 _1 b
- $data[] = $doc;
) D& u6 ~, d: `$ r1 m0 K - }
' j0 J* N5 Z7 c6 k - echo '<pre>';
7 a* j. Y- A/ a3 D; J: ~+ o - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');' G9 [0 S @8 u6 ?
- $bulk = new MongoDB\Driver\BulkWrite;
6 }0 s& ?2 Z2 d$ l8 N! ] - $bulk->update() }; \4 |- z* O) Q. V) @$ {
- ['name' => 'JetWu5'],
: J# H: i; d4 z$ E - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
. a; d$ c/ W, X2 v - );* E7 P' o1 k: I) ^$ G: Z3 W
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* o( X% @) l1 S" z! X/ ^' l- z
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);7 o( O( j1 L9 Z% }& }9 q$ r6 e6 P
- echo '<pre>';) e3 {2 w: W- I: f- S7 T
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
9 [4 D+ M2 h) q - $bulk = new MongoDB\Driver\BulkWrite;$ ]% ?9 @, G3 y4 ^* w& y' {$ {
- $bulk->delete(['name' => 'JetWu3']);
* C) J8 W; M8 ?7 H - $bulk->delete(['name' => 'JetWu4']);. M+ V+ [* a- s+ }
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认- U- t5 M4 X! f0 D" n
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
9 q/ D& X( C. J: C$ `+ E5 m - echo '<pre>';) t* Q$ P" v% }& D) {0 @% \6 r2 W
- print_r($res);
复制代码 0 w3 O! W% k) V8 g1 G& k& r, G
! f* s8 J/ o2 U# }0 a6 Q
I9 y: b' S b* I! T: ^2 ^$ ]7 P- D
6 ^; {# s# i- u5 o" T4 \
4 {: G0 X& \0 s6 L; ~* R% g/ Y |