|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
9 F) E* A& l: g7 X' p) z - //参数1:一个数组或对象' ^/ g: y1 r q9 n% ^
- //参数2:扩展选项
; @* ^ I7 l% b$ X$ X - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
" }/ |3 ?5 m) @" f+ N4 @ - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
) \- t6 W M* }! z - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认/ |/ u8 Q5 }) V2 [
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
7 o8 y8 v' j" Y+ t1 m2 K; K - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
# Z' v6 p! ]0 I - $mongo = new MongoClient('mongodb://localhost:27017');3 H9 y0 o: ~# f- |% x) f
- $db = $mongo->mf;//选择数据库# K! r) z2 {( w
- $collection = $db->friend;//选择文档集合
& ^: r. {" ?; X7 z# b* G - $doc = [//定义一个文档,即一个数组) W* v2 i& l% T9 T" e# _
- 'First Name' => 'Jet',
0 {: x/ n! |1 u$ z8 |8 v - 'Last Name' => 'Wu',
, H9 L. {" u1 r- J( p - 'Age' => 26,, y% x6 `8 u# n. F' v( E$ I4 f4 M
- 'Phone' => '110',! j" Q3 g' [4 h, Z7 A+ g) r
- 'Address' => [
6 u6 Q x/ i: t# @" c - 'Country' => 'China',
; h+ E1 x& o- ?! M' L4 g& B - 'City' => 'Shen Zhen'
' m5 L! W$ {: V( }" @# ^$ T% t, O5 X - ],
/ F" ^1 ?; [& r# @ I/ l - 'E-Mail' => [% K/ k& F) c; A9 f
- '123456@qq.com',
2 K+ V" C9 a. B* O8 C - '666666@sina.com',
8 T6 p3 s( B; g/ k, G4 _, E% A6 o' R - '8888888@qq.com',
$ H) W: h, W* J2 _ - '77887788@qq.com'" n" g/ Z) U5 ]# P
- ]
/ f3 d* G/ h3 o - ];5 l) f) J! z$ x o: z
- $res = $collection->insert($doc);//向集合中插入一个文档
5 ?4 X- h- n, w - echo '<pre>';' O1 g: g$ ]% k# P4 j8 N
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()# F) \; N' l8 I3 G" o
- //参数1:搜索条件5 o* i8 h9 Z/ V6 }* u' i2 ]
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段/ d: V: c& N/ V$ |- Y1 N
- $mongo = new MongoClient('mongodb://localhost:27017');
/ E- _5 G: y" q& y9 Z - $db = $mongo->mf;
, w/ h5 ~0 Y2 g. k! X - $collection = $db->friend;
/ D* P! E9 z1 X7 I0 z) F: b7 ? - $one = $collection->findOne(['First Name' => 'Jet']);& e, Z" d& y: g2 y# A
- echo '<pre>';, h/ e' J8 n% c
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find(): ]6 V3 ]# d1 k/ ?
- //参数1:搜索条件0 c5 l0 [) L6 `) ~6 g6 u6 |& e, r
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段; q" S4 @8 T/ {
- $mongo = new MongoClient('mongodb://localhost:27017');
( `3 [6 N3 B3 h$ T6 f$ c - $db = $mongo->mf;( b- F6 m! f& d
- $collection = $db->friend;
8 y! Q# r4 v9 I - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
/ b" T3 q1 A- I% b% V+ ? - echo '<pre>';
( x7 o! K9 B% O4 O9 ]8 g - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
1 m# q3 S( u3 Z; m) U; ] - print_r($doc);2 k' h2 E# U( g$ y9 ]/ Z
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
3 n: l; b9 ?2 A8 o: k* T - $mongo = new MongoClient('mongodb://localhost:27017');
4 }7 P# y5 \! |" W, B+ A3 ? - $db = $mongo->mf;, l# A9 z, N+ `3 l" H: `
- $collection = $db->friend;* T0 n+ Q R X& F. h5 s1 N" I
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
a0 ?: }1 Q+ Y, d2 L, G2 W - echo '<pre>';9 b% @& K! L! _! y2 d( Z( H
- while($doc = $cursor->getNext()) {
( d( X. @2 I+ x) m a+ m - print_r($doc);, b9 y9 F3 y9 X: t
- }
复制代码 //查询某个字段的所有不重复的值
& \, B, L( @5 i4 u. r( c$ P9 w; K $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
/ a8 O- P0 Z% d - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
" F, V3 \- {# D' [ -
Y5 H3 N: J1 P9 t. b$ @ - //$all:匹配多个值中所有值(用于数组字段查询)/ ~: U7 Q+ I# Y: V O: `' [5 F
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
/ U; I, C O: K$ o+ o5 @% y8 T+ w -
, a) E+ `9 I, [/ ~ z2 ]# J - //$or:或查询
& a) a' b! X8 a: B% t - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);4 `+ b- w* H% e/ R6 ]- I* M6 V
-
7 m9 o9 N: e" S2 }% S - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
9 Q4 r* N7 Z4 f7 b0 q% S1 p - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
) ~1 g2 k4 y* j7 {1 Y - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email( f" o. s1 B( E9 u6 \, y
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
2 n6 W1 y8 A* ~" I2 X' n; e -
- f8 _2 ^* P% T - //$exists:根据某个字段是否有设置值进行查询& f y6 q$ q0 B' A+ X& W( J
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
' Y. K4 d1 |1 T3 [6 b: h" X1 H - 6 G4 G, A% ?, s: t) b8 j }
- //正则表达式查询
" x- o/ p# \* S% S+ ^. U - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序 g, o1 p$ ~8 _- r' F
- $cursor->sort(['Age' => 1]);1 O' ], ^* b2 k/ a
- / v6 m; Z, a: D' I7 \6 [, s6 n
- //忽略前n个匹配的文档
$ h6 p: M) B( q. F9 f1 s1 ? - $cursor->skip(1);' x# w, a6 m" q# s- l/ q! F& {
-
" v" z3 K% ~% ^2 s. w - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)# f; _ ?$ |$ c; B
- $cursor->limit(1);
" C; ~9 [3 z2 e. F- P8 | - $ N) ~4 Q# `& `' c) a. O. M5 y
- //匹配文档的总数
3 m _; \6 Q+ O% `) K1 {1 S, T - $cursor->count();; u6 \2 N% j% N+ @( m0 ?) A
-
+ J- q) y6 ~) v" |0 D' o+ S - //指定查询索引- L6 {9 C' P$ P
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计" e9 X/ ?$ @' l" e
- $mongo = new MongoClient('mongodb://localhost:27017');
2 V% |1 L; R1 w! E) ^ - $db = $mongo->mf;
$ l/ |% B7 b0 G7 w- r( }1 R; Y6 Z& C - $collection = $db->friend;
$ I: a% R% ^0 w4 M& `6 A0 U - $res = $collection->aggregate([5 _0 ~7 V; R: S( a! `: t& G8 `- v
- '$group' => [
$ u& U, ~" E/ `3 v! V' ~/ r - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
1 l; g9 @- n: `( Y) B - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 }; z, P! L0 N% I0 P$ R% E7 g
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值; k* s; s" f) y! {2 A! t, {
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
) @0 d! G# Y) l q - ]: u1 X; O! A: N$ o1 t
- ]);$ r3 k" j! }5 v+ d6 w2 l! m
- echo '<pre>';
1 D f4 l; N8 x& H. E* L0 T I3 d - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
" w5 X& I0 O) ?3 w7 z- S7 k -
$ {9 X% p# E* X% F% `7 @ -
, T" S# y! V) q7 J+ v! ? - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
4 I! p' D% Z) X _; A - //聚合查询中的所有操作,包括'$group'在内,都是可选的。 H( w# w' j& j% t' N. C
- $mongo = new MongoClient('mongodb://localhost:27017');' [7 T# m& H/ C" C# M) i# f
- $db = $mongo->mf;
9 R& X$ j: i# e7 l8 y8 I9 h - $collection = $db->friend;
2 n G+ u& Q5 x2 ~( i9 k3 V - $res = $collection->aggregate([0 b4 E& L0 N8 [9 ]- s
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档+ O5 ~% {# p- O2 I( O- e7 f( u
- '$match' => ['Age' => ['$gt' => 30]] \! H2 z- f. Q6 E, ?* U" Z
- ],% K2 ?; U$ ]- t5 K
- [//指定分组字段、统计字段
! Z! V" x& c7 x- b - '$group' => [6 u1 g8 k( L' k; |
- '_id' => '$Address.Country',
! A7 T9 B8 U9 Q9 M% L; f2 C; S Z3 P, j - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和" U0 t$ g% n, x1 V' r9 e9 O! Q
- ]- A+ s( F: }5 N0 c0 g! L9 Y
- ],
) ~7 m$ s' [( @0 r0 ? - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
3 n- M% t, @! E/ @" T9 M - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
7 ]- x/ X8 l# Q1 I, l - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名0 h) E! J# w5 ?) `
- ['$skip' => 2],//跳过指定数量的文档0 u2 @) R; _" \; Q4 s9 ~
- ['$limit' => 2],//只返回指定数量的文档
7 y6 G, p# o5 h, B4 o3 b1 O - ['$sort' => ['totalAge' => 1]]//排序7 Z3 C: \3 S. J8 ]- q0 E* c
- ]);
0 p6 B3 C' Z7 v6 b, Z6 v& [ - echo '<pre>';
) L8 o- M- f; k8 ~ - print_r($res);
复制代码 & a, V4 |5 `& u3 O! R s0 `, D
三、数据修改 - //update()
: N) F) m5 b5 P* r6 x - //参数1:更新条件,指定更新的目标对象。; G6 t$ q8 l4 T6 B6 `0 d" Q' z
- //参数2:指定用于更新匹配记录的对象。( H% F4 b9 l: T' E! r# b! U; H
- //参数3:扩展选项组。$ W, x& l, ~* d, V* m/ z# v
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
: l& ]: p: R b - // multiple:默认为false,若设置为true,匹配文档将全部被更新。" Q$ u: O6 N { |) e& Z: t* m) z
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
7 ~. o. F6 F1 D: U( N1 g' G6 O - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作# c& g! r: x7 Z$ g- G" G+ ^
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
9 T% G- ]) z- W. }7 S - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# K2 c& n9 T/ R& j# p$ O - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& E8 Z9 Y, o i. A/ J
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
5 ^& I7 V* ]& B/ g- U2 t( K% M -
o4 n+ b+ j6 _* @+ s7 {$ |$ F. | - //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 a( c& x* f( _! [8 V: H: k0 C( R
- $mongo = new MongoClient('mongodb://localhost:27017');3 Y8 g. ~9 j$ J2 b
- $db = $mongo->mf;
+ C, J* f) d1 i$ |0 j6 d - $collection = $db->friend;
0 @* |% y) a& y0 }, ~. R/ x3 q/ k - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
# x; |, F& _6 K2 f, G2 ?& D4 x - echo '<pre>';
7 i( T8 S% h( { A9 [/ J - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
5 x: i4 [$ G0 l - / e1 i8 k1 Z t, N; V; O' y
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
2 D O: Z0 L: V3 T - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
u7 D% Q% C4 F% r$ w -
2 H$ b6 h8 ^% J/ T" v" j - //$unset:删除字段( x: E( @9 T9 ^# v* @
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
3 P& J ], l2 v8 @2 S' M: I, a - * `4 A: C4 ?& |
- //$rename:重命名字段,若字段不存在则不进行任何操作
+ O& X1 N) f8 m# D+ F9 e; p - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
5 T0 `5 ~! Z# S0 m1 p9 N - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。 M9 [- E! t. h( e. U& ]
-
* z1 o% C6 s. n6 z/ g - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* E: r# B6 m3 S9 r: f7 M - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
) f7 o( b- M& n' Q8 F -
; R+ i T6 P( P& B4 f7 J - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! P% i' ?9 h4 F
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]); U: o$ i ^" j% |
- " E9 ]: d' s9 C. v: ]
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
8 L( D; h1 \2 r$ Y - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);8 e4 |; h" s" ^
-
, ]! q0 S3 r+ i: J' T7 \6 | - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错5 G$ W5 S1 a* A, A
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
9 M+ I( R/ q" Y& H1 c' L -
0 V6 V6 t( x) Q6 L$ L, m - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
' h- W" L8 k0 v0 r) |/ K) n - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
- w+ k: R4 T2 G - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
. h E3 R1 f+ D - 1 K$ r) Q. D9 D
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
+ Z/ @0 k2 }: A& j - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);, M; D; T0 ]- h# n2 c2 q& I
- / F: [% O' m& S/ g
- //$pull:删除数组中所有指定值4 o% g. s9 [) F' \2 o- [0 Q V' \8 ]
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
6 s: g. a0 ]3 n4 b5 f6 @$ i - . ?7 c% q' E3 ?5 b
- //$pullAll:删除数组中多个元素的所有值
1 h; j7 L# l3 ~; I0 Y: U* _# F - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()+ N- N% K/ W8 x0 i$ k I' [0 I
- //参数1:希望保存的信息数组: k5 r" V0 Y$ R5 u
- //参数2:扩展选项2 W, Q- [0 Y; \* r; h1 U# _
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% B$ l4 ?3 ]' {3 K6 f5 ?
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
0 I# H$ b9 Y M1 t - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。! b& f1 y, \! J* e( x+ O5 u* ~8 [
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ p/ Z* D% |' H/ Y/ k- t
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
9 h/ |$ V4 o3 Q6 k7 R- r, [5 x - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
1 u2 Q2 Z) v7 K0 b - //若想更新则应该在参数1中指定_id键的值。5 E: x( a, V' F8 c: O
- $mongo = new MongoClient('mongodb://localhost:27017');% F; L' C' b. v
- $db = $mongo->mf;4 _3 q, l+ o/ m1 Q
- $collection = $db->friend;
5 @) k7 q5 T& M - $doc = [//定义一个文档,即一个数组0 q$ c$ J0 D! v. m) M
- 'First Name' => 'Jet',
, D) l1 L( f/ H - 'Last Name' => 'Wu',
9 S& @5 l( A7 I% J - 'Age' => 26,
' ^. X3 e8 \: z5 L3 `7 t- L - 'Phone' => '110',3 M8 U: d, X4 E# E" y4 @
- 'Address' => [9 g- I0 B k3 ]9 e7 k
- 'Country' => 'China',
" N, Y+ ]% e# N! N: A - 'City' => 'Shen Zhen'
6 t! g) ]+ n' W5 | S7 [' y' M - ],
* R1 }! ]/ I2 s8 a# E7 t - 'E-Mail' => [
6 S7 w% q# h. P" w" ?! y# k, ? - '123456@qq.com',
; }. K: n' E' E - '666666@sina.com',
- A( c Q: ?( |! O$ A - '8888888@qq.com',8 _: _3 {. h" @- M( O& K
- '77887788@qq.com': j: X) Y4 ^7 N0 h
- ]; D7 M# ?# k; S/ l
- ];
X. O) S; M5 V - $res = $collection->save($doc);( @0 {5 ] [7 r/ t( `4 K5 K( T
- echo '<pre>'; h3 U% q; J! {3 j
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
( i6 [6 Z7 U6 m( @ - 2 e: H0 `- Q6 A. l, o
复制代码- //findAndModify()$ u, i7 Y/ ^! c" I# Z
- //参数1:指定查询条件
% Z( d7 V3 B6 x; C8 l - //参数2:指定用于更新文档的信息* u3 b2 {" j% o/ i. \5 j, N8 I
- //参数3:可选,指定希望返回的字段 f- O9 {) \; J. r" @
- //参数4:扩展选项
6 q: I5 E7 ^6 A; F9 T" l; R1 o - // sort:以特定顺序对匹配文档进行排序0 ^# A: Q1 p# A$ _' k5 s6 H
- // remove:若设置为true,第一个匹配文档将被删除
5 a, A, C; o. L: l - // update:若设置为true,将在被选择的文档上执行更新操作+ \6 b# x2 m- b* v
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档0 V% c, I' X2 o5 Q. \ M
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
. I5 y8 Y# J. U0 R s2 V/ [ - $mongo = new MongoClient('mongodb://localhost:27017');+ Q. t" y- f) e
- $db = $mongo->mf; d$ U, D g$ A/ W6 I
- $collection = $db->friend;
# o S* K6 Z( C4 ^4 u - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);, ?- I7 S/ c( B2 g
- echo '<pre>';4 c* @. c0 ~) \3 N' D
- print_r($res);
复制代码 四、数据删除 - //remove()
* k+ w9 M# X( v/ s) G0 |4 E5 Y: Y - //参数1:查询条件
1 p- D: _8 P; g. Q( L - //参数2:扩展选项
Z$ b0 ~+ N- X- }8 e - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
: F1 b& m1 Q3 c2 y, m2 X - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 R/ _4 X0 h- m# U3 S6 t. X
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作+ S; A8 a4 ^2 ~/ x9 x# n c, ^* Y
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
( k: w7 I. b3 X4 _: i - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间2 [% m9 |& V8 ~" f0 D4 ]: `! @
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
# \. P' M1 p ]. X( W3 x - $mongo = new MongoClient('mongodb://localhost:27017');
& J8 p% O" w7 w; X8 E8 R3 { - $db = $mongo->mf;
/ a, Z7 v: O9 N4 i0 b - $collection = $db->friend;" j, v9 |2 ~; f6 C8 Q& ^7 W& u2 f
- $res = $collection->remove(['First Name' => 'jet']);' Y! D5 ?! w$ W1 x1 i; q
- echo '<pre>';0 q! g2 V6 [4 M# H' N# J% j5 L9 K
- print_r($res);//$res['n']表示删除了几个文档
复制代码
2 _" T4 I) `: D, B& H以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
+ b+ y0 d6 ]' D! M9 _& M$ n- |-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
$ P3 Q- a; n6 X1 {数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 R0 B8 m: A* ]6 {
- $bulk = new MongoDB\Driver\BulkWrite;
y8 U; q) S0 M) O }, U - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);* p3 Y) `. p+ `1 L0 }. f
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
) R0 Y5 y) g0 C' q6 W: _ - ) s- p+ {! c2 W
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
' @4 u' H7 Y& d1 L9 b6 c& U; d - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
# n8 s G d9 { [6 [ - echo '<pre>';
; {. S$ ?$ q* k - print_r($res);
复制代码 ! \# T* w$ ?, y- s) E1 N# k
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
; Z: m: Y0 L3 Y" S) b# b5 j$ V - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
) n: P0 B6 Q( x5 c+ R8 N0 a - $cursor = $manager->executeQuery('wjt.friend', $query);
4 N, G, R4 f, D+ ~ - / }/ {0 u% j7 Q+ Q: z# [ {
- $data = [];
( y8 B1 u: g6 n' G$ m2 Z6 `% r8 h - foreach($cursor as $doc) {
# u7 w \6 j/ z5 O/ y' V! O& l$ m - $data[] = $doc;
7 Q7 b: ~7 d& j4 u6 e# G, T9 R - }9 I7 M# x2 j# x, z k9 m% [6 d
- echo '<pre>';. ~- _) x: w" o6 c# J
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
7 E1 P# P! c5 P9 {" L0 C' r3 l. o, R - $bulk = new MongoDB\Driver\BulkWrite;
; S6 B4 @/ |% K L" G7 g - $bulk->update(
2 m( Q4 i$ h0 Y/ q o, F2 H - ['name' => 'JetWu5'],( R! B$ H4 y, P. Z' M0 X
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]2 g% W. s9 }% Q: F
- );
/ K" F. r/ c w+ Z% z; I2 w- v8 q - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认! E% m2 T- n1 E( p, s
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);1 ]# X0 Y7 t0 L
- echo '<pre>';
8 g6 U; I* m" t6 e& y. ` - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
+ {1 c4 |, r; d: `6 U: X+ @ - $bulk = new MongoDB\Driver\BulkWrite;! |) D# D) i9 W, v+ N, [6 H
- $bulk->delete(['name' => 'JetWu3']);
% j7 w1 N: T; d8 z; r0 f6 e1 V( a& p - $bulk->delete(['name' => 'JetWu4']);$ _! _ b! H7 i ?$ f
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$ z- i) u" D- N& C - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
" h' s) D" u6 j/ b" @ - echo '<pre>';
. h& o! {% V! Q, L8 O4 y& o8 I - print_r($res);
复制代码
# ?3 e6 f1 t5 Z: ]0 J! L4 y$ w6 Y4 s9 ]2 Y n. e6 j
' G& ?- r: ]9 z% k
: ~4 ?5 R! \$ R# Q0 }3 p
0 F2 t2 t; R: f5 V! I |