cncml手绘网
标题: PHP操作MongoDB(增删改查)php7.0以下 [打印本页]
作者: admin 时间: 2019-3-5 13:50
标题: PHP操作MongoDB(增删改查)php7.0以下
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。
一、数据插入
- //insert()" j- f- I8 G- R' O2 o5 D
- //参数1:一个数组或对象4 i+ T5 A0 J' u9 P# b6 y
- //参数2:扩展选项 I* G/ q t6 k5 |+ e* S, `
- // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘/ _: W I# a% W3 k/ x; X
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志( O1 B5 e" h- Q3 v% K; @1 _' k
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
- S0 E: ~/ g, U( f+ Y/ u3 |/ [$ a - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间- j" j2 j( c& E
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& b1 F1 [* {' r0 r4 C) M
- $mongo = new MongoClient('mongodb://localhost:27017');
8 x2 X1 F' X7 g' x F: H w- ` - $db = $mongo->mf;//选择数据库
4 }: O3 t$ q% f/ J+ P; J3 b - $collection = $db->friend;//选择文档集合
! G5 o8 \ E; ~1 p2 ~ - $doc = [//定义一个文档,即一个数组
/ | l5 w/ n5 i4 y - 'First Name' => 'Jet',3 N7 S0 L8 Y1 i( b/ I% T2 M
- 'Last Name' => 'Wu',
9 W: V! \+ v1 h2 u - 'Age' => 26,
! q& E! O' r3 G, {6 \; a/ H6 n( r8 p - 'Phone' => '110',
6 A) P2 x8 a! V% D" a) R8 s - 'Address' => [
& J* z% P' i+ [; _" L8 \ - 'Country' => 'China',! X+ ], @# A) ^ c3 Z
- 'City' => 'Shen Zhen'; V% \7 ]4 `, d1 G& E/ l1 H4 \3 n
- ],& V9 ?# }- j/ d$ s9 {
- 'E-Mail' => [: ^8 v4 y U* K4 G) l5 c
- '123456@qq.com',
9 V0 g9 |4 H2 S; R% t - '666666@sina.com',- N& @. |! z) |/ d1 `
- '8888888@qq.com',
0 H. U* D" J+ I0 o - '77887788@qq.com'$ m) _6 ~5 E& t9 `
- ]' \ ~. O! z" f6 L( h% ^5 j. x! t
- ];
1 c8 I. p1 C" S- f) B; @ - $res = $collection->insert($doc);//向集合中插入一个文档
4 K! t" e9 r( E1 p% S. o$ H$ ] - echo '<pre>';
3 l, B( v, h2 z; s - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne(). b8 ]* a- v: _3 L9 T1 l
- //参数1:搜索条件: ]4 d) _# u# D
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段( W) F: i8 V- Q1 f8 \
- $mongo = new MongoClient('mongodb://localhost:27017');
3 D& R+ z6 d" S! _" R5 q - $db = $mongo->mf;3 e& g5 Y- X% c* i
- $collection = $db->friend;+ Q3 v) `2 f; K) E4 s7 c+ Q1 ?9 C8 [1 j
- $one = $collection->findOne(['First Name' => 'Jet']);' q" J, @' |8 h* \
- echo '<pre>';( q7 W) Y) ]' m( X$ W) F4 Y
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()
5 }6 E* b2 R( u+ n: ] - //参数1:搜索条件, p' @& q6 |* K* j) E
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段5 G7 q% s6 X$ ~ J# h5 o
- $mongo = new MongoClient('mongodb://localhost:27017');/ {9 r% n1 r% Y6 r6 J( y$ G/ Q
- $db = $mongo->mf;, H9 p" R, j* E( A' z ^* o
- $collection = $db->friend;
: ]% U$ U1 t( b - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素# c1 ~- z! }3 M- T( m, {" ]
- echo '<pre>';4 N7 F9 l/ M' n# ?# O# Y
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档' f8 x2 V# b% R, B- j! n
- print_r($doc);# I. h. l/ H5 t# Z% g4 o& O
- }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' H; x8 w. w8 s& X) F
- $mongo = new MongoClient('mongodb://localhost:27017');
; P$ N7 W4 ^+ ^; C0 ~ V" X, y - $db = $mongo->mf;
5 F6 C0 i4 ?, F, A3 \ - $collection = $db->friend;' O% c2 w- i) Z- p6 ?* D
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);$ P C8 M* Q0 ~4 }
- echo '<pre>';
! f6 D& d! b; I1 J! Q - while($doc = $cursor->getNext()) {3 q m# e# ]. t' E5 ^3 _
- print_r($doc);! g& D, p- r, G' ?3 f2 g
- }
复制代码 //查询某个字段的所有不重复的值
8 v e; z ?/ `: m& u $res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个4 y! J9 ~+ v& N6 g& s. ^
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);8 A8 l/ \; {9 X$ I, t0 h
-
' g/ M& E2 l; P" ~, q" f1 O. H - //$all:匹配多个值中所有值(用于数组字段查询)* O: S$ u2 L# Q5 `$ x/ m" L
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);* r( Q* e9 M) T& ~. X6 D3 b
- + q" H! V( X' c& o
- //$or:或查询
- j; B/ r$ ^3 C$ o6 s9 v3 R6 _ - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
: E: m% p2 o0 g; O" ?' s' K -
6 V4 ^" [. A7 T; J - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中8 w0 P. K; n. H
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- y3 c1 f% [& ^( m4 H
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email5 R! |6 {9 M* ]6 q1 u
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个* b- u( H" O7 V; a1 ?4 D
-
! s# z5 h9 o: C4 u3 o! w, O - //$exists:根据某个字段是否有设置值进行查询
$ Y. g$ d) x3 p7 ` - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
W+ l" F# y: Z" I - 1 ~7 Y# \- b+ \1 r& k. ?8 c
- //正则表达式查询5 g6 x' a; D9 e, Y
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序7 _4 s3 T) a- D
- $cursor->sort(['Age' => 1]);. z' U d8 f4 I4 \) Q; ?
-
j8 `$ ?7 ]& K' {. K) E ^7 J, i - //忽略前n个匹配的文档
+ E" P: R; ?- P* O3 J. r. F - $cursor->skip(1);* v' M. `% g/ @) a; W3 d4 G
-
/ K P ]- E1 ^$ ^8 u% ]& c0 p - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
1 o" C0 {6 n' b' h. V. ^% n% n8 I - $cursor->limit(1);
. F5 [8 ?: h& I+ ` - 5 Q- I8 V* X( s8 [0 ^: g* z- _
- //匹配文档的总数% U0 L) u% u0 y2 U
- $cursor->count();2 A ^& D% y k. j9 \+ ]( c
-
/ q/ |% ]. q4 P% X+ a0 A) | - //指定查询索引
6 N6 \% @2 F. K9 a3 X) N - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计* I* d) ]; X% N
- $mongo = new MongoClient('mongodb://localhost:27017');; z# \( |' A9 u$ v( ~2 |- R
- $db = $mongo->mf;
, G l: V2 ~2 C9 K4 j8 F: f - $collection = $db->friend;
$ Z" i" b& s" w9 P% q6 g2 H - $res = $collection->aggregate([5 m# h A8 D0 r+ i# B% S
- '$group' => [
$ E4 p* s$ `- V$ E) Z - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
+ d5 t1 l* }9 p - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1% i h' W5 e* C# Q, Q& E
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值6 K' X/ p) ?! K- }+ U/ W
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
' \* A. t7 ^; f [5 e5 w# k+ c' t" q - ]
: C) \7 W, w% @6 v - ]);
+ G; C% Z4 Q. D+ A( n: H+ e - echo '<pre>';
+ d' }; Z& {7 K+ y - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果! I \* `: o2 Z* O, q6 Y) ?' y+ g7 R
-
. {" |* y; k- V, C7 ]% ?. i8 S6 X - . u) @# T) E k' P% b
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, m( g+ {2 S; }9 M. j5 c$ C$ b
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
b( ` {+ n6 H% T+ n' a - $mongo = new MongoClient('mongodb://localhost:27017');; C4 X$ s# S, F( l/ @8 P
- $db = $mongo->mf;
' R$ J9 m# a8 z* h( `2 }$ G - $collection = $db->friend;
/ u8 Q4 h! X0 N# K - $res = $collection->aggregate([
8 z3 D# M- C: x, c8 e$ k5 b! i* { - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 Y+ O0 U0 D3 e# K. {' N
- '$match' => ['Age' => ['$gt' => 30]]
8 D& }- t' c. i9 ]2 ^ o% U9 K; V( } q - ],1 c2 q% x+ r3 d8 H6 V8 A
- [//指定分组字段、统计字段
% u- m! r% F3 ~) T5 c: d% w4 c - '$group' => [* D2 G5 y, n( _* n. ]3 o
- '_id' => '$Address.Country',: u5 v) @" U% n: N- N( x
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和. K( T6 Q" f9 r7 }
- ] u% I! f! S5 }
- ],# \$ m* j6 W) ]+ J
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档! j: w }% B2 x$ w' i4 `' V
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。) o" h# b3 f0 ^$ `& C8 {
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
7 |1 y0 O; J4 @9 A7 M! r) `5 T( x - ['$skip' => 2],//跳过指定数量的文档, H- Y+ u y+ s4 l- z; a
- ['$limit' => 2],//只返回指定数量的文档
2 N1 h2 D4 z/ c8 p. U) B - ['$sort' => ['totalAge' => 1]]//排序4 N @* {+ ~. I, t9 \8 ^) s
- ]);
% A9 s9 a; t3 Z% i' e- U - echo '<pre>';4 M5 Z4 Q8 @0 k1 u& d9 r# e1 R
- print_r($res);
复制代码
; H- a8 Z6 F! p" @7 W6 G" s0 F. V三、数据修改
- //update()
& H" m" |/ s; t8 T, Z0 H0 h& i - //参数1:更新条件,指定更新的目标对象。
+ A; G$ X% c$ P$ {0 d6 U - //参数2:指定用于更新匹配记录的对象。
+ H, h/ L: x J& \% L" h - //参数3:扩展选项组。
3 ]3 W: R" a% F; W - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。: O/ d. v. @+ {8 ?
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。* D; u/ a6 m8 J7 P, L! a( z1 Q
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
: z. G; }/ M; V6 o4 | - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
. v! D* y0 @6 \' u$ { y* e - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! j7 d' b9 C! [* f7 x3 ` - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ L" U& S" Y. U! A& y
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
4 c; y1 w6 E% v" Q' X; O4 ] - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。6 S2 _# G3 Z. s4 [9 t+ ^. {1 v
-
+ f: V1 P i F5 ~* H - //$inc:增加特定键的值,若字段不存在则新建字段并赋值- t. b6 o0 \& U/ ^( O2 ]7 X0 X# h1 `/ s
- $mongo = new MongoClient('mongodb://localhost:27017');
$ a7 X0 T; @# H - $db = $mongo->mf;( C0 y, J' V8 D) b- ^+ c( ^
- $collection = $db->friend;6 V" _# H h9 X6 v4 H/ C, h
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);4 _- f% B+ A) Q+ K
- echo '<pre>';
1 E7 f a! g# S+ r/ v( G9 g2 f; v - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
/ P/ _- R! `0 K - * _4 c7 B0 r* M$ H% X5 {
- //$set:重置特定键的值,若字段不存在则新建字段并赋值
, z5 k1 K- Q* D: p6 i5 m - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
4 k* \; O/ X! \% S4 @' l1 C O - ! k. O/ f1 K$ g) U2 k
- //$unset:删除字段2 ~* V) p% z6 a1 e% x
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);; _6 H+ w0 J5 h/ Q" p$ o
-
* T1 ]3 h2 _0 M$ V - //$rename:重命名字段,若字段不存在则不进行任何操作! ^, y! h! T2 {( ^5 p! v
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
- R2 o$ J3 F4 F2 R - //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。& ]" O. }- W' } l$ U' N' |. l; v
- + T9 @( r, k( ]; Q) w9 o
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的' m0 l3 \. b4 g7 u; O: I
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
' Z$ k- k& j( x! x) V -
! ^( ]/ \4 f4 I3 p% J0 ` - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 ?& M% y/ C$ \/ Q" J& n# ` - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);' `9 M8 k4 }- g$ b
- 2 u5 e3 M9 L$ w& s; S' [& B9 a( j
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
5 h& w! |! ]' \* x1 i6 \6 c - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);; f3 i% O$ `! F) h- p
-
& B8 S( _0 i4 J% \0 Y - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
5 j/ B; B/ M. G3 ?" I' j* [/ v - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
" z- \5 f. H/ w' k2 ^ - . U0 ?! H: }2 c, r3 t1 d. {1 a
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
0 E8 \: a! L! h - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
/ y+ P, S9 W# X8 B% o O C - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
) g( d5 ^/ C4 ~6 ~5 d+ P, s - . }- @, W$ i/ u7 f$ B. P$ h3 X
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)# M4 J2 |7 B n) U$ i5 V& V
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
- y! f( Y6 X: r) F2 W - , ^$ x2 z! {8 z z
- //$pull:删除数组中所有指定值
& z: n# F( S3 F& m5 \. M- X - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);4 d) t* J3 T. X6 T
-
0 J' J1 v! [( N6 [8 q4 l - //$pullAll:删除数组中多个元素的所有值
; _: m- D* I8 A) s. Q' r - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
, L+ h" L' x( h% b* _ - //参数1:希望保存的信息数组/ Q8 e* {; b' s. k* |
- //参数2:扩展选项
) v" b) A& Y: W O9 |# M - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
2 ]1 y! F" U6 C8 Z" w! P - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' t8 ^5 G6 Z5 z( c+ t
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。8 F$ h X5 O5 Z. C8 u; H
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
$ S( ]# ]2 i+ _ i" L$ y7 } - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)% w9 Q8 U1 y$ C+ f/ H
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。4 C7 o# i5 s# A* v$ H* S
- //若想更新则应该在参数1中指定_id键的值。# B0 T7 C" t1 o6 w- S, c
- $mongo = new MongoClient('mongodb://localhost:27017');
. t5 t9 @3 X7 D7 Y - $db = $mongo->mf;) K( b7 @1 p# G( D$ \
- $collection = $db->friend;
; ]$ G2 _6 o4 `! \0 `/ A - $doc = [//定义一个文档,即一个数组9 @. R( }+ l; ?; Q: m
- 'First Name' => 'Jet',/ m F& {7 N a$ D J6 F
- 'Last Name' => 'Wu',% A! O4 X; E8 Z* h6 C9 E0 z
- 'Age' => 26,
1 A: y6 X& |6 @6 G2 E0 T) ` - 'Phone' => '110',
$ I9 w! ^/ g% x6 J2 Y2 M; k4 x - 'Address' => [ |! B& s" i- E$ l3 g: |% E
- 'Country' => 'China',8 Y3 u6 t+ a0 i) j5 v. M# j
- 'City' => 'Shen Zhen'
. A( }8 N6 b$ |( L _, X& E - ],
( X( c% Q3 `, s3 e - 'E-Mail' => [
+ Z& p) q6 i+ e7 B! j7 z - '123456@qq.com',
. ]1 [( y/ X& Z, W5 g. Q - '666666@sina.com'," f6 ]% P( ?( E! ` d
- '8888888@qq.com',
2 N1 J2 f; }" V2 P7 Z- r - '77887788@qq.com'
( C3 e+ q+ |) _4 E. r8 T8 ~; T - ]7 g; Y) O! S. l4 z6 U1 j: V5 k
- ];) A; e9 T2 b9 P, y3 k9 U: E) y$ U
- $res = $collection->save($doc);
- j) ?2 K8 |* v. }5 Z( P. u# u - echo '<pre>';
5 p- a. g4 t6 F! z% G/ m - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
; e7 R+ A1 T' M' R - + G5 G& ?* q* ~( z$ m
复制代码- //findAndModify()2 J, f7 x: w6 M
- //参数1:指定查询条件
# V; ~( d2 g2 ^5 u8 c - //参数2:指定用于更新文档的信息
: C$ X1 ^( } z4 N2 x - //参数3:可选,指定希望返回的字段, R9 |; G( G- F" H" U3 k$ ^! D
- //参数4:扩展选项& {# b( ?8 Q; c8 \) Y3 u4 R' Y
- // sort:以特定顺序对匹配文档进行排序7 U& s5 T, P) f/ l8 }& p8 r3 | D9 a- {
- // remove:若设置为true,第一个匹配文档将被删除
; C" [" `4 n, Q0 j8 d% ~/ J - // update:若设置为true,将在被选择的文档上执行更新操作# o6 V4 q# o. [( C) L
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档+ H' c+ ?1 [ a6 v8 ^: Z
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档- z) h+ H; p/ J
- $mongo = new MongoClient('mongodb://localhost:27017');
4 g2 L9 f% r5 O8 M% o" v+ J+ _ - $db = $mongo->mf;
% ~! U. Q, T2 w, i* a$ V - $collection = $db->friend;
) _ c# R6 r9 M; T( r - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);& [% ^0 g1 q) J* n$ [8 }2 ^% x. B7 i
- echo '<pre>';
0 Z/ W$ f- N, J$ l6 F7 R - print_r($res);
复制代码
四、数据删除
- //remove()
- z. C6 J6 ^ D - //参数1:查询条件, _+ p* \" \! U; @, `+ E8 f1 ^
- //参数2:扩展选项
* E# w2 _1 S3 b - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
2 ~# @ L5 l0 }8 G' b% G5 t6 ~2 c - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
' @, K& @9 Z( N6 @- A+ R - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- G' K( V5 g1 Y( b4 s
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
* P' |% }0 Q: q0 o F# U2 {: p - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 F5 v7 `( k9 W) P% |5 W0 c
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)2 p; d, ?; Q8 ~5 J, [8 S
- $mongo = new MongoClient('mongodb://localhost:27017');
9 d8 o& z3 s% d& e7 I - $db = $mongo->mf;
2 C% H' W( X4 k ^4 @ - $collection = $db->friend;
& s+ t3 s' S* C0 r" y, }8 { - $res = $collection->remove(['First Name' => 'jet']);' A' X, ^+ O* O$ K) L( i
- echo '<pre>';
9 j* H) ^9 u3 R6 ` e4 Y4 ` - print_r($res);//$res['n']表示删除了几个文档
复制代码 7 S7 @+ U& j8 r; A& R% Y# L$ D
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
$ W& N+ O+ w0 j. a/ @-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
* b( Q0 j, O1 G; ~% ^, c9 G Y数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
) e0 m. J' |& C; ~9 m6 v - $bulk = new MongoDB\Driver\BulkWrite;
6 y+ y/ H4 f: l& Q - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
0 D0 \# w" B( ^2 l# X7 ^8 f - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
* K7 f# R$ Y% |) G -
, J6 F/ p/ e. S! Y - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认" Z2 j0 {/ G/ w5 `" F' `8 |7 k& H
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
" v! K- Q+ Y$ G& v& f( r% S, M - echo '<pre>';6 u% R9 |. I+ I6 x2 ^
- print_r($res);
复制代码
2 `# x7 k9 S) E" k! d8 E数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ Q! g( f( X" s' v. p9 q
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
# {( {0 F- J( K4 s. |. q# r; } - $cursor = $manager->executeQuery('wjt.friend', $query);, e* Z2 s' c/ B/ p6 s/ a
-
& _9 W% e# k1 y - $data = [];
0 v, w( P$ ~9 w; A6 y6 {* i - foreach($cursor as $doc) {! F2 }- K1 Z1 X0 w
- $data[] = $doc;
V! T/ A( a* V+ ]! j, L: l1 K - }& V2 a1 j0 N, f- y: }
- echo '<pre>';8 @" Y# v- y( P$ x# }* T
- print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! e# ?) b. _: n7 z: B
- $bulk = new MongoDB\Driver\BulkWrite;
+ A' }% K. q$ F/ y7 F& D - $bulk->update(
6 Q6 b5 h3 G* t - ['name' => 'JetWu5'],$ b4 t2 l0 |! Y* m+ q2 j/ C6 E+ U
- ['$set' => ['age' => 30, 'promise' => 'always smile!']] L g7 j) k0 O3 j; J! q# P2 f
- );
- F2 G, [7 b* k - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 ?# u9 m; J8 r$ [, K& q
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);! b; l% H. Q G& E& n
- echo '<pre>';
: J4 `2 V2 E% A8 ^) M# y - print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
, G2 t) }4 \$ x) p7 l - $bulk = new MongoDB\Driver\BulkWrite;
4 H! a# G. D3 I/ p* Q. g - $bulk->delete(['name' => 'JetWu3']);
( X0 v7 K% I7 u5 I& L& o - $bulk->delete(['name' => 'JetWu4']);$ F2 b0 o/ _# w! ^) Q4 t( [- n
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
3 e; X2 T/ W7 n4 k- M8 e - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);, s5 e) I% m& m) I% a% v/ ~
- echo '<pre>';; d. w% a& ]+ k/ C
- print_r($res);
复制代码
E; d' p5 \! D; k1 t- K& e' m% r( ]$ ~: A Z, H
. |% i* M3 @3 V( |. C) u" z
' z* y, i6 ]! p: c( p+ Z6 _
+ Z; x7 a' Q2 i& K2 k" Y1 Q
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |