|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
7 [$ Y, K0 u3 q2 X - //参数1:一个数组或对象7 o: J0 R# h$ T
- //参数2:扩展选项
# A9 U3 Z# x, G1 ?5 i - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
: M% A1 j9 i; A3 R1 w& V0 ? - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
( C {& X$ u' T' W) p - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
2 M. t: ~2 ^ p9 e - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
. q. c% ]7 _, B: l' c6 S" M+ O - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)' X W* \7 _! a* q9 w0 L/ M
- $mongo = new MongoClient('mongodb://localhost:27017');/ }1 g( {3 W& C& w" G F1 P
- $db = $mongo->mf;//选择数据库1 E" ?! U0 M' n9 I8 y; M( Y
- $collection = $db->friend;//选择文档集合
6 R* P/ ^2 M! ]+ S) [2 M - $doc = [//定义一个文档,即一个数组
4 c% J. K* p2 f7 g: C - 'First Name' => 'Jet',
x: G" j1 i$ ^3 X# G3 | - 'Last Name' => 'Wu',4 Y$ ?' { H9 }
- 'Age' => 26,
1 { W5 N3 n4 `8 F- W - 'Phone' => '110',
, t/ o! R/ N: R, C$ B" F9 A - 'Address' => [3 G7 }" ?/ F4 M+ y h3 w8 Z; U8 g2 s
- 'Country' => 'China',
+ \& g B# [/ i4 G* P! Z - 'City' => 'Shen Zhen'2 C+ T7 \9 t! B6 v5 W
- ],
/ L4 S2 W* [8 f( y, N+ ]7 N7 b - 'E-Mail' => [
# F9 s2 b& N$ k' D - '123456@qq.com',* C6 B4 h2 w4 v5 K5 b5 s. A) K3 y
- '666666@sina.com',4 F( s. s" v7 j# m- a9 e
- '8888888@qq.com',
2 H( M2 d5 G N5 _# @/ K' _6 R - '77887788@qq.com') T A. N2 D, U ^' u l! l- K
- ]
+ P5 F1 k, Q6 E' J; p! ~ - ];
' t" y7 _5 b6 ]8 { - $res = $collection->insert($doc);//向集合中插入一个文档
5 _3 p- f7 _( m7 Z! A" a - echo '<pre>';
. u% H7 M' }0 I; ~( G( l - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()# k. N4 v7 e; D" w8 P, a8 c
- //参数1:搜索条件; W& j7 [4 h( {. A9 j2 K
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段- p4 R+ }; g3 m. Q$ f u3 }8 J# v4 w( L
- $mongo = new MongoClient('mongodb://localhost:27017');# F* H! T1 ^/ V B# O
- $db = $mongo->mf;* V9 G h, G: i9 D
- $collection = $db->friend;, r+ t- i3 h) T% [# a
- $one = $collection->findOne(['First Name' => 'Jet']);$ q1 t3 K0 ?$ {0 I3 F/ ?
- echo '<pre>';
2 k7 y- O( I9 u8 i) l% |) p - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()* c( T& O) V* A7 |! \: l
- //参数1:搜索条件$ l( C& b5 v7 F/ C
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段8 _6 |+ o# A9 E' W
- $mongo = new MongoClient('mongodb://localhost:27017');
% l7 \% z. @; ]) f( j - $db = $mongo->mf;( Q7 W M7 t" B( `9 ~( H; l H G
- $collection = $db->friend;
; ^, a) _7 \: \6 { - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
' R4 G( W ?" X - echo '<pre>';
5 _6 H. G0 Q4 V9 y2 M - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
" n! H2 ^: _4 D0 q# H. X4 F6 w: g - print_r($doc);9 \. S1 ]7 B; K( r: f3 d3 }
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询) C+ \8 g7 Y; S) V% k
- $mongo = new MongoClient('mongodb://localhost:27017');
, K! T' M6 R! I; l - $db = $mongo->mf;- ^: x: f9 U3 w ~, ]; d
- $collection = $db->friend;( F) z% V3 r8 o! H; W
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
5 E W/ P2 `/ z+ I+ ]" S - echo '<pre>';
+ w- w3 C7 ?7 ]( @ v$ V - while($doc = $cursor->getNext()) {
$ y5 e, g* _5 c' S - print_r($doc);) p, f: G; e$ y
- }
复制代码 //查询某个字段的所有不重复的值
& |6 ^0 \# @- t2 `" c- d# ^" |3 X $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
& n% y) q. p) g+ t) x. z1 w - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);/ {8 f- Y" ^/ `. |2 r# Y; t3 ]
-
5 ~6 n: E/ Y6 R# f - //$all:匹配多个值中所有值(用于数组字段查询)
, C% g- Z" o5 ~! g% U4 C0 _ - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);+ H$ y1 c/ a# J9 B
-
6 Z' B) y+ d; _ - //$or:或查询' b$ a, l- j: _2 \# z
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
1 n8 O( E) t5 Q: m3 L5 @ - 5 J6 e7 B4 I" M3 S9 u# a2 A
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中1 k4 w$ ~( C0 P. I0 H/ A
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
& G P: ] B* f+ g - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
, ~+ ^& B# l9 ?2 j3 E6 [0 h - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个* c/ a2 D1 y7 b P) W' B: ]9 W' l) \
- + o* H% ^8 E; [1 j! Y0 O2 ~. }! i- S
- //$exists:根据某个字段是否有设置值进行查询
7 N% [- Z2 \( @5 F - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档2 A) U6 O9 g- @
- 0 n; [4 N$ O+ e& d
- //正则表达式查询 a$ H' v5 z# h. D! J& Y
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序; e) P& J+ {6 J! S) |
- $cursor->sort(['Age' => 1]);- l7 b1 X$ o8 J3 S; [* v
- 6 S$ H7 l+ |" K; r
- //忽略前n个匹配的文档9 K0 R% s3 B7 l9 ?" g1 H" G
- $cursor->skip(1);
* `1 |; P# o# G# O0 O - * `# \# J. _: Q* s1 n! E
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
2 q) K$ C9 o! U* \ - $cursor->limit(1);
" S9 j' r" x- M2 k( P) f& i! W -
% I% ?% H& k. M7 D% B ` - //匹配文档的总数; F/ @2 v4 W4 g9 {2 C8 a
- $cursor->count();) t$ {+ L9 s' ^5 A" W9 n
-
# A' U- h2 Y/ F$ c3 I! b: W - //指定查询索引% W) u, H k( G: w+ U
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计% n/ z8 f* ]' f, r5 p
- $mongo = new MongoClient('mongodb://localhost:27017');) V4 d6 L' s$ z) Y6 d
- $db = $mongo->mf;% I$ M; }; X- e2 \- e# T
- $collection = $db->friend;
" M% j; l( ?% t3 W) F - $res = $collection->aggregate([
% B# n. F2 H9 w( r. B - '$group' => [ l B1 e2 U8 l
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组9 w8 R" \, l1 E2 g/ S& S" [5 [
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1) C) m' R" h* |: c# j8 [
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
! a3 b4 g' n+ v - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值5 l' L3 @8 v8 Z2 P& m
- ], s% @, f% c4 W( d0 z# h8 N/ b
- ]);
+ j$ u, E9 E, b" \ m3 K - echo '<pre>';
7 _" @/ l4 e4 V+ {1 S8 J+ Y - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果, o6 \7 D: J& b8 y% K8 ]' h$ B3 j1 d
- 1 x) t/ p4 y g) A
-
/ s: S' z; u1 @* c - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序) \7 O; s& U( w# V% d, I
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。4 m" H% q7 C1 B7 c: F7 }% ^* H
- $mongo = new MongoClient('mongodb://localhost:27017');
+ P1 {) E7 `1 y0 K! {' [+ e - $db = $mongo->mf;
1 _( H4 r* u2 t1 L - $collection = $db->friend;
1 i% S7 h0 `- _+ `' K$ S( V' `4 l/ J; T - $res = $collection->aggregate([
0 Q( C6 C9 u, |' j3 o; |" h - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
+ _ q. t" i0 b. a6 | - '$match' => ['Age' => ['$gt' => 30]]
% H6 c2 p" ~/ R' T# J1 ^/ I - ],% k' S! P. D3 D/ t& B! ^! t6 ]
- [//指定分组字段、统计字段% |& E9 y* f) f
- '$group' => [
G$ M! p; K/ L* C - '_id' => '$Address.Country',! L, }0 D2 t1 O) ?0 S% m. N
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
8 w+ N) X% l3 r( A) B, ~$ u& @, W - ]1 x$ L; h/ c, c V+ s0 B
- ],2 [$ g6 o. {3 o4 R5 ^; E
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
, r: t P& C) @* q - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。5 d- J$ R. }% k" c v3 S
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
- G/ o2 M0 ^' ^ - ['$skip' => 2],//跳过指定数量的文档1 Z/ e5 R( p" P# l! P
- ['$limit' => 2],//只返回指定数量的文档9 y! h8 I K, z8 ]
- ['$sort' => ['totalAge' => 1]]//排序! h1 N7 i! | g. t# T! v6 ]
- ]);1 d- y3 U3 ~! _; {
- echo '<pre>';& k* x( [* e$ i$ i% ~
- print_r($res);
复制代码 & F% X$ c- {; n6 V( F& Y V( w
三、数据修改 - //update()
* y* p# ]2 |# O g! m2 K; L* { - //参数1:更新条件,指定更新的目标对象。* M+ q3 l3 `' I$ p
- //参数2:指定用于更新匹配记录的对象。
" ]- u# l: X% J# W1 p - //参数3:扩展选项组。( H2 j. L& I- r3 @5 F0 f
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
; ?) B' M# k% }9 x - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
% H9 r c: A6 F' q& B1 f0 | - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 ~5 W5 j/ `) z5 r" n
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
# u. Y* P8 D. A" c - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
4 `* z) B/ j, O; P - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间. V3 d. W' X$ N" h& J2 f" `: K
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
- z$ P* U! Y$ O. H - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
7 f. C: T$ s8 K& i# | - 7 E6 U4 y# D. c7 _
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
8 [% G, z' ]- `" x - $mongo = new MongoClient('mongodb://localhost:27017'); m1 A3 A# ]) @& `5 A" I
- $db = $mongo->mf;
& @, ?$ L& s* } - $collection = $db->friend;, Z) A' \. W' a+ {; E) m9 v$ o
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);4 o6 x2 c$ K, c1 b/ R, J( e9 [
- echo '<pre>';
2 o4 W: H6 T* f% s# v - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量4 Z% q9 I0 x% E6 E' K
- ; ?; z- p d7 H$ y* p) M
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
: ?; T$ `$ }6 ?& R - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
" W1 d4 i' o! @, k8 b2 }. K4 \: x - 9 K( ^0 k5 R6 f9 [8 M: D
- //$unset:删除字段
) j4 S! i' p: \+ P& a - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);- ?3 f0 J' Y9 ]; [0 `# W
-
0 |. d0 F& G+ G0 H5 {5 g8 Z7 D( G3 i) r - //$rename:重命名字段,若字段不存在则不进行任何操作+ Y Q2 Y' D' I/ |
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
3 f' B+ C$ H( t& ?, p) B h - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
3 c0 W3 |, z3 A - , r; g$ A# z- d! x: e7 O' A
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* q K0 I. D t0 T; {1 ]$ a E - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
3 p8 @0 z4 H, _5 n& ]+ q -
0 X- X4 V+ `; c8 j8 Z- z - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
, h, U& d; o4 c. w* r( Q - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
7 n, L0 E' y0 n6 U- n -
3 \. s0 L: r0 |6 L - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
: M& q* A9 o% B% @, D( s - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);8 }3 F( t, e* r9 {. r8 x5 l i
- " k# {" Y4 b8 T) O- J
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# \; k! v: ]6 G% {2 k
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);" i1 j; {* ~8 W8 x( [1 A! P# F3 ]
- 9 J% g9 E$ a9 ~3 V& ]
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)! j q4 }' m2 ?+ n' M0 u* I
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);4 S7 I7 d/ Z* y2 s; y
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
! j- V6 P4 _1 w2 a" _ - $ j& G# H/ h# t9 S! A2 ]
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
: j9 s1 }, V( l# \ - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);/ M @. o( O( I
- 9 \0 n+ S1 W% Y8 g5 H" Z3 K. x
- //$pull:删除数组中所有指定值
4 v# l7 c. \5 R ` - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
; u9 v! h( p! [ - & J* ?8 Q( g* n! p1 D, l
- //$pullAll:删除数组中多个元素的所有值
& `, a I! m" L; a5 ?3 a5 t( B/ T - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
6 `- [" `2 R) {& ]$ G5 c; L* ?' | - //参数1:希望保存的信息数组7 x1 d4 j& f `2 L& w2 e
- //参数2:扩展选项
& V, C" X) T$ v% z! N6 t: | - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& h; y) `6 z( t1 R0 a8 w
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 R n5 {' Z- b( Q
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
2 b& d1 ~& |) X7 Q& [ L9 a" l1 } - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 E$ v/ V* z+ n
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
( x# n( L1 K- ?! C9 p0 l" K( P - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。) m4 E$ `% G# p+ ^4 u/ N6 i
- //若想更新则应该在参数1中指定_id键的值。% K V/ u/ d& j% B! E
- $mongo = new MongoClient('mongodb://localhost:27017');
- T, c/ `' Y8 M7 Q0 h* y - $db = $mongo->mf;
" x4 Y; G1 h; p+ D$ P - $collection = $db->friend;
0 R, s# E0 ]: ?+ |9 z! i$ { - $doc = [//定义一个文档,即一个数组
& _& p$ V& O% J x3 a5 _ - 'First Name' => 'Jet',
s! P/ `/ U0 K - 'Last Name' => 'Wu',
8 {- h% G b7 i- T* C5 T - 'Age' => 26,
d" t# e: M# g1 U9 r - 'Phone' => '110',4 @1 I$ r3 ]9 d2 }9 f, ?0 g
- 'Address' => [) c! i! I$ }' t- C7 D
- 'Country' => 'China',
7 I) @) X9 k; [! ]; D% z2 ] - 'City' => 'Shen Zhen'$ g, U! k3 A- c: m) l' p
- ],
7 u H9 c. A5 l3 q4 r - 'E-Mail' => [) X6 H [$ F5 Z$ v! n7 Q- S0 A
- '123456@qq.com',
* G+ w' k" D& A, o0 [0 H - '666666@sina.com',
/ R* m6 t& q$ \$ d7 z% u - '8888888@qq.com',
9 H7 b5 J; M, A - '77887788@qq.com'
- y" n( ]* F- S F! F - ]
@5 \4 b# f% \- k* H) { - ];
' m5 C! m3 L5 h$ [ o% G, e - $res = $collection->save($doc);; @2 J/ T1 H- G% k
- echo '<pre>';2 V5 Q, j2 ^2 _7 c+ n, ?, @
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入/ O5 Q, c+ R4 E/ |
4 f8 ]5 U5 W r% c/ P2 V
复制代码- //findAndModify()
' K; @3 f3 n) c0 L9 U0 e! W - //参数1:指定查询条件
6 U8 A& G, w$ A0 D - //参数2:指定用于更新文档的信息
2 q! h' L* c8 g$ K9 W - //参数3:可选,指定希望返回的字段; p( D% s# R7 P1 i0 Y0 E
- //参数4:扩展选项% t; I* J# Y, M, ~' o8 R, X1 Y
- // sort:以特定顺序对匹配文档进行排序0 }( w1 r6 S0 i& S, T2 w
- // remove:若设置为true,第一个匹配文档将被删除: X) \& n8 v) J- [8 X
- // update:若设置为true,将在被选择的文档上执行更新操作: K( t7 z* b3 ~4 i# z% M2 L
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
* R, V( S7 [) q7 e# t* @( @ - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档# f6 I2 ~* @" H
- $mongo = new MongoClient('mongodb://localhost:27017');+ M% t7 d% a4 m: ^
- $db = $mongo->mf;$ s& R9 F" J$ M: D1 O* E2 o
- $collection = $db->friend;
6 i* k$ B! k* {) r - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
k6 z2 S& e& t - echo '<pre>';
* i5 u6 P" G: p$ w: m - print_r($res);
复制代码 四、数据删除 - //remove()
5 c8 E( v. [9 f+ Q: M& B - //参数1:查询条件
+ f+ d4 Z$ { {; @, H - //参数2:扩展选项
# H: i) u" f s - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
/ o: K! T' j( r - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。9 N0 M9 A+ @1 ?3 ^/ }# P) D
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
$ M7 v# o# R8 p/ p* s' m! [5 J - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% Y! z7 t3 C; H0 w( ~. s( H: M
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
2 B y* @1 z$ W - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒) O3 ?) i6 S4 q
- $mongo = new MongoClient('mongodb://localhost:27017');1 ?5 c5 K: H$ J. i4 L
- $db = $mongo->mf;
# R/ L# H( k, F& H - $collection = $db->friend;
- p2 M) H5 [3 `/ l& F: @' m - $res = $collection->remove(['First Name' => 'jet']);& c7 h# ~$ A# F% A
- echo '<pre>';7 U5 |2 y8 j9 k/ K8 x& b& q; o# ?
- print_r($res);//$res['n']表示删除了几个文档
复制代码
6 x- ^2 ^% z, A. x( D以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
0 ~0 O; ?2 A( G* l! R-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- 4 P( s4 a2 O) z
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
8 T; Z1 s1 q0 l9 S" T - $bulk = new MongoDB\Driver\BulkWrite;+ B7 X% }6 Z W" _
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);4 J* P: N/ m2 D
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
6 {' T2 z' q6 B - ' v2 H% U* M4 g
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 C% {" }+ D& z8 A; [' A; t. g
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
( @8 K0 T9 R0 B3 g3 i0 g - echo '<pre>';. O0 _! Z- j' V8 p: N: L
- print_r($res);
复制代码
3 Z! C9 I. J9 x# @1 ^% k: l数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');+ h( D0 o$ ~! ?* m9 u* z$ [
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
, q0 g1 I- {. m! H: K8 T' B - $cursor = $manager->executeQuery('wjt.friend', $query);( Q! h B. H4 ]; H
-
0 |7 w9 D, e$ Y p( y2 ^7 Y - $data = [];5 z! w3 y0 e! S
- foreach($cursor as $doc) {
7 T, L8 B2 H% E& I) w - $data[] = $doc;" n! G5 l5 n1 f. B4 W3 i7 F, F
- }
) }# T1 O" d/ z- j* W0 q - echo '<pre>';
5 b" Z" E: ~" `- Q8 L# @; d - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
4 }% X R& J& n - $bulk = new MongoDB\Driver\BulkWrite;
5 P w6 u, t" P5 X - $bulk->update(
& H$ c3 q5 S# V6 G6 c% }' I2 i$ [ - ['name' => 'JetWu5'],& G: ?1 N' J0 v4 T' B4 ?8 e8 C
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
+ E4 t: x* Y3 A$ b" D - );
8 g9 \5 `- r( s$ R: _* s1 ]8 ~+ ` - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
, _) v% X* h1 Z! ?* K% i - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
. s) Y; S" s! v0 f/ s' w. C - echo '<pre>';
6 g9 k4 A9 M$ E" A) y+ |. [ - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
% ^4 m4 F: t5 M8 }1 y - $bulk = new MongoDB\Driver\BulkWrite;
0 c7 @4 C0 g: K - $bulk->delete(['name' => 'JetWu3']);+ n3 A' j+ @; Z) J+ ]
- $bulk->delete(['name' => 'JetWu4']);( B5 z0 J" g5 G: k Y0 U
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 b9 k3 N1 p8 a2 y+ s) T( Y
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
& G6 Y5 ^) [' N# o9 D" ?4 h3 l* p - echo '<pre>';
+ {7 L. O% Z" U: h* i' C2 g - print_r($res);
复制代码
0 M. s0 j) a6 E" K. _; s6 d1 P( `
2 r" g# U! Y9 ]7 I* t0 o0 X4 i" J
% {. u! O6 o: d3 ]6 |/ W9 ~5 l; w; |* j
. U1 w! b% p* P' K s
|