|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
3 k; G J4 X! H% { - //参数1:一个数组或对象
m1 p W' P( U3 q: N& N - //参数2:扩展选项& D. f4 w' D" N! w% _
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘4 |# ~; k7 ~+ L \9 ^/ I
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
& y/ ?& Z/ v$ C7 c1 n$ P - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
8 _5 p# n& @+ x! w! H - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
& E/ y, i0 p+ U - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒) K/ ?6 }; H: H0 ^ u
- $mongo = new MongoClient('mongodb://localhost:27017');
. e$ S% D( {% m* o$ K* w" o2 v - $db = $mongo->mf;//选择数据库 o T% Y+ K( M2 F a* R
- $collection = $db->friend;//选择文档集合
1 u A( S- n* v; Z# b m9 m+ M' s - $doc = [//定义一个文档,即一个数组
: R! j0 K4 W9 _' d- k - 'First Name' => 'Jet',
. ^, p! j, I0 H: s4 T - 'Last Name' => 'Wu',6 A, F8 L" ?, \
- 'Age' => 26,0 m2 g* ]+ k ~1 E( s5 C- ~
- 'Phone' => '110',
# v+ j: e2 {4 M - 'Address' => [
0 z) S" C2 g/ y7 g, t1 W - 'Country' => 'China',$ g0 r$ l/ _" y* Y! D2 H
- 'City' => 'Shen Zhen'% O7 h. E/ @: l U
- ],
" ~$ S3 K7 f7 p2 l7 ~% i - 'E-Mail' => [. v* T9 x$ ^' o- {
- '123456@qq.com',; Q3 w% ]( j! z" j. {" M9 g
- '666666@sina.com',
% B0 k8 Z# v, e - '8888888@qq.com',2 w! X, [8 g0 M7 X' v/ P ?
- '77887788@qq.com'" F; M4 |6 f- t; ~4 ]
- ]" F# A& k* ^8 Y7 M \2 t
- ];
+ Q e9 E6 Y! x. c8 N - $res = $collection->insert($doc);//向集合中插入一个文档8 U, Q4 K# V3 _7 u/ C
- echo '<pre>';
' s9 ^" L4 l( r$ ]$ p9 E - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
; Z& U0 G6 X- R2 r w6 b - //参数1:搜索条件5 ~; Q) Q. s9 q; p1 J! a
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
' X- \# c; W+ G4 v# X. B - $mongo = new MongoClient('mongodb://localhost:27017');
0 ~6 `, O7 B s" n) H' k - $db = $mongo->mf;: S9 Q/ o5 s* ^$ G: ^
- $collection = $db->friend;/ N' e3 Y( ?- n- h8 I7 C+ I
- $one = $collection->findOne(['First Name' => 'Jet']);3 C, R; G, h/ A7 P
- echo '<pre>';
+ V; ?* k0 S) ^$ |0 Y8 ~ - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()' x4 q O$ C! i! y( [! M
- //参数1:搜索条件
' N1 a9 V6 M& f - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段7 V; U$ n& {6 N5 o6 j3 o
- $mongo = new MongoClient('mongodb://localhost:27017');
( |; z# }6 `3 ~ - $db = $mongo->mf;# M. }8 X* D# h3 m# `
- $collection = $db->friend;, A' X, V2 P$ ]% n$ n1 G# E$ m) H
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
3 y2 l2 t$ U$ J* _+ m$ P - echo '<pre>';
, H3 g! Z4 L6 J! o - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档) p) j( q' G, i m) l u
- print_r($doc);
" a0 X3 S H/ b5 J - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询" W# s, p0 R7 ?1 F$ ?' g f. u
- $mongo = new MongoClient('mongodb://localhost:27017');2 O: ~* e/ J* x& O$ e
- $db = $mongo->mf;
4 v* a. ]2 g& R- U3 u4 l' i- W - $collection = $db->friend;
2 F8 G" \+ r b9 T% x - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
* s8 `* B3 A( K s; b* s - echo '<pre>';2 |6 }( z/ h7 X1 H
- while($doc = $cursor->getNext()) {
5 |$ q I$ o% J3 r - print_r($doc);
" e- |* U6 G$ y2 i: { - }
复制代码 //查询某个字段的所有不重复的值
# `* @- |4 |7 m$ `8 w. m* B. W; k $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
; G* F- b- |( ?6 g6 P - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);1 A" w. ^! _$ Y
- . s6 `; D4 S2 ?' [
- //$all:匹配多个值中所有值(用于数组字段查询)
/ E& Q# d% y" y$ d! v. n - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
. d! |5 ?# Z. U% y# _7 e8 F -
, |5 [% x$ d# [; e$ H2 h - //$or:或查询- G& v% S5 s* }& n
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
7 w5 V& N, |" K - , ]2 W! ~2 D( c& M$ U1 H w1 o
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中: S# g+ Q' ^- w5 e, r+ [
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email2 j0 c; ?7 L: r0 R0 v
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
1 j3 F+ s! m F* e% N1 k, I1 @5 E - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
' t7 f; E' C+ Z- k- @- R - 4 E$ t( ]' i$ Q! ?
- //$exists:根据某个字段是否有设置值进行查询
% U9 I3 _, |: p0 E. X" w - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: H, T; ?; j/ ^
- % l1 L i( z+ f% B, b5 Z; T
- //正则表达式查询
- q0 ^; a3 r; _* M3 k9 _ - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
5 i7 [1 {; O0 r8 s* {8 \; E - $cursor->sort(['Age' => 1]);
/ |+ J) d( Q& X: o: W# O - 5 S. \3 j! a! G8 q' m7 q$ D L
- //忽略前n个匹配的文档& e4 g* H- |. P- \+ _7 ]. _" @
- $cursor->skip(1);
) w- b3 o7 Z" c. L% u! g/ z - ; P& s# u/ l" p
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
$ M( `, b, _! ^: S' _* T5 E" g - $cursor->limit(1);
8 b3 S8 L( e( a n8 L: R - " p# l R0 k, F) p! i* r% f
- //匹配文档的总数
& x! Y1 j6 U9 O, u$ A - $cursor->count();
! F8 J$ Y8 y2 i% J: v+ d - ! h2 g5 T* r( a$ g( f
- //指定查询索引/ C9 q4 W% L2 O
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
% x. b* k& d3 I - $mongo = new MongoClient('mongodb://localhost:27017');* K9 q- I( f6 J6 } n# U
- $db = $mongo->mf;
/ [9 y2 _, Y) }, N! C. d5 V - $collection = $db->friend;$ a" _$ }8 O5 b, J3 R) G
- $res = $collection->aggregate([4 q9 C" A- \! M3 w8 n; ]3 `
- '$group' => [
, Q" y; z( P8 H$ n; n3 Y' p4 [" z' f - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
, }$ O1 m/ ^* R: @' _; k - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
4 ~8 z5 j( h7 H. g& E3 ?# w - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值. d% }5 B+ ^) V+ N- z/ P! R0 B
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
/ Z8 x; r1 O/ x A9 o5 ]2 z& x - ]( ?; Z& |% n' y# V& S( w
- ]);
# g# T5 ~; O' i: |# b4 O4 V - echo '<pre>';) a9 C: |7 p6 J; X4 X6 O/ ?
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果- r( _1 Z& B- D7 E) v6 G
- ) M+ Z& V5 w1 D# }/ C
- 4 Y5 N- y, P- ~
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序* g* ~) d5 ^& p/ W% k, ~
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。1 X3 J% t- N' @' ~( ~# T+ m
- $mongo = new MongoClient('mongodb://localhost:27017');+ G+ z' p+ u9 v+ x' d
- $db = $mongo->mf;8 r { K }" \9 O
- $collection = $db->friend;
& l: `+ [# e* i1 ^6 ? - $res = $collection->aggregate([
/ V/ Q& ]( r9 u3 ~ }7 j - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
. Z$ }/ C. p/ e$ ?7 a6 m0 X/ @ - '$match' => ['Age' => ['$gt' => 30]]2 I' y& x- _1 {& m _
- ],
$ x/ w, R( y0 T P! y& I- K - [//指定分组字段、统计字段
+ Z% g' P5 Z0 ?) a# o F" T7 I - '$group' => [
& }- y$ s6 ~3 ?& H N$ S - '_id' => '$Address.Country',
D& j! A( {. i1 ]1 Q9 ` - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和9 A; X, T: M# E6 {; i
- ]2 U+ Q( _) S8 ^/ M: G* n
- ],
8 E, W! r! A2 Z( m C( l; h - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档+ Z0 g. D, `+ \4 n. {
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
8 u& P$ y% M# z5 E, N( Z4 w( {5 P" }. p - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
/ B6 e) C; [: X! y - ['$skip' => 2],//跳过指定数量的文档* i5 a% h6 i7 H4 M
- ['$limit' => 2],//只返回指定数量的文档. U2 D3 n* A0 h- m0 k2 i
- ['$sort' => ['totalAge' => 1]]//排序: P, ?( A6 ~$ M5 i
- ]);. j+ Y/ F! _# Z, ^6 n+ X
- echo '<pre>';) G: q1 S+ t0 s+ ]3 K
- print_r($res);
复制代码
. h' y/ \5 V7 E9 \. v2 S5 s7 t三、数据修改 - //update()8 ?7 R5 n7 \3 T3 Z0 w1 w
- //参数1:更新条件,指定更新的目标对象。
% T$ a4 c9 V3 ~( v - //参数2:指定用于更新匹配记录的对象。
& P% L1 e" L% a$ y- j0 f - //参数3:扩展选项组。
' F d6 E- y# @0 ], S! `3 ] - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。5 n) q3 M4 I7 T5 o5 G5 V
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
! x U5 w5 N, h: L0 c0 a4 \ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) d l# u0 Z" _$ I' R- A# a
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作1 @- v+ Q i( ?, E4 f4 Z+ J
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) P3 y4 }' [+ B
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
1 e! K2 x8 f1 J* P+ R - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒): x% R8 P$ {6 x) u2 [. k3 A
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
, O2 c7 F$ w7 M9 t - - x O {, Y% u* w' {8 Q
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值) ~5 ]( S4 ~5 |# ~& N+ C/ w
- $mongo = new MongoClient('mongodb://localhost:27017');# b Z; [# U% N4 M% S
- $db = $mongo->mf;; O. B5 v Q& P& l2 `! p
- $collection = $db->friend;
# I% b1 ~& O! F4 w: r - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);$ U2 y! T# ~6 k W( R3 D2 d! r- L
- echo '<pre>';. w/ H/ ]% R5 V" n0 s
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
4 ]- r) F& U8 m% k - / S! {# P) B* Z \4 V8 I
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
3 F" Y+ o$ D8 y2 ^ - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
2 q3 s# b# k7 ]7 M$ |% R& U -
7 n0 U- R5 l# Q- R* y+ ] - //$unset:删除字段2 Q: O* j% j8 b% d1 p
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
0 r* J* E4 O+ _9 j: b3 { -
# p; Y g6 k( B3 Y% u1 G+ E - //$rename:重命名字段,若字段不存在则不进行任何操作/ z# l* w' v- b. C
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);! p2 c: a6 J% E) g$ j7 C! }
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。 b( Q2 K/ l' ^8 `- O
-
( i8 |) I( B* q I0 m" F- g1 I - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的2 A4 w2 [2 T" |8 C' d
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
0 T# ?" D* C- ?0 ]( O -
) r; P: G4 x' u* ?# w0 r - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错" T& C+ ?, K$ W1 _1 a0 p
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);/ N1 l# b2 z: x6 C, U4 s9 @7 `
-
- M) L& V. h6 x+ N - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错& l" p( x8 u7 f4 a0 `# I& O
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);% l6 `1 V S6 d+ L- f
-
, l3 ]4 a4 S7 w0 h( k- ?- h( M; U - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错* D. j4 g8 i9 b
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
\% l5 W2 N9 y' t; v$ T* X( n - * I& C/ d& s% ?9 r
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中); e* O0 m- R! g& w; s8 A3 }+ s- C
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
* t0 K1 l7 p8 }/ b1 e* n- p - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
: g+ Z' \7 k1 C5 k -
% n9 Y) e$ a( B8 J$ } - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
- a( ^, o1 w% w5 e3 e - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
6 }1 O3 c4 @1 A$ ]" l4 m( M/ y! | v8 y -
" T" J9 {* a, n/ ~( ~ - //$pull:删除数组中所有指定值
3 p" H9 V4 Q, Q6 l; J - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);, x: Y' V6 R+ }/ P
- , s8 `2 _" l- u8 t, c# u4 X. Q
- //$pullAll:删除数组中多个元素的所有值5 L5 M% w8 y, L; I5 e9 A
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save(); { l: d4 V; g- Y* D! q U
- //参数1:希望保存的信息数组
7 u& Z/ q* p% M+ c( Q$ d - //参数2:扩展选项
, q( `+ \' U5 [ - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
( W% c" C6 U4 m) I - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
1 Q* ?' i+ T8 J - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) T% Q2 ?( |. q% M
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
2 ?1 A; c& t5 J. i; d2 I - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)( D4 I9 q# E, u0 J7 R
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
. ~0 J" w" B7 v' b' E6 } - //若想更新则应该在参数1中指定_id键的值。% {1 o# s$ F$ H# J) w9 g
- $mongo = new MongoClient('mongodb://localhost:27017');
+ X3 U, k/ X1 U1 k3 r$ Z5 ?8 ]$ W - $db = $mongo->mf;$ r) k) u, n. x) R
- $collection = $db->friend;* L, L/ A5 O h) U7 y- `
- $doc = [//定义一个文档,即一个数组7 ]( M/ \5 J( j$ B1 T" A: q7 }
- 'First Name' => 'Jet',
$ P |# C: d$ R8 o& [' X - 'Last Name' => 'Wu',4 r V" O7 w$ M9 n
- 'Age' => 26,
5 i- A: M3 n L _7 H: H, J - 'Phone' => '110',. v5 W9 I- O3 j0 D6 a3 H
- 'Address' => [
+ z' b/ E; u/ a - 'Country' => 'China',. x0 V) h6 e/ u5 _8 y4 v+ P
- 'City' => 'Shen Zhen'
3 v( i$ @; P5 t, F) `! l - ],
. x2 `1 s: F: ]4 F- ] - 'E-Mail' => [! z/ h& q s" c# S8 y/ @
- '123456@qq.com',+ d8 J! t, R H8 M
- '666666@sina.com',! p% ?6 P' P) h- h
- '8888888@qq.com',2 O' k5 Z+ u, O* v a) G
- '77887788@qq.com'
7 S: u$ B! C* b C, Y% t - ]
5 ?$ p$ }9 A1 q: c. p2 { - ];! ]" t! G8 f( m
- $res = $collection->save($doc);
2 V# A3 l% Y) U( R! [6 q2 ]. \ - echo '<pre>';
0 C( x/ \/ b& Z - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
; g% X j3 B" q3 p
' U0 f4 x5 z8 @1 l0 } P- B, t2 m6 ?+ d
复制代码- //findAndModify()
" M; C5 H/ \+ N4 p* P% \ - //参数1:指定查询条件/ y6 r" O* B+ Z; _3 } j
- //参数2:指定用于更新文档的信息
8 ~& a6 j0 z. ?+ p3 d7 E - //参数3:可选,指定希望返回的字段5 A: h# b0 }" M- K( a
- //参数4:扩展选项% n) J9 t. W: ?6 \- g' j
- // sort:以特定顺序对匹配文档进行排序
% ^4 c; @3 _! a$ t2 u; M - // remove:若设置为true,第一个匹配文档将被删除( T* W& `' V) l: O% ^! Z) a' c
- // update:若设置为true,将在被选择的文档上执行更新操作0 K: _: {* e! f; ^% s. L9 M
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档8 j* W7 Z6 V; A$ h
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档' o) i( _9 K- d6 \2 ]6 ?
- $mongo = new MongoClient('mongodb://localhost:27017');
5 E9 x! _; |% a6 J' ^2 w6 Z5 L/ [ - $db = $mongo->mf;0 A& D4 r; J- f# j: T/ f
- $collection = $db->friend;
1 `0 M, k/ U* W2 w2 \6 D2 v4 X - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
7 P& H* T* @, T2 U: I - echo '<pre>';
+ V: \% B2 ~3 K: n7 {( v# ?( ~ - print_r($res);
复制代码 四、数据删除 - //remove() L. d. Q. \; w$ t7 F' e
- //参数1:查询条件
, g) Q! _/ x( T# \$ Z8 P1 m - //参数2:扩展选项: x; b4 ~+ q1 ]' a" ~- m& }2 w
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除' t/ z; ]# p( a: U
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ R+ u7 d9 s, R& b0 b8 `
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
! F1 E( h' U0 X! @6 H! a - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
# r2 U {; \+ s, u( M+ T - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& E# m; j( P! _4 n: a
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ q1 ~; U" Q9 D d" D* X4 r% C5 v: N7 X
- $mongo = new MongoClient('mongodb://localhost:27017');
4 {$ b# r: w, u" J3 v1 c( e% A B - $db = $mongo->mf;
0 E3 s& d. A! x - $collection = $db->friend;4 ~, w+ I) l( F9 `. G
- $res = $collection->remove(['First Name' => 'jet']);
0 O; u9 Q( O; o- Z - echo '<pre>';
! u7 F$ g$ X& c - print_r($res);//$res['n']表示删除了几个文档
复制代码
2 ]) ~& d0 C- @0 q) l0 J以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 0 F0 v3 p) v+ d+ V5 g
-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- $ ^$ v& f5 ^# D) y
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');5 e; _; Y$ R7 k( v+ g
- $bulk = new MongoDB\Driver\BulkWrite;
/ q% y4 V1 @' F4 U - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
+ b& g% Z$ A3 w$ p+ G6 W( Z - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
- o8 X6 P+ z1 T1 g -
( r, W0 N- x' T% \ - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
! ^0 C) i; U- i! m7 r2 L% ] F - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ w; q& n% k1 Y" I, k* }
- echo '<pre>';
% r3 D$ S4 G. ` - print_r($res);
复制代码 9 h- i+ b3 @: U; x$ j
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');. @( Q- |; T( D. a2 f
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
: J7 p& \/ \) o9 p+ b$ `: C - $cursor = $manager->executeQuery('wjt.friend', $query);
' a: `. q! W- Y -
$ G$ f: B7 Q! k' `9 ~: D - $data = [];0 \4 K2 N: o9 i$ a
- foreach($cursor as $doc) {5 Z; {9 J- | U' I- A
- $data[] = $doc;& o' ^8 O2 A3 F" N
- }
; m5 Y `& ?, C - echo '<pre>';
) s: K, n7 F, e4 a- I7 l8 K - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
( W1 {- X' y$ ]0 y - $bulk = new MongoDB\Driver\BulkWrite;! ^4 }; N7 Z. q
- $bulk->update(3 W9 g3 {$ e- V& b8 W
- ['name' => 'JetWu5'],* _3 b; O( A2 A) c0 }
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]8 P! m5 w( j, c- p+ k. w
- );
' }# `* k& p# C, q' q9 E/ T - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认6 E7 r* L2 X7 \: m2 a0 l& O0 D
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
9 c& E) F2 s U# v, i' [! l - echo '<pre>'; z3 L7 k% z9 J) ^7 V. M. v
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( S! K. ?$ i# a5 _. i8 g
- $bulk = new MongoDB\Driver\BulkWrite;' f2 X# i: P' z- k5 T* O4 U
- $bulk->delete(['name' => 'JetWu3']);
1 q$ z5 L; i: H" F+ B7 ?. f - $bulk->delete(['name' => 'JetWu4']);+ x2 ^8 ]5 t3 J8 Q; g1 Z
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认" ^8 m9 b; k( g4 f/ Y1 K* z; a' `
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" W, c! c2 f/ Q4 R W
- echo '<pre>';
* K( P m, j, z4 ~( d; ]/ H& X& _ - print_r($res);
复制代码
" t% q" k i* z/ z- ~0 v
( q$ w2 F# B9 t8 F4 w- K7 [* R) `" [" i' M3 S+ Y
- B ?# Z5 B4 s0 N
$ h Q& U3 B. k: v( a |