|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()* R! s* g0 F5 F1 W5 y3 h: S3 |
- //参数1:一个数组或对象
) W/ r0 e* m* ^5 c% Q. E o# g- D; F - //参数2:扩展选项8 }5 g( a3 Y9 Q* ~# G
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘( ?9 F$ F* {& q2 @$ W
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
: o2 _! i3 J9 ^" g4 C - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认0 @" `1 f' M3 \+ M; k. p) K8 Q% ^
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
$ ^* h- C7 O! L7 i/ } - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)- O) O( x3 L9 c/ K* w+ l- v7 H! o1 B( U
- $mongo = new MongoClient('mongodb://localhost:27017');
$ d- t9 y8 P$ W5 b# s% W - $db = $mongo->mf;//选择数据库
1 [7 V8 c) \: ^4 j I \2 z0 | - $collection = $db->friend;//选择文档集合 o4 B: D4 s4 \4 T
- $doc = [//定义一个文档,即一个数组* F8 L- F$ e: @+ R& R7 {
- 'First Name' => 'Jet'," Y3 j: O$ `' O& [" T
- 'Last Name' => 'Wu',
8 l1 D/ o% L3 u0 k# d! D8 }9 e - 'Age' => 26,
) }. @ Y3 b J* Y - 'Phone' => '110',# p' B/ B( O0 ^# b5 ~
- 'Address' => [
4 [7 w/ ?/ w& {: q - 'Country' => 'China',% R( |- E+ I9 ~6 Q* `
- 'City' => 'Shen Zhen'
a, m' P- x# m - ], }6 F' l( S7 l( g
- 'E-Mail' => [! [2 u% l% _$ _' N
- '123456@qq.com',
R- H2 x' }2 y" K7 K( l% \ - '666666@sina.com',0 \9 n' ^; }: r$ ?; ^2 r# t# ?
- '8888888@qq.com',; u5 l* [/ Q i' O
- '77887788@qq.com'* S+ R4 i1 @- |. t
- ]
( y3 a: D2 r2 ?7 Z3 t3 ~ - ];3 f& D/ ~1 q1 x( h8 m
- $res = $collection->insert($doc);//向集合中插入一个文档: g- L2 Z! d8 p
- echo '<pre>';
6 S! t3 k) l) m - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()% i( l" e& A& L5 x9 p. d n: }
- //参数1:搜索条件
% N' k7 U4 z& u. J8 |0 U - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
4 M( y7 E( ~/ j0 E' q - $mongo = new MongoClient('mongodb://localhost:27017');
" V' p1 |( {* u2 S - $db = $mongo->mf;
4 f% V" _% Q8 [ M& t; R* _$ `) [ - $collection = $db->friend;
" Y: V: s5 U. O& J) s - $one = $collection->findOne(['First Name' => 'Jet']);, L7 c: W0 w) K9 f6 m% J
- echo '<pre>';1 x* q: f0 g" U. J$ M9 L
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
* v5 f E$ d7 L/ z/ P4 U - //参数1:搜索条件
- R& _. \5 y) F5 G5 B& m5 w K: t - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
2 w0 A+ n' n& n; R4 N3 L - $mongo = new MongoClient('mongodb://localhost:27017');) @+ }: {/ F7 ~, K$ |/ L! e4 F5 W
- $db = $mongo->mf;
" Q' @2 K2 {- r. k( t - $collection = $db->friend;; Q& }% }8 Y' ]/ j
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素+ D; }7 \: q# \7 _+ q
- echo '<pre>';
8 g: \& \- {: I. d2 o; B1 j - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档9 o% i/ ~1 I6 k0 B( @
- print_r($doc);3 c: O, N* [/ O2 G3 j* a$ D, |" ]! v
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询7 d4 Q) w* K ?& j# i
- $mongo = new MongoClient('mongodb://localhost:27017');1 _+ y; W9 ^7 @$ I* g1 O: |
- $db = $mongo->mf;
7 X; N8 X' [9 {7 G - $collection = $db->friend;
! N: T5 L, o! ]9 C - $cursor = $collection->find(['Age' => ['$gt' => 30]]);+ m% h# H, q" u2 ~
- echo '<pre>';- b8 z# @% E6 {) M
- while($doc = $cursor->getNext()) {5 w6 O; f0 u9 ]; k7 k3 w
- print_r($doc);
: z) L* N0 J2 M( C - }
复制代码 //查询某个字段的所有不重复的值
* V3 R/ Q2 f, _ $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个, L M' R6 d* W0 t$ \. e
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
% x2 i0 @' v, ~1 o -
& D. O; K' X& k7 S - //$all:匹配多个值中所有值(用于数组字段查询)$ H: @1 Y+ U6 }4 d/ T" d
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
6 P8 j) }' Q, Z0 ` - & z9 a5 c- W1 J: o8 s" [% f7 ^7 v
- //$or:或查询5 W+ F2 T% R0 b1 v; r
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
5 }2 {- v- O: w) M9 F8 K -
0 L' L6 b6 V: N! ^. A1 ` - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中7 y" T1 O- m: X4 i) z3 G4 }
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
& l: [# z# S1 q- z7 ? - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email0 K, a, M4 X: q+ F* Q+ p
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
% p4 p; G& C4 X U- K- C, \* C -
. p3 `' ~9 k* H - //$exists:根据某个字段是否有设置值进行查询: U* a3 f* {$ z8 c" K& T
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
" O5 d$ v9 g' O( O% a/ f# O' K - ! k* a8 P' U6 p0 D6 D+ N, J
- //正则表达式查询2 l! v! u$ D' \. V; r
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
1 Q! @! W, H" E* w - $cursor->sort(['Age' => 1]);
/ M% ?6 E9 o2 ^1 c3 o& h8 X -
9 r; r- ]7 {9 U$ a3 U$ g {; e( z - //忽略前n个匹配的文档
* q8 s6 R" f; ~' [9 t - $cursor->skip(1);5 J0 v3 ]1 Q4 m& b$ J
-
: l+ s- y/ [2 N) P/ d( ? - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)% u1 k2 h! F- Z- e6 v( o! R+ o
- $cursor->limit(1);
; s& K0 |. b" }6 k5 d8 q. B4 L0 V - ( c9 u2 @* N. n5 p& d! b- h8 J
- //匹配文档的总数
& J' r7 u( T+ Z - $cursor->count();( F3 c8 Q; B4 F3 F
- - v, h3 m2 ^% K+ N
- //指定查询索引$ O$ S7 s! ~/ L9 [# @
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
, ~4 z8 K$ }' E4 P - $mongo = new MongoClient('mongodb://localhost:27017');
5 c7 x# h3 ~1 \ g! J2 |# a - $db = $mongo->mf;$ Q" E9 l0 M( S: ]
- $collection = $db->friend;$ {. r* e2 m6 }5 u" v
- $res = $collection->aggregate([% }! ?- ]3 Y/ P1 c6 k5 D6 \
- '$group' => [( M* P3 K4 l" h) P% `
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
- \3 r8 P% P) ^( a) W% o) B - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
1 N0 Y' L1 L: o* N - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
3 H$ Q- Y2 u! M( l) \+ f3 C - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
- ^ s1 Y/ A6 t) s& N0 m' A/ l5 n8 C3 C% S - ]7 [+ C+ f& C; F, {# _2 k, L" G0 s! k
- ]);1 z" B; x) @. w
- echo '<pre>';
& v7 @5 R8 k+ y4 L: \ - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
( s j: v+ \' o! P% n - $ o! t9 U, c6 B/ S" t+ Y$ K5 W
- - a5 M0 u, J3 h9 n' v. a' w
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
. {% G% E- I5 _; X" j# x. H) J - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
2 l3 T' ]2 @5 a% p5 A4 x& D - $mongo = new MongoClient('mongodb://localhost:27017');
3 z) p8 {6 {2 o P - $db = $mongo->mf;
0 N8 {8 A$ w! B& w( J - $collection = $db->friend;
5 I3 b( T: |+ n# \7 Y - $res = $collection->aggregate([
% i" s4 \7 V4 ~: S - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档" L1 ~$ G; d) y5 n6 \( ?! ^* u
- '$match' => ['Age' => ['$gt' => 30]]+ O$ ^: j ?0 Q3 u! m, a
- ],; h3 O) _, L% Z, U+ V
- [//指定分组字段、统计字段1 W+ B4 {; x l$ e7 M, c9 O" p, s
- '$group' => [! y1 w2 y* n; O* d0 A. ~4 v
- '_id' => '$Address.Country',
8 U" B6 H0 f' P5 V$ c/ d' y7 ` - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和8 m- n& b0 g" h0 ^0 r2 q4 g
- ]) @% Z& z( \1 U* u9 b% m
- ],
1 Z2 H: e. _" C) `9 G. g - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档- V4 K/ {5 f% t5 G; b& W! I
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
, n3 N3 f4 o+ n) Z - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名3 x1 m. Z- f& h6 e) e2 y/ |
- ['$skip' => 2],//跳过指定数量的文档- T4 M7 M) q: J. J- p
- ['$limit' => 2],//只返回指定数量的文档
: r( Y2 n2 J# E: J9 [, h - ['$sort' => ['totalAge' => 1]]//排序
7 e+ ~( n! ?6 r& ]/ {1 e; U - ]);
$ T) o4 ]5 s! U: h7 F- |( \ - echo '<pre>';) V& u9 `, t# l) L3 s7 W. g
- print_r($res);
复制代码 ( j1 I, k5 _! P! P5 b1 H9 N
三、数据修改 - //update()
& ^; Z1 E2 E: p* q - //参数1:更新条件,指定更新的目标对象。" q8 y: s. C4 N; \3 N6 w: t8 ]
- //参数2:指定用于更新匹配记录的对象。
" Q# y2 }; P) L2 Y - //参数3:扩展选项组。9 W; H( h% r& k1 i1 u5 y
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。( A% x5 p, Y+ d8 Z) N0 k
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
3 H3 P( \+ T5 `* I$ { - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
; r+ W( w4 c' h X5 q - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
6 a3 k9 ]5 X( M - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) p" |; E4 s! _$ l) T# U- u
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
: u* Q* y( C# u# M* h - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)* o/ T) x/ V) O1 C% |
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
7 C$ {9 t" s+ H! k6 C. q- s - $ K" P1 |* n( X: {- D
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
& @3 J0 ]. O$ ^4 h - $mongo = new MongoClient('mongodb://localhost:27017');
9 Q7 }' _" Z! c0 q1 F - $db = $mongo->mf; s; Y1 u" S5 K
- $collection = $db->friend;4 Y: T+ o) Y v; ~3 v/ n
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
- ~+ d: w* H, ` U* O% p* V( ? - echo '<pre>';) v3 l6 W2 Q. T
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
0 X( ^( L v4 v9 g - / t2 x$ d5 z9 C- \* b. e
- //$set:重置特定键的值,若字段不存在则新建字段并赋值0 @! I! D( d" b# A, E
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
6 J% n8 R9 G. \5 B- ]# u6 l -
3 t8 Z# I+ D5 x% F, F2 M - //$unset:删除字段
; I6 h( j4 M; I( J% b - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
3 B, m( W# y- S3 U - : l g( @4 }- f, `, Y
- //$rename:重命名字段,若字段不存在则不进行任何操作
k* S% ^5 R$ z) p0 g, V. S - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
3 V( o7 E2 [( h4 t7 u - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
$ V- d$ h2 c/ w% v; @$ o - o" O; O k& J2 i& |3 h2 J
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的4 C; v) `8 f9 v+ }0 e% A! |* C
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
0 v8 x' H4 u! w# W4 N9 L -
" o/ S3 u4 ]: }7 m6 f) o+ p - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错$ P* |. ~1 B6 S; z7 P
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
R9 y8 o/ H9 ]4 C) l - 6 P7 C: ]( w) C' A
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
) q3 A# p: z; Q4 g/ q( d4 v - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);3 F- O2 y n* J6 f
- & y0 Y3 Q7 `2 E* w9 M% C- T
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
9 P7 ^/ E: I! B% X4 Q+ c" |( Q - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);" O# u# @/ {* R7 F2 v
-
( R2 B) e2 `+ v# c( J0 u - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
6 C8 I" P( r6 _ - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);* g5 h L4 ]% Z- J
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);8 @2 s: j. U. U( T& R
- & T, |( \) t$ u' G i _
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ s4 l: O; B4 L' C7 c- {% P1 g
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 p! o0 t4 F6 \+ ~0 l y
-
5 S9 h9 v5 t/ R/ u0 a } _# n8 A) X - //$pull:删除数组中所有指定值# j* u4 \& T4 a
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
( U" c& }( p. q0 P - : J( _% {. {# D5 w6 a3 h% s/ r0 B! H
- //$pullAll:删除数组中多个元素的所有值# W; A* V" z4 W8 p' W. l9 J2 D) w
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
- L/ r( D6 d! `, X3 v' ] - //参数1:希望保存的信息数组- g1 h$ }6 Q$ R5 A! W& e, ^8 A
- //参数2:扩展选项5 O3 e! a- }) e8 O3 |9 a
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 m* Z- u" _8 U% R( n
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
/ u: }% t. s+ R - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
* }/ b/ E$ m+ X9 k& M2 K - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
! Y: m; F0 ?% z0 S# H* X! P - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒), e- b% B# [5 _- U$ Q3 I& G# `
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
5 S" N6 e. A8 k- s - //若想更新则应该在参数1中指定_id键的值。
* ]9 D6 a5 p% a1 e8 C( ` - $mongo = new MongoClient('mongodb://localhost:27017');* e3 v2 ~& Z& O4 Z# ~) ]6 j
- $db = $mongo->mf;
+ ]$ {2 C- J+ j w! \6 @ - $collection = $db->friend;- a1 [& f3 {, K
- $doc = [//定义一个文档,即一个数组
) V6 g- d$ ]1 y% ~0 L, ]3 s1 A - 'First Name' => 'Jet',
5 h' c5 P) N: k8 e" L, Q - 'Last Name' => 'Wu',
7 I! Z# J8 T/ i. U% \, P8 q( G* ] - 'Age' => 26,
+ r& p% F# z8 t# V+ y# D' J, x4 O- J - 'Phone' => '110',0 n' O) W7 V8 i" k# F. e' K9 w
- 'Address' => [* k, N# n5 f+ x% k
- 'Country' => 'China',
8 [" }( t% B c- F7 N( ?: M - 'City' => 'Shen Zhen'. d% _. d6 x6 y1 k' f
- ],
1 g- p0 P6 [' [: K. R# |* K4 i - 'E-Mail' => [
4 a! u) G) Y6 P0 p, [, r9 Q - '123456@qq.com',
r$ v( r, R' v - '666666@sina.com',
7 T( c- x& l. D4 K9 b - '8888888@qq.com',: \1 y1 c1 g& H/ t6 D
- '77887788@qq.com'
* d. a+ z8 E& W+ F - ]% x! Q1 N `' {) B0 |) ?9 ^. q
- ];
+ y7 z* t4 }4 u; W4 | - $res = $collection->save($doc);
. ]; K1 L( M1 N% I! b) J$ Z3 T; Z {0 c - echo '<pre>';8 o2 ] A( A5 s( `. e5 f
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入 F8 I. q# n7 A6 ]( @ T6 w
V% d* V3 L" K4 q& L# o
复制代码- //findAndModify()
/ V9 s* J9 z# ^' o( g - //参数1:指定查询条件
5 V5 f$ s0 h* W Q- W" L - //参数2:指定用于更新文档的信息. z( K1 |" P H* H, _
- //参数3:可选,指定希望返回的字段
6 |$ l. C3 Q B. K - //参数4:扩展选项$ j5 E' X" m0 T1 H8 ^5 r
- // sort:以特定顺序对匹配文档进行排序
. v0 Y# m# ]8 r4 \% |8 h - // remove:若设置为true,第一个匹配文档将被删除
1 s5 B* v2 y5 x& r - // update:若设置为true,将在被选择的文档上执行更新操作
; O! L7 @5 c" D - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档* f( t; @, [4 ]
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档$ }% Q( ^7 n- S- }5 [ C
- $mongo = new MongoClient('mongodb://localhost:27017');
- K6 }4 Q$ U* T6 @ - $db = $mongo->mf;
$ S4 Q3 U3 a7 a' x- z - $collection = $db->friend;
4 q: N# m$ y- E6 N9 ~ - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);- R( s& h, _: n
- echo '<pre>';
2 {" G, t+ B9 g* `: Q7 b. n2 M - print_r($res);
复制代码 四、数据删除 - //remove()! t/ Z6 d6 M: X6 i" w
- //参数1:查询条件1 z, J& C2 W6 O0 { \
- //参数2:扩展选项" ~+ f. |" p C6 j* W9 @7 S. B, [
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除3 c1 o3 t% S) k! f. T* v
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
& x! e3 n/ \( X - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
( c( ?# ^2 p4 @" h) u6 O - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
' a1 r- u" U& D - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 S2 J2 }* {$ }0 |8 o7 e7 c$ K2 {
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)$ R# Q; H1 Z( J b/ X* `
- $mongo = new MongoClient('mongodb://localhost:27017');6 J0 \1 `4 e) A9 i; c7 x: E# Y
- $db = $mongo->mf;& [2 p% a$ f8 h8 Y, J/ h
- $collection = $db->friend;1 _2 g* ~- U) X1 e
- $res = $collection->remove(['First Name' => 'jet']);
! q) s" |( x. @0 Q, i2 h - echo '<pre>';( i/ C0 y' A7 |+ M
- print_r($res);//$res['n']表示删除了几个文档
复制代码 - h! f$ k6 p# @" E- R
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
8 f' a9 O; c" p0 m* l9 s$ Z* z. H-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- ! X/ U9 r) Q2 {) f0 I- |2 b
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
9 P5 \! J& ^* V0 k* j - $bulk = new MongoDB\Driver\BulkWrite;
! _/ b5 B# V9 a - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
1 b1 _/ M2 s! {; x7 [5 } - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
& M8 g3 p; }! v# d -
; f1 `3 |$ G; k a; |, {4 V - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
0 V |! r: F7 A! E* A7 P) N - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
9 d8 x* L$ l; l; P/ h - echo '<pre>';
( r$ U3 I R/ l$ T7 j - print_r($res);
复制代码 6 N# @4 M$ t+ A9 c5 |1 ]
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# [: H9 \9 p! b s/ q0 y$ ?
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* ^ J4 u, A0 r2 d' T- r1 F
- $cursor = $manager->executeQuery('wjt.friend', $query);% f2 ^" i1 Z8 }% b' m. \
-
# K) j0 |" }/ h8 l; E - $data = [];
+ P2 i/ _6 J. u4 d% n( D/ W - foreach($cursor as $doc) {
5 `8 V7 L& d- _; a4 G- S - $data[] = $doc;' @* u" l8 K' t9 e( d; q s4 Y$ A
- }' w+ I8 D8 @8 w
- echo '<pre>';& k3 \4 s N2 ?/ n3 L
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
: N' s: E: T( \0 Y+ I* x. x - $bulk = new MongoDB\Driver\BulkWrite;
" f! w; }- ?& O+ S! [9 Q - $bulk->update(+ e) S- Z, z& V0 \: M' u5 K# @
- ['name' => 'JetWu5'],
2 B' d, X/ @4 j+ K) g$ c - ['$set' => ['age' => 30, 'promise' => 'always smile!']]- D) J3 h) o* b3 M
- );) Q9 A; e2 S' C2 s
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
- L) F" t' A6 X' x- A - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; b+ W2 \- K6 [- G% E7 n
- echo '<pre>';) @/ E9 U, K/ Y: v
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');. e- x8 l8 ?9 a! V
- $bulk = new MongoDB\Driver\BulkWrite;
* U2 K; D$ N) P, S - $bulk->delete(['name' => 'JetWu3']);
, _2 i) h0 o% `$ i) u8 W - $bulk->delete(['name' => 'JetWu4']);
% Y: ~, X6 }! q" d# w - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
; g; f$ e% }( l; X/ P- k* {( J9 \: m - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
E1 s1 i) b2 h - echo '<pre>';9 O2 ^9 I$ {9 j4 S+ a3 y+ m% S
- print_r($res);
复制代码 + b4 Y5 i* A2 G }9 L3 d
* L8 F ^9 \ e9 k' b" U( G- `1 |+ [7 ]; j6 W
7 V8 z5 K/ D0 R, |8 V) e! @. |; `
2 {0 k8 ?( D" Z2 ]
|