|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()8 ?$ r! {/ D* s! R U
- //参数1:一个数组或对象
* W7 `/ x$ r: V* E9 D2 c - //参数2:扩展选项
% M- w3 [' ]+ r3 }) C - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
% x, i$ W" X' u+ J+ p6 w - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志; Z# p$ {9 G/ x4 D; X1 n
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认, J% `+ y. i8 |* c1 g
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
; J) `9 J7 q% H - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
$ j/ X. X0 z5 R: r/ H9 q - $mongo = new MongoClient('mongodb://localhost:27017');
0 e3 e* y2 ^, n2 I - $db = $mongo->mf;//选择数据库7 `/ Z; r- J( k- h% W0 X% z5 G
- $collection = $db->friend;//选择文档集合
! {) E. {0 ~# g) e* P# q4 | - $doc = [//定义一个文档,即一个数组/ N. X2 i* X2 `2 m3 J
- 'First Name' => 'Jet',
3 A) Z% @: H9 } - 'Last Name' => 'Wu',
D+ m, \. K/ d* \/ m! ` - 'Age' => 26,0 F3 s+ j! |5 Y9 ~+ \
- 'Phone' => '110',
1 K' p3 O6 E* q0 b1 d - 'Address' => [0 `% l% I7 Q$ ] X
- 'Country' => 'China',+ d1 |1 N. H+ f" _
- 'City' => 'Shen Zhen'
2 E+ T0 _% k( b: v5 c" ]6 ^ - ],8 v; t( _1 n {0 j% F. l
- 'E-Mail' => [: N: ~3 Y) U6 j! ^
- '123456@qq.com',
3 y ^' l5 S) G! h3 A3 H/ K6 i! ~ - '666666@sina.com',
0 O6 x0 K. Y8 `3 X. H - '8888888@qq.com',
, o% g& V6 I, h& a6 p# A2 o - '77887788@qq.com'2 c: ?5 N$ F h2 C, Y. V+ V
- ]1 j; D* o' ]- r1 c8 a4 u: ^# [1 @; [
- ];* O1 q$ A1 k( O0 E
- $res = $collection->insert($doc);//向集合中插入一个文档, w- d% S& S& R6 p8 P
- echo '<pre>';* j0 [$ @9 U! d7 O; f5 b% q
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
8 p7 S: Y: v6 f- o: d' U3 Y- W - //参数1:搜索条件* e* V$ M& t/ L8 L8 n7 o7 N
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
4 z( a1 ~7 P4 ? - $mongo = new MongoClient('mongodb://localhost:27017');1 [- n% h+ H) H& _9 p5 c
- $db = $mongo->mf;2 _6 m, g$ C' f: R
- $collection = $db->friend;( M7 u$ n' G% o* C8 w l
- $one = $collection->findOne(['First Name' => 'Jet']);
, j8 X- f+ M) N - echo '<pre>';
8 ?# l7 X6 u: I0 i - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
% q- j" W) d' U$ [% c - //参数1:搜索条件
! Z' {, Y/ Z4 _* m$ n7 l/ q - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
5 C# a* m; }+ j' ` B4 ` - $mongo = new MongoClient('mongodb://localhost:27017');7 J# B& o' q, T6 Q- _( u
- $db = $mongo->mf;
: ]8 P$ u$ X7 F1 C/ i# X - $collection = $db->friend;
8 D3 g& i' s% i, x - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
" A( T( E$ c# G8 E; j - echo '<pre>';$ X5 A" b3 ]2 {- J% @/ V
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档, {6 [% h+ R. P' K
- print_r($doc);
0 c3 D/ k: g* m) Z8 w4 M2 H - }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询/ X- E7 ~2 R8 U/ ^6 X9 u+ u6 E- E
- $mongo = new MongoClient('mongodb://localhost:27017');2 t5 _5 R/ X; \: p# _/ F+ m) s
- $db = $mongo->mf;/ l8 R! o5 G: E2 {3 ^# v1 E
- $collection = $db->friend;
& V0 p7 I a4 a - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
1 t* s7 t2 l9 _- M - echo '<pre>';
1 E2 `9 m5 S1 B4 j6 i - while($doc = $cursor->getNext()) {$ _+ O7 H B4 e3 D! _2 b# j
- print_r($doc);3 o3 d0 z) a& @6 B" t
- }
复制代码 //查询某个字段的所有不重复的值
9 f: U, Q1 Q9 g7 l: M. P5 Y* B- r $res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
! z4 t; {* {, F' |2 S) o - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
2 g7 B/ [% z! E - 3 {7 s( l& f4 e% d& z% d/ F7 M- G* ]" v
- //$all:匹配多个值中所有值(用于数组字段查询)
+ U' U2 l) Y. Z6 \3 q - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
( M1 _1 g7 k& w$ E( _! S- Y& y - . ~7 k, q& @6 _- J! I( S
- //$or:或查询" `0 N7 S: y# s- c" _
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);& T" w# e4 ?. E, v1 T5 ^, M
- ; g! F0 i1 x8 _0 J7 p
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
2 b. s0 E7 K. U) d, Q - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
( @3 O$ r" K* m - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
& U' l7 D. L2 k$ n3 k( I7 A. _% } - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
4 {. C! z+ a$ d5 n" D. F -
1 Q4 |# z6 U* _, r7 A% u6 r - //$exists:根据某个字段是否有设置值进行查询
" k# n# P5 U% {5 _ - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: x1 U2 Z: e- g: K' w& t
- 4 b7 v; V+ S: @# o& N! J
- //正则表达式查询8 m4 {2 {. ^9 A; O
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序, C% ]$ r) k' f) m
- $cursor->sort(['Age' => 1]);/ g5 M' Z& V9 u* U3 `- _& _
-
1 r: V1 B, x; G; a, f - //忽略前n个匹配的文档
! T" i& e: o6 o/ W M6 n9 w1 { - $cursor->skip(1);8 P( ] l1 _/ S9 n; y0 p
-
; c: p e0 ~# Q - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 j( t" O: u0 M- L! q
- $cursor->limit(1);
9 Z$ F3 ~* L8 n% z: d4 B4 b9 C -
+ m2 L+ i) m" k2 ]7 @ - //匹配文档的总数$ Q0 ^0 G5 n, T# X, C6 m" @: l
- $cursor->count();+ P+ A, x$ I; W. N! X
- % h; y+ M) H- T% t9 c b
- //指定查询索引
' L n5 P. J& L) Z. ]3 ?) h - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
# _& O7 @2 [8 o- o4 s* \4 p - $mongo = new MongoClient('mongodb://localhost:27017');, e* J5 P8 x) f3 ?1 S
- $db = $mongo->mf;
% b5 q8 S) G* M1 a3 v8 K - $collection = $db->friend;2 S/ x: Z: A* [. c& e
- $res = $collection->aggregate([
# ^* |0 t% A9 V( P' J* ?% I - '$group' => [
* B# X" _: ^8 R7 ? - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组: ]* @5 h: \, G5 a h, {
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1: o" A |+ J! ?1 E+ z7 y, Y
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
$ d7 F0 D' s6 ?" e& E' j5 h - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
" `& W+ u( J6 t) u2 [4 `- U - ]
+ F2 w, q0 F& b7 c6 s8 z% R - ]);( a5 s, t2 E$ ^& O9 e! Q1 @$ ~
- echo '<pre>';
, E# L0 n8 ^8 U' I; f& P( l - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
7 f; [# a1 [, k) m# \) E! ^+ r8 R+ [ - & I" K: S5 H# \# L1 ~6 w& F2 m
- ( w$ l ?4 D. f/ h2 j. B
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序" m @& ]9 q) |: b4 x; Z6 m$ S* B
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。1 r' Q) z4 ?0 W3 k1 J1 U4 }
- $mongo = new MongoClient('mongodb://localhost:27017');
! a4 w; ]1 I3 n; U1 {, N5 v - $db = $mongo->mf;* }. g* ^3 W* L9 K
- $collection = $db->friend;
/ I/ Z n3 S4 I+ V( M o - $res = $collection->aggregate([( p' H5 K- N+ k
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
- {3 V; B8 e% j2 n3 A! L - '$match' => ['Age' => ['$gt' => 30]]
& h9 Y; O1 s8 P" N) g& m - ],
$ v$ I$ j* b& v6 [. K' [ - [//指定分组字段、统计字段4 u- X( Z& `* x. Y$ g& ?9 i
- '$group' => [4 N) Z! q- B" e$ E; M# V
- '_id' => '$Address.Country',
, Q1 z1 C) J: D9 Q3 M8 R - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和6 g6 B ?" }8 e/ H7 V7 w
- ]0 ~/ e& r6 P- B3 k1 z
- ],, ]$ n3 X( x6 E
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
; p0 Q; k# a% Z( U2 o - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。/ d) B. U9 I; j0 k) s( _
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名2 d" M9 a$ [& S. T
- ['$skip' => 2],//跳过指定数量的文档/ c/ Y: ^3 w% e1 W7 g9 x" D- k
- ['$limit' => 2],//只返回指定数量的文档
0 i! g! }' M L# }, F- C5 ~$ B* O - ['$sort' => ['totalAge' => 1]]//排序 r& ~0 H" u, Q0 X7 J
- ]);; P. t; k Y% P! y. p
- echo '<pre>';
6 U3 f f% o( K: y/ _. h0 B! ` t - print_r($res);
复制代码
& _/ n" N8 S5 |( Z" g三、数据修改 - //update()0 H1 F+ B( m6 M! }3 r' _3 T! ]( t; n1 h
- //参数1:更新条件,指定更新的目标对象。7 ^: Q2 ~. `; l" b
- //参数2:指定用于更新匹配记录的对象。
! m/ h% l }4 l! h, ~; i - //参数3:扩展选项组。0 B+ \2 n1 N9 S# K+ z" o
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
9 b8 X1 Z- Y2 h# S, r9 y% A - // multiple:默认为false,若设置为true,匹配文档将全部被更新。# ?" c8 n+ b7 W- V
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
& g% N4 L$ L; [3 f; A; n - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
) a: M' y) b7 v# e2 d$ L - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
2 X) a5 M- B3 {& J; b1 o - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
8 ?3 w# P" ?* [- e - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒). P" e1 D- R& @8 E
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
* @; p0 I6 {, |7 a -
2 w. |( p" |# T) g0 |1 s - //$inc:增加特定键的值,若字段不存在则新建字段并赋值' u" Q- [) q0 Z. m' { {# `: H
- $mongo = new MongoClient('mongodb://localhost:27017');2 K- ^: e1 M% z
- $db = $mongo->mf;+ b0 t0 x' [# k1 n7 @
- $collection = $db->friend;; K# |! i; r* J- S+ C) j/ J1 I
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);( t1 R; S5 j) K1 C/ o
- echo '<pre>';
, e4 Y0 y1 s2 j! ? - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
3 _) A+ {: d! T* s( k+ R; _ -
8 A$ v6 c* N% L! v y/ ~2 I - //$set:重置特定键的值,若字段不存在则新建字段并赋值# z6 i9 ?2 \6 t! R
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
' n# I. U/ Z: Y' ~+ \2 w1 j -
- q# U" \: Q# ]( Y! v5 ^! G - //$unset:删除字段
) x; v0 P8 e6 x& ^) M; Q - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
+ {$ U' O/ y E4 x - 9 Q+ c! P0 w2 r+ K( t0 m
- //$rename:重命名字段,若字段不存在则不进行任何操作
/ m6 P+ { [3 x: {5 r0 P9 W - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 J; Y1 r4 P0 f* X6 C2 B* x
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
; C. D5 ], \5 R3 _; U$ T2 ~ -
5 y1 L* A3 m- u. H9 d3 p) u - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
4 b! v3 {# {3 M3 [& l - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
! c+ Z, E' G. X8 q! _: s, S -
6 X7 x8 {* z0 Q' s5 P3 a - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
; l9 Z; c" [; s) |/ l# H$ B8 W* x% w - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);0 M3 i# W: r7 T' {+ |
- 1 e5 N1 [! s6 u B8 g
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错0 r: l5 o6 D% j% T
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# a! R! y0 n, \/ A1 {# R
- 5 Q+ R! f1 l/ Z* l" o; Z3 f) @
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
, B+ }' u8 q7 ?$ f - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);# Y! [( ?# B* o; K" W
-
) o7 Y& Q+ ?) ?/ H1 Z+ C6 r - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
6 w) Q/ a4 q, W' `4 o - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);- K& u0 _$ K, m, F* z
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);7 E/ n6 U$ J- O7 c F- Q; L
-
# l# f5 ~: C8 C - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). n2 s2 }& Z) |
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);8 L8 @ L/ }$ H+ q
- 4 R$ t9 `$ \4 s U4 F" b
- //$pull:删除数组中所有指定值
' M! ?4 p) W" V) X/ G2 b2 q - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
" ?" S/ x: i7 w- P. @ - " @! n2 V \) H! R, s
- //$pullAll:删除数组中多个元素的所有值
8 K3 d+ _: S7 a% a) E0 v - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
2 _; s# g; y; n/ R4 p8 m) J& ?0 T% l - //参数1:希望保存的信息数组
& _& i6 E. y4 f$ l - //参数2:扩展选项
% f9 R+ T* P' ? - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ g8 t/ w8 X( \" m& }
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作# \- j3 q1 S6 P; W! _. m1 Z
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。' t$ O3 L7 {: V: v# M% k
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
* }% a% K' j7 z" \ \ ] - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)1 n- r7 s8 Y, V! M- k6 [, }& F8 t; ]
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。& V9 n( ^3 O; M4 Q0 c K
- //若想更新则应该在参数1中指定_id键的值。( u. P6 V: ?! ]) f I
- $mongo = new MongoClient('mongodb://localhost:27017');$ A6 `& y: t9 y- y& A/ @* |, T
- $db = $mongo->mf;0 k6 y! c+ C6 `1 S. b
- $collection = $db->friend;
+ n& x8 I1 z/ {0 l4 \ - $doc = [//定义一个文档,即一个数组
% w- o4 m6 R2 w9 O - 'First Name' => 'Jet', |% }: q8 }' e( c. `
- 'Last Name' => 'Wu',
2 U& ?+ l4 B, B0 N - 'Age' => 26,
9 E7 M3 @8 {9 k' E0 m: `2 d - 'Phone' => '110',
# T6 ^% x- }# M E - 'Address' => [
' e- x) f J2 i4 ^6 ~9 i8 c - 'Country' => 'China',. s4 F" P8 S) \( `) W# i
- 'City' => 'Shen Zhen'! Z# ^; [% s6 Q( ]5 d+ w
- ],
1 x/ R( l8 q! r3 ^( ^/ ^' R! Z - 'E-Mail' => [
! P8 @" X2 `/ V3 ]( }* K8 P6 { - '123456@qq.com'," ]+ E/ z4 m e! X) X k; _4 q, Y! e
- '666666@sina.com',
( T7 ~4 t' @! P# ^. }5 T/ S. y - '8888888@qq.com',
* J p5 N5 N9 [" p - '77887788@qq.com'& G7 K% ^" {# c7 H$ O5 F$ K h
- ]
+ Z# j! F) w0 f* R) w7 W - ];. h" Q4 {% y/ S( C0 b# _/ b M/ ^
- $res = $collection->save($doc);3 K8 B0 Y6 Q: K: r @% \
- echo '<pre>';
: C" t" R/ F' V - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
: P$ T$ |; L. O0 i; j b7 N - 5 S: J! B: E* M j4 _/ k
复制代码- //findAndModify()
1 o l# y U1 U- q- z2 f9 h7 E- B - //参数1:指定查询条件
0 n v8 u4 Y& i1 ~. y. ?, ?- l% r - //参数2:指定用于更新文档的信息
% N; ?1 h( | N( W - //参数3:可选,指定希望返回的字段
( y5 L0 F3 D1 B - //参数4:扩展选项 M7 R( O7 e, z3 c
- // sort:以特定顺序对匹配文档进行排序# Y! s; m" v- g6 R$ A4 q. }
- // remove:若设置为true,第一个匹配文档将被删除2 K. G( ~. \! n' t0 L
- // update:若设置为true,将在被选择的文档上执行更新操作, [. p* j7 C$ F1 w
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档* r% x$ G7 ]2 @0 |
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档8 w1 J7 t: M+ _2 \
- $mongo = new MongoClient('mongodb://localhost:27017');0 B" F6 p' h a" E6 u q# j' d/ i
- $db = $mongo->mf;
# K, C) H& l/ w' F) k! ` g - $collection = $db->friend;3 {# q) K5 B. [: Q$ L" y
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
. D8 r4 o& o. h0 x - echo '<pre>';
. e! a% `9 T& S. E, w2 `7 T - print_r($res);
复制代码 四、数据删除 - //remove()7 y2 Q _0 `) s) g4 V* f
- //参数1:查询条件7 @% C) r2 W0 \" @! T( ^; g
- //参数2:扩展选项
/ s- ] i* x5 r9 ^* U9 x - // justOne:若设置为true,则最多只有一个匹配的文档将被删除; @) U" E% Q g3 X0 ]3 A
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
2 x1 k0 l" n& X/ P! W- d- V - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
3 W9 {9 R4 B! B- L W9 Y - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。( D' X1 K8 H& Y' N* e
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
( O5 {3 I: l4 S; O3 k% w* V - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
+ U8 I1 \2 V e; C - $mongo = new MongoClient('mongodb://localhost:27017');
/ Y, E, k0 u" r/ l% g/ I2 j - $db = $mongo->mf;( w5 `% J: y6 J! V/ A6 j& s
- $collection = $db->friend;, O- I' y: T$ v$ M( X
- $res = $collection->remove(['First Name' => 'jet']);
( ~9 G4 x: h, i6 O9 d0 ` z( a - echo '<pre>';
& L+ T& Z: L* q. l% ^& Y( ~ - print_r($res);//$res['n']表示删除了几个文档
复制代码
+ m4 t7 R$ B; L8 }7 o$ Q$ S9 H- c9 o以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
& Z, t+ z; {3 z/ y-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
0 i( U4 N) H0 n数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
, V; W. Z9 v! s* Q - $bulk = new MongoDB\Driver\BulkWrite;
' Z( C/ t& I* ^3 o- E# A - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
0 X6 M0 A% a" f - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
$ [* i: c3 v$ L# _" | - / L" _* Z& U" H5 U. p t! P
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
4 d) L/ u8 P/ ]* l# l - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
) @5 m, W& I0 `# W, I - echo '<pre>';/ X7 G) z& c7 w
- print_r($res);
复制代码
1 r! w9 S( @5 _ C$ D数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
0 e! u1 R$ E0 y, V - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]); K! R* }+ ^3 Z* j# X
- $cursor = $manager->executeQuery('wjt.friend', $query);
1 n# @+ P5 T2 C+ @ Q1 j -
; l$ p$ v8 {' J, N# f - $data = [];. W, n& ^& @$ E- v4 O3 v0 t
- foreach($cursor as $doc) {
: `! G% x7 k- _0 L - $data[] = $doc;
4 }5 L! G, h" D) L8 v( N# a - }3 h; O. O0 q- `! t/ P1 i2 [$ ^
- echo '<pre>';
0 f E1 m E% B" x - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');, _4 x5 F5 m x7 u: |5 p
- $bulk = new MongoDB\Driver\BulkWrite;
+ r1 B* M' Z* K9 P# j- _ - $bulk->update(9 D* E Q% @% w; y8 | @
- ['name' => 'JetWu5'],
" Z3 M5 f: z* R1 [ - ['$set' => ['age' => 30, 'promise' => 'always smile!']]" C% [ O( t$ W
- );
b& \# k; K, C- j7 i5 F7 @/ ]8 Z2 y" K8 |# E - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
3 {; V! q5 G- t - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% H) f! Z0 ^5 w
- echo '<pre>';
H- @% h' A# w. W9 v2 v - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
+ h+ i5 o5 m+ l! E- P( _% k! _ - $bulk = new MongoDB\Driver\BulkWrite;
6 c5 u' ?$ O* X1 t8 I - $bulk->delete(['name' => 'JetWu3']);7 {- E# c7 }9 |0 v4 t/ G
- $bulk->delete(['name' => 'JetWu4']);
1 w$ x' R8 z' e% \: B5 E" W( Q - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认6 Q* m+ |5 _* I, [
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" R% L/ I+ `8 b' j( Q/ C) l8 X
- echo '<pre>';
. ~! z/ ?3 }) d' Z$ a - print_r($res);
复制代码
% z. `5 P. u9 i3 q
) C4 S- x M$ m O, K& d q8 X4 ^7 T
/ l' G% w# p, Y
# g6 e" }" O/ G( _
|