|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
; t2 m( M. K3 c4 r$ |9 C - //参数1:一个数组或对象
* H: Z- @4 V, O' a z - //参数2:扩展选项$ O0 O+ ]2 C& t
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
6 a; j+ r% s" S3 n" i H B; l - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
; g, o+ G0 @8 i; G- p0 j - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认8 S, z( F( C/ {- N7 Q% W* c
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间, E! O! h" n; t2 Z% X
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)7 a. S3 G4 S1 {1 \' K4 C6 `+ W
- $mongo = new MongoClient('mongodb://localhost:27017');5 S; R$ a+ d M! w# ]
- $db = $mongo->mf;//选择数据库& _7 {) y2 X( o9 k4 \5 P/ U
- $collection = $db->friend;//选择文档集合
: c/ ^/ [2 `$ w9 J+ X, S - $doc = [//定义一个文档,即一个数组* a; p' b, B3 a9 L
- 'First Name' => 'Jet',$ f9 [; d7 K! H- v) W d
- 'Last Name' => 'Wu',' b% t$ Z7 E( }$ W
- 'Age' => 26, J# D3 o* ^5 L8 ]8 z
- 'Phone' => '110',
$ u3 A5 L" f+ S+ E1 S6 [' H - 'Address' => [( M% [; e5 @8 }" `1 Q+ s) x, P
- 'Country' => 'China',( D* X6 s. ^6 t! x
- 'City' => 'Shen Zhen'% l: c$ [$ L; ?$ d
- ]," ]- \( [8 k* R, K; `7 F1 A
- 'E-Mail' => [4 u0 e5 a% E8 V2 T/ v/ y8 t7 R
- '123456@qq.com',
& c( K: A! `& u& n" n. l - '666666@sina.com',
' F" b* m E% p3 B, n) U - '8888888@qq.com',
/ n9 }, y Q2 ~6 E, N - '77887788@qq.com'
4 h, X2 g% [2 `% W; R e& r - ] {* ~; ]! x" @! x
- ];
+ u: u7 g5 Z A/ I4 _6 S - $res = $collection->insert($doc);//向集合中插入一个文档
, o. i3 @% |6 c; H6 H/ c - echo '<pre>';
" w K4 i2 ]5 f+ N5 J - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()- M+ F4 D6 ?; B& O1 E
- //参数1:搜索条件, Z& ^: G6 X0 m1 C Z3 E* O
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段' R6 [6 p1 C r1 i( Z5 x- X; [$ A! Y
- $mongo = new MongoClient('mongodb://localhost:27017');/ [# f% e! c: o2 N
- $db = $mongo->mf;
9 {" H8 f6 K: S! \# n" ~ - $collection = $db->friend;
7 w1 Y8 s I( @+ d5 R" L$ s - $one = $collection->findOne(['First Name' => 'Jet']);
. ~9 M" G. r) B9 k0 y - echo '<pre>';: h1 O- h- ]% w8 \- i# Z% X
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()1 ~5 @6 q* x( X8 q
- //参数1:搜索条件
! s7 L7 k' l& I; P' ?# @ - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
8 q& b* ]+ Z" p+ ^+ ]8 q - $mongo = new MongoClient('mongodb://localhost:27017');" K; h9 R% z- w1 \/ y0 B
- $db = $mongo->mf;
3 z* m0 p/ S$ x: q - $collection = $db->friend;
" Z" V( w' o1 o. y, p/ C, {# \# ^ - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素- `. l" J5 {# `- y; g1 S4 K
- echo '<pre>';
8 X3 A. ~1 Z9 Z( X. h - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
3 D) a$ h# l: T B6 f - print_r($doc);* S+ U$ U( ?3 |
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
5 T- S6 N# P3 n, p3 E' T - $mongo = new MongoClient('mongodb://localhost:27017');& e2 t& F! ~ `* Y; o3 m
- $db = $mongo->mf;
7 i# I. T- j9 Y, o" X - $collection = $db->friend;
$ W, g) H6 [9 r) d) f8 W - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
# x- U4 G6 R9 v0 } - echo '<pre>';( }3 ?: D6 B- u
- while($doc = $cursor->getNext()) { Z% b9 O* `8 I, ^" X R$ \
- print_r($doc);, l! G. {: q* O+ U3 L2 `3 ?
- }
复制代码 //查询某个字段的所有不重复的值* t0 H% q# N% S& l! x4 R1 P- l1 Y
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个& |( s- J% E" N5 r
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
8 a! W) }5 c/ u- @2 v - ; A* K: i" |/ Y% P! Q# ~# F' V3 q C
- //$all:匹配多个值中所有值(用于数组字段查询)+ J8 t% W8 b/ \& W
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);1 P7 ^7 L! J, J0 z0 p1 f
-
3 D# ]' g3 J& E0 K x$ x. k - //$or:或查询
; K& c3 x. t7 |: D) \9 ]; O - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
$ T U3 ^8 [/ k+ i4 ] -
- A) @) ]$ t3 Y( P7 X% O3 t- @ - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中& f! Q( R1 A$ d; M& X7 p
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email) J% \; p+ r2 g& v8 o
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
# f2 F! n# n4 g - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个6 ~" T4 a6 X V
-
# R j/ \& p* Q. f - //$exists:根据某个字段是否有设置值进行查询
2 q" `5 X: G1 T: t - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档' D& @, l2 Q1 V* P
- % ?: N7 c7 J+ k( i
- //正则表达式查询
+ H7 h5 K+ V& ^. i. \ - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序 n2 k. T9 u5 e; }0 M$ o
- $cursor->sort(['Age' => 1]);
2 v4 @" j! c# _# R& n - . k: ~7 I( l p, U9 t, @' n, z6 g
- //忽略前n个匹配的文档4 X' B% N; E% j G2 ]/ y
- $cursor->skip(1);+ u% j( W9 \* G; y6 w' B
- 1 j; x+ A4 ~: G9 X8 S3 c
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)( `* M9 N$ u7 _) q( e# n
- $cursor->limit(1);# Y' ]- T! [3 x% }! n4 H1 i
- 0 C5 G+ R4 t( ?" o* c F! B
- //匹配文档的总数 I- Z; @" K- ~
- $cursor->count();% E. H) [& q6 X+ r
-
0 {: K; ]3 n4 m0 [0 A) Z1 p - //指定查询索引. q& `: z" q9 x3 d- _0 v5 S
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计& ? z) O4 d; e. Z. t) v
- $mongo = new MongoClient('mongodb://localhost:27017');
) Z# s; p2 x3 @ - $db = $mongo->mf;5 I, C8 ?& ~; z" Q1 ]1 R4 }
- $collection = $db->friend;1 r B; v5 ?' X; L& N0 {2 k/ m
- $res = $collection->aggregate([
3 l" F' R }- t0 a& j, @/ b) b/ T0 f% h - '$group' => [3 {. g' D) E8 T1 b" i
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
. d5 B* u7 I; J7 m - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
: n7 M9 T( a& I* Q Y* ~ - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
' {% \0 I" `& e9 S8 I - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值/ b j# {* c% ?+ i. M# `5 T
- ]
- ]' B! k* h% {/ ^9 A6 F: \1 B( p; @ - ]);
7 W5 k4 e$ N Y2 ~ - echo '<pre>';0 _9 c4 ?8 g) J' G' U9 S* o
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果4 K7 l/ t/ l, O" M
- : d0 T2 o9 K4 M/ Z5 ?/ ^1 T- F
- $ F6 }5 L# ]2 f. i' F* M
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, Y# b# I/ W* {' V; Q. C' r* [
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。, t6 b$ {6 k, L4 s1 V8 i# o
- $mongo = new MongoClient('mongodb://localhost:27017');
* I; q" H# I9 A, k B3 c) c - $db = $mongo->mf;1 K# S: B k1 i! f- N
- $collection = $db->friend;
" G0 h2 K' w0 @7 j+ ? - $res = $collection->aggregate([+ C( \6 K0 P: W c- f5 [
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
9 [# K q. Z" l# t4 Z - '$match' => ['Age' => ['$gt' => 30]]
8 Y* R, g3 k" z- G - ],
. }2 E$ W$ X5 ]5 }! ?! _ - [//指定分组字段、统计字段& P, Z2 W% w5 o% c( N4 @
- '$group' => [- a% e/ _% C0 N9 H: o0 f
- '_id' => '$Address.Country',
5 U" p5 r9 y+ E+ } - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
2 F% `. { A' ?4 R; j' ` - ]
" R+ @" N. p2 c! W0 N - ],0 a, X% ^" Q$ a# R: j2 P9 ]
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档) [8 [) {* N8 P+ O; |
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
3 `- Z6 ]9 t- V8 f7 p" i - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名( c5 F* B; Y; c. |: R
- ['$skip' => 2],//跳过指定数量的文档
! Z, f+ M2 K$ Y% ^; J; }7 X - ['$limit' => 2],//只返回指定数量的文档
$ W+ \$ i2 z7 M+ b$ S4 w- c - ['$sort' => ['totalAge' => 1]]//排序
5 A2 R! C" d( e: U( i - ]);0 t6 k2 c$ C* Z, P4 u. f4 A
- echo '<pre>';
' q( f' X- j' ]# |7 D - print_r($res);
复制代码
. d; ] ^# p" W三、数据修改 - //update()
/ ~/ `" C* x& y - //参数1:更新条件,指定更新的目标对象。/ [: H. G; d- t: X9 j- ]
- //参数2:指定用于更新匹配记录的对象。
: d" k) w/ a- a+ f0 \ - //参数3:扩展选项组。; H, v8 q+ A! ]! a( s' t
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。8 ^# |' N$ c' F+ A2 {$ X4 b2 x
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
- \& p @& @8 B5 K! O& B - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& }1 P2 Y. L! `# s, t! A
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
# _* e1 H" i& J& j* L5 ^# t - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% b$ ^$ ^; e6 X' a
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 ]& I, @; \* y5 i
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
' h3 O/ j6 j; A1 | - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
! x: `' V) H) y/ Q% A - 3 F) x8 |1 h! @6 k4 W
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值
/ ^: u4 S ^1 T% u S4 { - $mongo = new MongoClient('mongodb://localhost:27017');5 A# q5 H& ?! I6 J1 D8 Z( o& C
- $db = $mongo->mf;, j# k6 X: s' l) b
- $collection = $db->friend;
& ^' n3 m. C* u- _9 X+ T+ v4 Z8 b6 C - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);: \7 s) }6 z( |' j- _+ G( s' | l
- echo '<pre>';
, G2 G9 W, h; H; q% \* L5 c - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
9 v P4 t: i+ ~; J" m -
, o0 z x9 L9 C) X$ f. T% l: R0 e - //$set:重置特定键的值,若字段不存在则新建字段并赋值0 J) m/ e1 W% h- \# n+ Y B) ?
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);+ U6 f1 }) {8 q5 H2 Q+ H4 I
-
1 V: g# F4 `7 z I; T6 @ - //$unset:删除字段1 H1 e2 Y! |' F: q
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);& \4 C0 A7 Y% q
-
* w9 W! N" _! Z- f% k - //$rename:重命名字段,若字段不存在则不进行任何操作3 o% {' S! d% s0 x( O. R
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);6 i& x; r! g- C
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。1 Q6 l' P8 y' B% Q6 n2 S5 \! L
- 1 x- P( E9 Z' K: ^+ K5 i) B' T
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的" w/ X6 c3 t9 I" d. g
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
1 G5 m5 R" O0 l5 N( x -
# Q& }! y9 W$ m$ K' U: u - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
% _+ H6 J4 F: [# Q6 `, w9 T - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
% ~( y0 ~! V; C" c2 Z4 M - 6 c3 u3 j/ }% w
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# q" n! a7 K+ D1 q9 D* j5 a& Y
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);: E. @/ e" k* i+ |+ l5 l* C3 V! k
-
8 N, ~# W1 T) m; ]4 } - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: a3 j3 w h6 s
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);( w" b! @8 E9 ?0 z3 K
- " o0 ?+ [: q2 x" s0 E- C5 s
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)/ _& U4 g4 k) j F' D
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
6 m' J/ A; J5 U1 u* H- E - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);% t6 |. _, m$ y
-
; Q9 D @! Z2 l: N; O% m - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). ?# c5 a5 M) h* { w( a
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
4 j( @1 A; j; } - ' R4 d) ]* D0 ]# b+ K9 s/ T
- //$pull:删除数组中所有指定值$ `1 N# W- {2 M& c" s2 P8 I
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
5 w i1 P9 R; R- P# M- ^ -
! p! O' S8 ?% } - //$pullAll:删除数组中多个元素的所有值. }- l1 o. y: Y! i( h( u
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
/ h0 M3 \& L, p. s/ G - //参数1:希望保存的信息数组
! N2 @: ?/ \+ I" q- d0 L. w7 q - //参数2:扩展选项8 }4 t# }: H4 [6 q# o5 Z6 ~2 G/ |
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。5 u5 j+ a2 U0 `- @
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作! c& H- [' m/ n
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
9 R' f! U l5 M/ m m4 B! L - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
- Y" h4 S% M/ m: g4 K7 b, l/ h. _ - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
% S0 ?; n3 Y- o! `. C) t - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
2 T+ J* Q: E- T$ d - //若想更新则应该在参数1中指定_id键的值。5 e$ H0 H' I9 m4 g
- $mongo = new MongoClient('mongodb://localhost:27017');4 ], j: p9 |( G% t3 H; S5 g
- $db = $mongo->mf;
$ {' y& g; P# g: x - $collection = $db->friend;
1 P* o5 U7 g: Q) ]0 M - $doc = [//定义一个文档,即一个数组) G4 M1 M( M' m/ j
- 'First Name' => 'Jet',. C7 w& k; A, H: D& E a
- 'Last Name' => 'Wu',5 z9 x$ |. E% O# y1 T3 ]3 A& d" r
- 'Age' => 26,
' r3 f2 ]' b1 s- {9 z7 Z. X1 k9 F - 'Phone' => '110',
# j8 C) M" O# T4 { - 'Address' => [( u6 p: n; H* D- G* ^6 Y9 E& `
- 'Country' => 'China',
) s5 _4 c# X2 s! T" t - 'City' => 'Shen Zhen' ]# W+ m( D/ j+ J4 `0 o i
- ],5 Q2 }: e3 X) d g- o6 m. F7 E
- 'E-Mail' => [
2 a$ z7 u! X" ]: u3 { - '123456@qq.com',
8 \. Q) I( S/ J- {& l4 L - '666666@sina.com',
+ t5 U: T; N3 a3 a W8 M - '8888888@qq.com',
~" d0 P, `+ E& y+ W; k - '77887788@qq.com'
- ^4 `& ]4 r+ m$ G' [ - ]
# ^% h* V _& C% w) I1 o - ];! r" x3 p( g4 {! Q
- $res = $collection->save($doc);
8 J+ D/ I1 f% u! s }6 j - echo '<pre>';) R: [+ T9 Q- O5 o- r( P2 W, U
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入 E" W0 q% I8 ], s1 {
) n- P7 ~" D) _% u$ d3 u
复制代码- //findAndModify(): h: ?" S) p# L* d4 R+ P& @8 u
- //参数1:指定查询条件
3 f( w' t. ?0 A: A/ o0 p! N - //参数2:指定用于更新文档的信息' V: O5 S: M8 o% U$ o
- //参数3:可选,指定希望返回的字段" g& J7 _: d' C. q& I* ]7 O$ W
- //参数4:扩展选项
# P' E$ z% D6 l; L$ U1 d - // sort:以特定顺序对匹配文档进行排序; o1 r# k% f$ p) k3 |. I
- // remove:若设置为true,第一个匹配文档将被删除
3 z m, Z! w, y, @ - // update:若设置为true,将在被选择的文档上执行更新操作
2 d$ s5 @! C* x+ R7 t+ r% R - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
! M- p; @* l; C+ x5 |9 @ - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
. W' D7 z6 z1 j. ` - $mongo = new MongoClient('mongodb://localhost:27017');: C4 R* I! m+ e2 y
- $db = $mongo->mf;5 q$ t) ^, G) p' }. W
- $collection = $db->friend;
3 G* K9 N1 _; o2 j - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);! J# J2 f9 c/ s) e* H I+ a+ j
- echo '<pre>';
9 ?( k, O) o- B, X/ r - print_r($res);
复制代码 四、数据删除 - //remove()/ Y$ A: ]* b# p( _! `8 _; S
- //参数1:查询条件
1 h E9 N3 ]6 P3 b+ X4 v' w - //参数2:扩展选项
r( i; V) _+ k1 A% W4 t& f - // justOne:若设置为true,则最多只有一个匹配的文档将被删除' N3 t! Y( a7 n
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。+ E6 ]) F6 ~6 u/ {$ `5 d$ s1 s9 J
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
8 z, [ w5 d' A4 w$ ~9 F6 h& a - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ a4 {* G& L' f I6 e# p
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
2 {8 ?: h8 ~8 X+ `0 K+ o0 ] - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)- c( F! q' G3 i- k' @' W$ e; n
- $mongo = new MongoClient('mongodb://localhost:27017');/ c& n& R# g; K, P% K- L
- $db = $mongo->mf;
; o+ \5 H8 Z' j9 D2 E/ j4 l& e - $collection = $db->friend;
; L& R1 t- w) Y, I - $res = $collection->remove(['First Name' => 'jet']);
! b. G+ g( i2 C! A& e - echo '<pre>';1 W& v" v0 w' W1 p2 I i# w
- print_r($res);//$res['n']表示删除了几个文档
复制代码
( ?, E: ^1 v- ?$ K* f以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
! t/ ]* a& P' V% l( I-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
2 G8 B$ f4 G+ H6 K9 c: \1 f数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
8 `5 | Z- _3 h& B - $bulk = new MongoDB\Driver\BulkWrite;8 u/ l/ X( O# a) M+ B% I- L2 ?
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);+ }9 `, r# c2 B' E/ `- W
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
7 m4 O4 Q6 n; g) p7 @ - f& h5 f' x: l# _
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
- M. d" ?. V; | {% H - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# v8 O |+ c* d! [& g$ u
- echo '<pre>';
- {( a! u& e N) ~ - print_r($res);
复制代码
3 @; f7 ]# e% E0 v1 Z) F. u数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
/ s; r/ X+ R1 f5 D - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);; S& H6 t( d8 {# i ?8 @7 @
- $cursor = $manager->executeQuery('wjt.friend', $query);9 B) ?& V' S/ f
-
. F# ]6 M( e( H% g - $data = [];
+ l2 E5 D0 r+ X: E - foreach($cursor as $doc) {
- L0 R7 z# W2 b8 R {9 H, X - $data[] = $doc;
. c$ g W* W. P6 ` - }
' K; W' {" Z. n$ C" l! K* v - echo '<pre>';" {- v' x0 J6 d" c% N) |
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
( q% P/ n' }$ Q" h0 ? - $bulk = new MongoDB\Driver\BulkWrite;2 W4 a9 q/ f& T/ L; j# k5 Y
- $bulk->update(
% i& l7 e* _' ~: ^0 H) J! Y# Q! R - ['name' => 'JetWu5'],
3 P6 E" I* L# _$ F - ['$set' => ['age' => 30, 'promise' => 'always smile!']]' o$ B D0 F7 ~$ F h8 K
- );
" O4 c' I% F* v0 A, n/ u1 x+ p- B - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认' r( R+ N& R& a: Z( H6 a$ x) f1 T, ^
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);2 v" X( ~7 J. \: C3 E, M5 v# p, _
- echo '<pre>';0 a) O& X Q$ \
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
# p" P; S, k% k# n+ i Q7 }( B: G - $bulk = new MongoDB\Driver\BulkWrite;; g0 ~' N) R6 H% ^- e: I
- $bulk->delete(['name' => 'JetWu3']);% j* i) {# a E! C: Y
- $bulk->delete(['name' => 'JetWu4']);
; C* l {/ A! g - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ T& ^$ K& ~7 }. C1 |
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% x# J! [4 Z8 @
- echo '<pre>';
! b6 w E( F9 y& t' { m - print_r($res);
复制代码 % ?" F7 G0 l" v; P8 e, X; ~
6 p+ A( c8 r( W1 e* o1 c+ H# o
4 l5 W/ i/ Z' ]$ K$ N
3 l6 f; W) E9 L' N7 S& `* I5 b% k+ a
|