|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()$ W3 S# r9 \9 J- { j; O0 f6 l. L
- //参数1:一个数组或对象
3 ~2 h+ t! v: Z/ G9 ~' \+ ^ - //参数2:扩展选项/ f$ U5 e: D& `$ f$ k8 G
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘% M8 I5 j( o6 M# K! ~8 C
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
/ ?% W3 N4 z" c6 L - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
: u( @6 I" h8 x0 a - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
4 \5 N- ?3 f* d, Q% i - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
& S1 }( e$ ], p b" {. Y4 o - $mongo = new MongoClient('mongodb://localhost:27017');
" w! T" r1 I; D2 H9 h _ - $db = $mongo->mf;//选择数据库9 T, s d' y% j6 p( I- Y
- $collection = $db->friend;//选择文档集合
: C5 y* C% A: b$ z1 O; n - $doc = [//定义一个文档,即一个数组
5 o, E4 w# r! H0 f - 'First Name' => 'Jet',
3 J. ]0 Y7 n b, U1 m - 'Last Name' => 'Wu',* ]1 E$ F* a5 l" K
- 'Age' => 26,
: M* y4 }9 ^$ `! `( _+ X - 'Phone' => '110',6 E, F1 j' N9 G# @; q, |4 [
- 'Address' => [
: }3 c J1 g: |; q9 R - 'Country' => 'China',
0 }5 p: _! U6 s* L - 'City' => 'Shen Zhen'
3 _% |* W, a8 d1 O9 z - ],: n; z+ _8 E( ]5 F! M4 n
- 'E-Mail' => [
% N! b4 ^7 f! a8 A2 g - '123456@qq.com',: Z, `* \- i: [8 g& i. [* j
- '666666@sina.com',# I# K8 d4 T: A, k! j" f3 t0 `4 o U
- '8888888@qq.com',
4 i2 B: J% ^' E K7 R - '77887788@qq.com'
$ U1 i, i( [9 S' O- G( w - ]4 _6 X: m5 e/ q& h: A$ ~ W1 B
- ];6 m+ d( u }" ]: B2 D
- $res = $collection->insert($doc);//向集合中插入一个文档
- @1 U* i, a- M/ m. V. R - echo '<pre>';7 I7 P. B# q% g. `" B
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
# O2 |5 R# l6 j6 Z: m - //参数1:搜索条件
# Q9 }( V; q4 q1 g - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
& B/ Q1 e# Q2 `5 J! | - $mongo = new MongoClient('mongodb://localhost:27017');
. d1 L: b/ W0 F; | - $db = $mongo->mf;
- j+ n. f+ A; N" F* u# G5 q4 ` - $collection = $db->friend;) C. ~0 H+ V* n$ i$ e3 b9 j
- $one = $collection->findOne(['First Name' => 'Jet']);
v$ J+ ? g# g/ W1 a8 L t - echo '<pre>';6 N4 e7 Y/ c& P
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()7 Z V- H8 p$ g/ ?
- //参数1:搜索条件
$ }9 e# T" [: U1 K0 s - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
+ y* k x: G! k- G# X - $mongo = new MongoClient('mongodb://localhost:27017');
3 D. e6 R8 E' r% R$ p - $db = $mongo->mf;
4 T7 m: ]# g9 s1 [. [2 ?7 { - $collection = $db->friend;5 j$ ^: D/ q: A8 N6 y" I. z" [* ?% o
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素5 Y$ p2 E, K$ U; N
- echo '<pre>';& _4 J1 w6 ]- K7 a
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档* u9 `; h$ c6 I0 f9 G' L
- print_r($doc);
U& c0 t( }# A6 v" b% u% p T - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询1 Z0 g B N% B& K" ?) x- c V
- $mongo = new MongoClient('mongodb://localhost:27017');
0 x+ b: |/ l1 }+ D* J1 V R* ^ - $db = $mongo->mf;
$ u- `% a& F, f+ m( j - $collection = $db->friend;
9 A0 K& B1 B/ W |( `. `) Q. w5 d - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
" p; R6 T" V! Z3 o7 V' g - echo '<pre>';8 \% i8 H$ ?# T8 B) c
- while($doc = $cursor->getNext()) {0 N! m' v8 Q: [
- print_r($doc);- N* O4 I( h& W: `( |
- }
复制代码 //查询某个字段的所有不重复的值4 ~ k/ {/ |( U# G
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
2 [( p% s1 {1 p* K+ n - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);1 m& M0 E) d' h4 {0 V* S( q* q1 S
-
1 E+ [* s9 Y! [, {) _4 v - //$all:匹配多个值中所有值(用于数组字段查询)
/ I+ y/ l/ W) i - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);. J; {7 |- z7 Q
-
& b- u+ p# L/ _" u c4 J - //$or:或查询: y* n* [6 X( c$ ~
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);- Z3 n: g0 O/ h- y
-
* ?% K0 D2 p- B, r7 p2 t9 N: c - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中' S0 l) X- ^+ M8 D$ C
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email# b* j7 P* n: e6 E+ `+ J
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email2 ^* P; O+ S6 m
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个/ X3 r/ {2 T! X) b9 ?
-
" h4 t8 w, v# \2 X) U - //$exists:根据某个字段是否有设置值进行查询( O- h. P& t' H) _2 j
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档0 A$ @/ Q _2 b* ]+ h
- % D" y' \, h: q2 n$ n6 B2 X( D
- //正则表达式查询7 y* J; d9 b/ V) Z# G
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
3 `+ Y6 R `) Z - $cursor->sort(['Age' => 1]);# y! u7 d \" b$ c
-
, n# p2 I# X1 E- L X- H - //忽略前n个匹配的文档* x& R/ j6 N$ B0 |. M. z% o
- $cursor->skip(1);8 \& d$ {) M; M
- : ~6 m) I+ D6 A# y$ k
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
, [' ?' k* J. ]( } - $cursor->limit(1);
- Z0 D0 G8 M; |( j4 @) U - . z/ [" q6 m; @) L/ r
- //匹配文档的总数 e" d6 a' E I4 V* L
- $cursor->count();
9 c( n$ Q( T& g) I+ I9 O -
/ N4 E1 i0 h% ? v Q3 R - //指定查询索引
3 k9 ?4 V. Q& ]) ]$ o9 Y - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计9 F4 F* u* v9 H2 N; d0 [. Y
- $mongo = new MongoClient('mongodb://localhost:27017');* v K; p1 T: e8 S6 x% ]& B
- $db = $mongo->mf;
+ M" o+ g% _ I8 W7 j7 } - $collection = $db->friend;, B' a% [4 N% } y
- $res = $collection->aggregate([/ a3 n. c4 w" K3 y! J. v
- '$group' => [
9 i+ t( a% [2 _+ O - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组" F% k7 \) M$ ]" B4 j
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
/ |3 J7 D+ y$ [- m- ]5 a# V - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
" z1 Q6 z# ^' B( F# r- Q; S - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值9 b1 @" B; N7 v% b$ A0 J% q
- ]7 w7 l) @0 o) A" L
- ]);% s% _3 g9 `+ ^2 w
- echo '<pre>';+ D- g% g6 n: Y& J
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果. g& J8 f0 J$ Y# J
-
6 q, b* E' i1 V( y - 1 ?# F9 r" P' K
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
" o" o, x V. Y( V' w- i - //聚合查询中的所有操作,包括'$group'在内,都是可选的。
) Q) [/ v: T" {& \ - $mongo = new MongoClient('mongodb://localhost:27017');3 h8 W) ?/ b6 K/ S: X( ]
- $db = $mongo->mf;
5 i3 R* ?" D: I/ ]( D - $collection = $db->friend;
3 [" c' |4 D4 p9 T - $res = $collection->aggregate([( [* i: A7 L, o) R7 s& `
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档, o) w* K8 d0 v
- '$match' => ['Age' => ['$gt' => 30]]: ?6 m& D: `& B- T8 P: F7 H
- ],7 T- d/ M! V3 n5 ]2 L
- [//指定分组字段、统计字段2 Y4 @# y0 j! g$ f- G
- '$group' => [
/ d1 F# T5 I( K) c0 l7 t - '_id' => '$Address.Country',& H, F! Y9 {% P7 K# S6 }
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
K- T, j, N) c# N) S! I A' W; v - ]6 m6 b* D/ S8 I
- ],; I& {% H- U& j& l
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
/ h. ^) | R# L7 O1 f6 m1 E+ ^ k - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。: V* U: T: ?) i# u9 g, D+ P
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名: ?2 N3 x! R6 i% ~+ p8 T
- ['$skip' => 2],//跳过指定数量的文档5 G4 g8 ] Y9 Y7 n- u
- ['$limit' => 2],//只返回指定数量的文档
8 Q n3 r, M" H9 W; O - ['$sort' => ['totalAge' => 1]]//排序' b, w5 @) f# G' v* F1 T
- ]);; c3 w- g4 s2 V4 q$ ?, b( {
- echo '<pre>';
. _+ ?4 E5 ?- v( n7 ?$ D& M - print_r($res);
复制代码
, M: {" V6 N5 j三、数据修改 - //update()5 m1 Z, b9 _4 J% |
- //参数1:更新条件,指定更新的目标对象。
1 j% ]' T4 \. N' F, Q% s; R - //参数2:指定用于更新匹配记录的对象。
! e/ _/ e, v1 s+ o - //参数3:扩展选项组。
9 t; ^' m. q9 J) o - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
+ \7 ^" w% D5 @! N" ~% n - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
3 z% Y: T( V; ?! ?* n, w! k - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。. W$ T5 g) |2 c: }
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作6 Q; h# N f7 M% B6 v1 e! K3 z
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。9 q* I q6 l1 `1 c, ?
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
; _/ c% ^( S4 [# M! F: J; f/ g - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)) N0 K8 o2 ] e% {. N. [! Y
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
, p: a6 }% N5 ~! I3 g2 {) u' `" P8 o% C -
" _7 K* ~) n) e - //$inc:增加特定键的值,若字段不存在则新建字段并赋值, P8 i# f! t# B$ [9 G
- $mongo = new MongoClient('mongodb://localhost:27017');
# n/ K+ n, m$ H2 E - $db = $mongo->mf;
5 F) a# T' S% \" E - $collection = $db->friend;
# |$ q, G1 ~# _ - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);3 q+ s+ A+ b8 ^8 a4 p" j
- echo '<pre>';
% G) K2 M/ H9 p. e5 V - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
, L3 m3 P! ~- Q/ j- S, ?, j9 | - 1 u8 {% P( \1 e. D3 j/ d% ~! ^
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
. b( A/ ]) D3 A4 b; H% i/ a$ d - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
8 `- q$ Y% b b, a w9 R' ]% M! M% Q - 4 U& k* \4 L+ K, K7 L
- //$unset:删除字段
, S9 S2 ?* q+ B* J1 B% ^ P - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
$ h7 P5 O8 o: N% K# @. q) [# I5 P# | -
+ R; v5 [$ o% B2 Y( I% e - //$rename:重命名字段,若字段不存在则不进行任何操作' _* u8 v: X* H
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
( g0 Z# Q; m& j A5 G% t/ G - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。8 m" z$ w; J" ?* Q/ o4 q
- . j: F5 ]: T3 C3 ?" n+ ^
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
3 ]' E, p+ _$ B' ?3 \5 z - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);! U2 K9 P9 C' f+ q- p& u
- ' U# s4 I8 t6 j# ?. l4 H% u4 Z/ x
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
% x9 {) Q! n \3 L - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
* J! J' n0 { A/ b7 X8 ?8 _ -
; `* y: r1 {. _, y* D S3 R - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
! h3 k' R q0 P: c8 m5 p - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);& R( ?- k+ F# H( L0 Y
- % I- ?! p. N8 [* a
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 s/ c9 D! ?" Z. L - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);) ~; N4 `7 z$ Q! B N
- % M {6 c0 h w) E0 h) s
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)7 q5 J) A6 l" G) c
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);3 S) j6 C, ~- l0 X- q
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);3 R9 ]1 I' g/ q6 e# r3 e H
- / J: Q6 D* n( ]$ Z
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
$ a, V$ a8 C/ N, t - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);4 k4 ^) r9 n7 x1 e4 L! X3 w Z/ z' i
-
3 ~4 F, a5 L% K0 w% D - //$pull:删除数组中所有指定值# V+ |6 i# w3 {' @+ n X
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);$ m, K" F9 N' L1 {
-
7 m3 P- ~& v: @& D1 _" N - //$pullAll:删除数组中多个元素的所有值
% v* e* p" p; a. O' `3 ~: G - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
/ Z5 a; X7 w( ? a& f$ [ v - //参数1:希望保存的信息数组* J# c$ [' c- |2 F1 W' B7 s
- //参数2:扩展选项
1 W7 w$ R9 X( q( O$ m# S4 J r4 H3 u - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
% |4 S/ H; Z2 C: K - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
; f6 N( Q) n7 o$ p - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。. K6 o; s/ t# x, } d* Q
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间# V. v8 ?, @( D
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)1 }% m6 a% L/ C
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
7 V# }) K% c" y! s" C& P7 V - //若想更新则应该在参数1中指定_id键的值。% g9 c* r) W) J) m
- $mongo = new MongoClient('mongodb://localhost:27017');
! L1 K$ g2 Z" E w, m& P - $db = $mongo->mf;
5 a& o; K8 L# S; R' ]8 }% W - $collection = $db->friend;# K" W( A: n8 e2 e
- $doc = [//定义一个文档,即一个数组1 m$ `# s- t: @
- 'First Name' => 'Jet',1 r ^3 A5 R) F x( z
- 'Last Name' => 'Wu',9 \' @: @% X7 T( ^
- 'Age' => 26,! w9 Z, V7 e' x- a
- 'Phone' => '110',: I& y5 y2 m1 K! n- p
- 'Address' => [% T' ^# c' W7 b: m z: S
- 'Country' => 'China',) c$ y: [" y$ N; u5 V; Y7 i0 l+ y
- 'City' => 'Shen Zhen', J- d5 A9 Z$ F& q' j" L% L, k; R
- ],! F( \3 v. A1 j2 |1 Q" f) j
- 'E-Mail' => [+ h- E% \9 o3 J6 a# Z* c- M, k
- '123456@qq.com',9 f1 M! v( O- b% C4 o- [2 Y# T
- '666666@sina.com',% I8 Z0 E3 A, p# K4 F8 c f
- '8888888@qq.com',
, {7 o$ r3 t: V8 x r - '77887788@qq.com'/ n1 ?! F% }8 ~& p" Z$ N6 Y8 s; K
- ]
7 h/ `" J9 Y3 K9 k; H; e" D# ^ - ];
1 J8 h6 s( a! ^8 r0 u# k$ f' @; B2 a - $res = $collection->save($doc);# J' f- `- P& y; ]
- echo '<pre>';
/ g+ Y4 f4 E5 L% | - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
1 n/ }8 d6 a3 ~0 H! ]0 l3 ? C5 q4 @) s, J - + t" O: q: B7 j% Y
复制代码- //findAndModify()
6 E m# }( t/ ]; c - //参数1:指定查询条件5 v. O& e( q5 M3 s1 _, [1 s1 {, I$ |
- //参数2:指定用于更新文档的信息
0 H! i# A, ~3 u' V+ y) V2 Y - //参数3:可选,指定希望返回的字段
2 K c; g x6 W/ a! R8 i% I; z - //参数4:扩展选项
5 x; ^& h- s: j4 e- l2 g! H, ?. K - // sort:以特定顺序对匹配文档进行排序5 v$ O/ e, G& ]$ z2 v' p: p% N
- // remove:若设置为true,第一个匹配文档将被删除
/ q& T* [# h9 ~, o& M U' P. ^! ]+ J - // update:若设置为true,将在被选择的文档上执行更新操作
* ^3 S, J$ I! C% |9 ^( C0 s - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档. b e* j6 r: P3 J; A
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
+ q3 ^9 A6 r2 u* H - $mongo = new MongoClient('mongodb://localhost:27017');: ^3 R; ^0 m1 m! p& F
- $db = $mongo->mf;
- ?/ ~) {2 v9 M% P) Z% P: a - $collection = $db->friend;
. F) Y7 N% s W9 a( h/ l- f - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
) z P4 G. I" \( O" X2 o; l - echo '<pre>';" C' k: U) x: H. n9 A9 a/ _7 f9 k
- print_r($res);
复制代码 四、数据删除 - //remove()7 \/ T% v/ U+ P1 ]" ` e; e
- //参数1:查询条件* }9 Z* }5 v" k3 \2 V7 i& L! i- P
- //参数2:扩展选项
# u$ l7 K% z! Q - // justOne:若设置为true,则最多只有一个匹配的文档将被删除. Z* p7 h v) ^. p
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
0 U. E" F* W( Z - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作 i# C7 D5 J/ p+ p4 M- o7 f
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
) N5 r. o, Y4 y% r0 \) T4 j - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ n5 L/ O/ n$ O) a' P: v% m) o - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)8 |2 ^/ w) [. i) X% u0 M+ l
- $mongo = new MongoClient('mongodb://localhost:27017');1 k$ i. P, u& u* r: n5 c( Y
- $db = $mongo->mf;
) y( _( q! }; @1 U8 C5 c# e - $collection = $db->friend;" L2 h- T- L+ P k j
- $res = $collection->remove(['First Name' => 'jet']);+ M5 F. d ?, g( [! w! n
- echo '<pre>';" e! w4 } [- h3 y
- print_r($res);//$res['n']表示删除了几个文档
复制代码
" O7 Y% T( j# e以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
* d( J- E9 L1 \-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
8 g) I7 T( J3 r; a% c/ e& y) {. Z1 D数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 j# x. @* O' W* o- F: m1 V& B. D
- $bulk = new MongoDB\Driver\BulkWrite;
$ P* G i3 h9 {" u3 b - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);. \& j9 {' m2 R4 J
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
8 V1 p* b, R3 i' E/ N% d4 A -
7 ~" w; F6 j. s' B4 l1 p* n - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
; c+ g& H+ x8 f0 ?$ |/ [: e9 i - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
7 I3 p( d0 d$ k" G - echo '<pre>';
, p6 x D( U: E- T$ m5 n: X - print_r($res);
复制代码
2 l6 m6 y+ W1 t0 S) Q) I% N( J数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" x" ^/ r& w9 q
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
% x% Y6 C/ f' M. F - $cursor = $manager->executeQuery('wjt.friend', $query);
% | S5 c- [! M( i -
1 c' V0 D) v8 X8 G1 t/ r) m7 A - $data = [];1 N( x# r$ m- |/ w
- foreach($cursor as $doc) {5 D: [" b) ?: p+ z W
- $data[] = $doc;
" `4 K/ B0 l& [# ^3 A& R - }
! Y' h Y. ^" n q6 V6 c - echo '<pre>';
* v% E+ u F0 q# ~8 W- s - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');+ f, Q. e4 p# Y# i
- $bulk = new MongoDB\Driver\BulkWrite;- H4 Q. O+ P) h& U/ z7 m
- $bulk->update(
2 a* {2 [& _* X& V9 u S/ t, | - ['name' => 'JetWu5'],. d: h; d* s. A
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]$ u9 ]2 w) [3 X
- );
6 v3 z; Y [/ }; Q9 _- s6 O$ |* e5 o - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
/ i7 @1 E. n$ c z5 d - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% }4 C7 W6 D$ G
- echo '<pre>';& Z$ W$ v# q8 N* V* f# p
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" P! t4 R% Y' S
- $bulk = new MongoDB\Driver\BulkWrite;
9 V3 i# j. D/ C3 | - $bulk->delete(['name' => 'JetWu3']);
2 M8 p# a! d1 @8 Z9 y - $bulk->delete(['name' => 'JetWu4']);! K5 H& E0 o1 e
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认/ {! `9 O# C6 B: x1 r+ A3 M: G
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ Z2 N8 \; G4 |/ O% i+ q
- echo '<pre>';
, {3 O$ A- q! g* N7 @ - print_r($res);
复制代码
, B' K1 F# {+ `+ p" d# Q! M6 `( X
0 D2 @( ^7 _9 m) o$ l ~: {, S7 F. L* Y. C
, C+ F5 F4 n2 l1 X+ {
4 z* K' l! Y. X1 U/ A |