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()0 t2 O* @. s/ h" R, r! `% a$ b9 N7 O
- //参数1:一个数组或对象1 ]8 S: S* O; g9 R
- //参数2:扩展选项
' r! ~! N: ]9 G1 V9 N% _ - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
$ e; W! _/ z- ^$ G+ b& e - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
' d! }& t! J2 g - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认. q, w: g7 a+ W+ ^+ D' {# c# {
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
- K% N5 @! Y/ C1 a7 t - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
2 [9 A# P4 Z' Y - $mongo = new MongoClient('mongodb://localhost:27017'); s; `; s: D6 v1 b# p" r
- $db = $mongo->mf;//选择数据库
) z9 [7 V. [/ I3 C$ E' A - $collection = $db->friend;//选择文档集合- Z2 ?, |# }/ y. e9 U6 d: F! u
- $doc = [//定义一个文档,即一个数组9 t3 D% T [! p* Q5 q6 Z2 D
- 'First Name' => 'Jet',, `: z9 k) ~+ o0 u8 {
- 'Last Name' => 'Wu',
0 n4 ?9 j/ G+ N" l - 'Age' => 26,
' _5 N8 H2 ^; U* D5 Q9 E - 'Phone' => '110',
7 U" u- a Z" h# b+ O, j$ Q - 'Address' => [
4 i$ o( M$ F, T4 h: k( V - 'Country' => 'China',
$ ]( d. X9 ]- t! }9 |& K - 'City' => 'Shen Zhen'
3 H' l: D% M4 t3 N" q( N! A( f - ],
- i! l# L6 _4 a7 K& A+ n p - 'E-Mail' => [
" `' _! M$ H: z2 K9 I - '123456@qq.com'," x' M; y! O& _/ a$ e$ P0 l( G
- '666666@sina.com',
2 X% u# j! B; v! P2 q3 L - '8888888@qq.com',) ?- P5 V1 Z* b! p+ d/ f# A& \$ d
- '77887788@qq.com'$ }8 U& q& s( S ?8 f
- ]: a8 @! F0 }- ^! w* k$ l9 A( r
- ];+ U" r1 V: z% ~0 U4 p5 e8 m
- $res = $collection->insert($doc);//向集合中插入一个文档
# o3 P5 H0 M" R! C( ~ - echo '<pre>';
5 ~' V J9 a4 o" Q - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne()5 h8 p2 r% m" O D
- //参数1:搜索条件
- K* s8 N& X! z0 F, n8 T - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
) ~3 f, c, ^' b c* Y - $mongo = new MongoClient('mongodb://localhost:27017');
8 q" e' s$ o, k( N - $db = $mongo->mf;
8 O5 ?) R2 l' Y6 n3 }! _; a - $collection = $db->friend;
) P: d' a7 C, H3 z8 q* ?3 U - $one = $collection->findOne(['First Name' => 'Jet']);
; @& ] h' L% i3 g; G7 h - echo '<pre>';
$ f, L+ g% |7 Q7 P - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()( n; v) m0 d- N' `& b
- //参数1:搜索条件
& I7 h, @( d+ | - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
' C" r' [7 ]9 v. V4 } - $mongo = new MongoClient('mongodb://localhost:27017');- A- s) E" @1 B& D
- $db = $mongo->mf;
% ?2 S( H4 `, u. @ - $collection = $db->friend;- e6 b8 T G! l1 M3 e( i3 W
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
( o6 _+ v3 y+ E1 K. ]* M - echo '<pre>';' S$ q: c, e) v7 m* N& y" v% |- w9 T0 C
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档$ F% h% Z( A) S# B+ I* f
- print_r($doc);
& R5 G5 X1 J9 Q6 N2 w+ ^( x - }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询1 t) f5 @/ }5 t3 v& U; M
- $mongo = new MongoClient('mongodb://localhost:27017');- W( W: Z$ {0 p) g
- $db = $mongo->mf;: P' E0 v) z O. M' [& A; [6 Q( d! C
- $collection = $db->friend;+ `9 V& ?8 b9 k& u h
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);' X8 |) M9 C1 e1 F/ }' L% A/ d
- echo '<pre>';
4 P( A5 H% U: M p c3 e) h - while($doc = $cursor->getNext()) {# ]2 {* z1 T' z7 o& X, W; Y
- print_r($doc);
& g" z4 S! p5 }4 ]$ S0 ~9 ^& K - }
复制代码 //查询某个字段的所有不重复的值- U: W6 E- D5 i6 s
$res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个3 S: @$ Z+ m+ l! X5 X4 M& l
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
; Z# C5 u; x! M* J - 5 y p, Q2 v7 I* y
- //$all:匹配多个值中所有值(用于数组字段查询)
3 d; a# P3 n6 h: p9 k7 v u; h% X - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);& o, E' _0 b6 G( f+ L6 q
- 3 p) {, L0 ~; o3 e
- //$or:或查询
) a7 _6 a. ?/ B% s _% I - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
) b0 a0 j h* X# H! Y, `$ h; Y - : a7 V* @' _& [! r
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中: I5 R) z4 D! S# e: }, z
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
+ ~/ l# _( f. }" u: V; v0 [( P - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email8 E- A# g1 x/ o) I1 s( R4 m/ U
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
0 T: N3 s L2 l$ g! } -
8 w T" m/ ?" b3 ^6 J - //$exists:根据某个字段是否有设置值进行查询
, |: `7 [; F0 N7 E& \; n - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
W5 j4 K3 k4 l4 \0 p; G6 H - 1 G; T$ [% e5 C1 m6 d* i2 ~4 h4 J' `; a
- //正则表达式查询
, M; G" J( Z2 w4 O8 M, n4 j - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序# f0 \2 D* Q. s. U: w) o* X
- $cursor->sort(['Age' => 1]);
" a) I' b7 F1 X7 e! R" C* h -
6 d) ]) R3 g7 a& o( I& Y3 E - //忽略前n个匹配的文档1 }4 n2 q% p# {: T2 A7 _
- $cursor->skip(1);9 T) N4 Q6 e, N! k6 G$ Q& u4 I; h
- / x4 C" v: c, F, g. X+ ^+ ?
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
3 L' s, a1 H& _2 F! A - $cursor->limit(1);
/ ~' ]' _0 ^% D5 o, t8 F -
" O6 E6 W2 j8 j - //匹配文档的总数+ g, i- o1 S% w |! K
- $cursor->count();" ]/ I5 J- L# F8 ~. n( ~" V1 O
-
3 p# c/ u$ z8 g: h9 J* O - //指定查询索引
( A, ]' w0 ~9 |# x5 ? - $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计) \" L8 u& W: w$ M1 k3 E0 F2 m! A# \
- $mongo = new MongoClient('mongodb://localhost:27017');- O+ I& ^# z9 M8 J! B- Y# L1 X
- $db = $mongo->mf;2 C$ I' |6 H! N& k2 l
- $collection = $db->friend;+ z* p( L- {( }. U/ N9 `% {
- $res = $collection->aggregate([5 n7 u4 Z, d% v. c
- '$group' => [
9 U. @5 R4 X! Z, p, B - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
! m/ l* c+ v5 E! G7 k1 T5 d - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
) R, o5 O9 ?$ j - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值! @" y3 q/ V+ n
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值5 @" T6 X9 E( f7 Y* J7 f+ h X
- ]; o& l( `9 |8 R% t, u" V& e+ Y( v
- ]);
! [4 G7 h/ O, q# r7 F - echo '<pre>';( p7 i, J! i6 W) ]& M
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果+ R$ n8 |" z* \
- % U, S: J1 @, m5 o- Q/ ]8 _& \7 V5 Z
-
% S: q0 L' Q5 s3 n- r4 W - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序$ `4 d( Y+ S j. @; B. [
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
) H5 J0 c0 u. z+ A$ H# O - $mongo = new MongoClient('mongodb://localhost:27017');# n, A6 F+ [2 P& b/ L) j+ D! {
- $db = $mongo->mf; S4 |# J( N# Y7 \3 [0 @
- $collection = $db->friend;6 Y' p1 M" i- x
- $res = $collection->aggregate([
- f3 ]0 Z+ E/ g. C# n: s3 S; K - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档7 h& H7 n8 _- U6 g' E
- '$match' => ['Age' => ['$gt' => 30]]7 Q$ t* K( H3 O( v3 H, P
- ],4 Y0 E4 m C1 g% Q$ B/ e
- [//指定分组字段、统计字段9 q: q4 G0 J$ a# E7 u) u( p
- '$group' => [4 ]5 t$ r, W0 y/ K
- '_id' => '$Address.Country',
. ^( _0 s& ^. _8 |6 T) p - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和4 b. K( x) [2 w( b
- ]
3 s i- R7 c5 q# n2 P - ],
- e% p9 c7 m" L6 s. V( k* u - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档0 @9 C/ ~: g" v
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。6 w1 K, V3 z6 C. R4 ~# _+ `) i
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名7 w9 a# A$ { q: I
- ['$skip' => 2],//跳过指定数量的文档' {) X- b" a( }$ L" l+ Q* L
- ['$limit' => 2],//只返回指定数量的文档3 R( V: t$ K, t9 e6 h/ a& `
- ['$sort' => ['totalAge' => 1]]//排序
( n9 ~9 z) m$ L& e/ k4 a - ]);
& a$ w$ x6 E+ l+ B( y8 L! M - echo '<pre>';
$ A* }2 L1 V; S/ z7 Q2 y - print_r($res);
复制代码
: a9 Z9 A8 ?; i三、数据修改
- //update()6 z1 ], b5 r$ Q. X6 i
- //参数1:更新条件,指定更新的目标对象。
3 R0 u: c: V: z4 S - //参数2:指定用于更新匹配记录的对象。
: C# L$ C" b: q x/ z S M - //参数3:扩展选项组。% h c( E7 L# _
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。# O' b- ~+ G) P9 x' h+ }
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。) {; w! z7 E, L+ o# ]; @- b
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。 u' F$ W: [4 ], X1 C
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作0 m# ~7 p9 Z6 e1 c( H
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- ~% Q1 d/ e' y* l8 U+ Y& v
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
9 m. o; B0 N J2 Q+ V) o - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)5 c' }5 w. L* x7 o
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。! g+ h* ~" a6 v# y
- ! ]' D$ H/ [( q- R& x
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值/ T: y5 Z6 j5 @
- $mongo = new MongoClient('mongodb://localhost:27017');% h8 m E7 k0 Y; u6 T
- $db = $mongo->mf;
# e% \+ u6 M& Q5 H3 J3 m E; \8 M - $collection = $db->friend;
; u/ B9 D: u" Y+ {# N; T - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
, Y9 q9 _! L, k: S3 u$ y - echo '<pre>';5 U) ~( Q& p: j
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
x$ Y+ n! P) a -
. f3 H% Y8 d+ W8 \& `, g1 s - //$set:重置特定键的值,若字段不存在则新建字段并赋值
4 ]% a- }. R8 v" a, y' q/ o3 m - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);1 u& H7 p2 |" I" ^: d; v% {' h
-
H9 b! }) U7 j- {1 F7 ?* S - //$unset:删除字段% g! t& m- l! F
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
+ O& S% k/ u* z; P - 8 Y; N/ P# n- m
- //$rename:重命名字段,若字段不存在则不进行任何操作
+ R5 N, U d( F6 o, W8 D' b: A - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);$ K0 X" O4 K) |/ a) x
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
% w& _* _/ a) f5 S -
Y$ M, J' Q# i( X" t4 T - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
; L' a3 X1 Z g% \) i - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
6 z3 u5 b/ Z1 v2 S - 6 f( X# |; s8 C# F: E6 d
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
' o/ w' D, b" ~. D, [, {6 u - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
& q) ]) p# Y/ W$ U -
8 h, ~* C' z3 i& O! r+ N - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
6 V# T3 S0 }3 a# @ - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);: ~" o# a4 I0 t" x" s8 t
-
! h9 `* o, X, T3 X: s. G' P - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
* l: n% z" ]$ D& F: B# @5 h7 X, f' x9 ^ - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]); Q' \! a: V/ r) `. R; T4 N( k
-
5 W; R7 r B2 n) x& E0 M; d - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
) a+ ?& `: n: w: L0 z, B" B6 v! { - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);# B$ H4 I2 O6 s0 G9 P$ j; M; a
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);; \% M) w" k' ?, Q" ~4 f
- " l' N) ^2 G. z6 h; M( T
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)! g2 ?2 g3 u' b5 P% w
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);) \. K' b( B! b0 r; |8 ^
- 1 P6 ^# k" i: T2 _
- //$pull:删除数组中所有指定值
! r8 s( G0 z( b3 x4 Z* E& x+ {) m - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);, z* @, B4 L6 {8 e+ V
-
1 t9 z& p, i. Z; C, [/ T) e - //$pullAll:删除数组中多个元素的所有值
# A9 L4 }' Q1 U/ W* [9 _ - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save(), V! j7 s7 c D4 X! l
- //参数1:希望保存的信息数组7 H# y1 ?4 S2 \) `
- //参数2:扩展选项
5 t* i3 ^+ N& V& w {$ m - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
, j% H/ N) ?$ o6 f% ~8 Q- l - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作9 G0 v+ N; @$ |% o9 }* a6 ~
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
6 S, a# z% C$ P* r2 _5 |5 S - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
7 u2 w# b* |# |" ^9 {0 F$ D8 v - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)$ G+ J8 ?$ |: H/ r. H2 B$ j! O* ~
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。8 W- F5 Y" b4 o; { \2 s
- //若想更新则应该在参数1中指定_id键的值。
# g4 ~% v. i |: _ - $mongo = new MongoClient('mongodb://localhost:27017');
- P8 u! o, w f - $db = $mongo->mf;
1 X" t, C, ~- Q1 D - $collection = $db->friend;" _4 {% @0 Z% z) w& I
- $doc = [//定义一个文档,即一个数组
) P2 |! A' z" o6 f& u - 'First Name' => 'Jet',* f- n) q6 k* Z3 O# c; t
- 'Last Name' => 'Wu',
6 K! Z1 m3 T7 S1 r" P8 D - 'Age' => 26,
4 I/ w0 g4 r0 Z4 P' B - 'Phone' => '110',3 O+ U3 ?9 j6 }, p' c) {! x% m
- 'Address' => [. m! `) w& F. K1 U4 \( @
- 'Country' => 'China',; k+ ?, Y- u4 C% y0 _- s2 f
- 'City' => 'Shen Zhen'4 j* I7 `5 [9 m* C% v
- ],
- `+ B$ N2 p5 k$ T - 'E-Mail' => [
( ]" c5 Y8 R+ n - '123456@qq.com',
8 h9 Q* O7 [9 s! E - '666666@sina.com',8 u8 M0 }, B- P- ^ {
- '8888888@qq.com',+ _; \- w% S7 r+ T& e3 ~2 \7 F
- '77887788@qq.com'
4 H. v6 P1 p# M4 p* S4 a - ]
2 z) S0 u) d0 d! v8 C# r - ];
& j' P0 r# n2 P2 |( M - $res = $collection->save($doc);
7 F) W( {* S& U; Q7 | - echo '<pre>';
d& r( z" y8 s - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
) V" w- x6 S4 |) m& J8 d3 E
. r$ x: Z6 o! ?/ T* q2 ]
复制代码- //findAndModify()( W N7 s! p2 Y& S
- //参数1:指定查询条件
. n0 j+ e1 g2 g# @/ \ - //参数2:指定用于更新文档的信息" A- a$ Z: G& W) ]5 j
- //参数3:可选,指定希望返回的字段* y2 A" V2 O {* q
- //参数4:扩展选项; _! G# z2 V' q+ U# @+ d6 W! F9 P& O
- // sort:以特定顺序对匹配文档进行排序/ ], z3 s8 |, M" H/ N* o
- // remove:若设置为true,第一个匹配文档将被删除
1 K. T1 s2 U2 X - // update:若设置为true,将在被选择的文档上执行更新操作
+ W* j% ?) i2 f2 n6 u - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
, u4 [- ~' F( q' F0 v8 C7 Z( G# B# V - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档5 x3 T9 N6 M K; f; ]2 k
- $mongo = new MongoClient('mongodb://localhost:27017');
, z$ Q: M0 L h& C: ~: ^' {0 q - $db = $mongo->mf;( e( j( V& B8 r" l% @8 Z
- $collection = $db->friend;
5 g$ T7 i6 b0 b& K - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
8 E. P8 n6 [# P6 j& \) g - echo '<pre>';
B4 u+ z8 b6 f7 D/ P - print_r($res);
复制代码
四、数据删除
- //remove()
. G/ @+ h" L/ C T4 l: }4 Q( g - //参数1:查询条件
( i9 U& Z7 D" ?' P' U# E Z - //参数2:扩展选项
5 y9 p1 B$ }7 k. V- R7 I - // justOne:若设置为true,则最多只有一个匹配的文档将被删除
/ ]$ v& F7 L* b9 h) X4 F C; c `9 ? - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% ], N9 [* o3 U
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作5 M7 g1 J# q7 U6 _) \
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! Y5 p, V; R. `* l - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间9 W& d" s% h9 D
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
- x0 s* Z1 M& G5 a& g+ i - $mongo = new MongoClient('mongodb://localhost:27017');- d" u4 y2 J8 h8 X$ _
- $db = $mongo->mf;
. L* u( W2 N3 F - $collection = $db->friend;$ h$ A U2 \% E$ i' P/ E
- $res = $collection->remove(['First Name' => 'jet']);& A) p- g8 |" T f) S
- echo '<pre>';
2 R1 k+ E. l& V' _5 E6 \# k - print_r($res);//$res['n']表示删除了几个文档
复制代码 $ \, K. j/ c" v, ?
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
( Y. k8 \% F% w+ H8 Z-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
3 x/ P3 ]% V& G0 E1 C9 |: E+ ~数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( U+ X0 E. w, m2 R5 `0 C4 q
- $bulk = new MongoDB\Driver\BulkWrite;' }% g: x8 k+ I/ V) M% \) o, H
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);( x8 b: o* ]$ D$ @
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);/ e. N' F i/ C4 ~
- / A) O1 {, I% @. M
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
0 T' L1 M* \9 E) B, u5 k" X - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# x/ P4 R9 K B. ~, N2 B& `/ ]
- echo '<pre>';
" a) H% a) \4 w& f" h - print_r($res);
复制代码
! v9 q% K6 z9 @8 W数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$ C+ k4 o8 O7 v4 B& U% F - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
3 g' @( c8 r! s3 D - $cursor = $manager->executeQuery('wjt.friend', $query);7 h: E# N6 A, R) U3 S
- 1 g; Q, q8 w& r# U
- $data = [];
7 k" ?3 Z9 `0 J2 o( r% ^! x, U* H - foreach($cursor as $doc) {
9 }! y0 p# z& ^+ L9 s - $data[] = $doc;
9 C! J6 ?0 U3 C4 x! K0 ` - }/ G1 T+ e# I+ l) X
- echo '<pre>';6 j* O* X7 [2 e. X: T' X
- print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
, R$ X i4 L* U2 n - $bulk = new MongoDB\Driver\BulkWrite;& l/ W! h/ R/ O) b3 g1 g! U
- $bulk->update(; o/ R- Z7 O( C3 f- Z% L7 ]' M
- ['name' => 'JetWu5'],
/ }8 D8 q w# t6 a - ['$set' => ['age' => 30, 'promise' => 'always smile!']]- i& x; {% d4 F4 |/ V% f
- );. {. G+ ~' k. A- L0 m) O
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认' }9 t9 q, l5 ]2 K- v
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);, d! M7 F) U# }; q( }2 Y" f
- echo '<pre>';% g6 t1 \0 U+ h+ k
- print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
3 X( C; j1 g0 v - $bulk = new MongoDB\Driver\BulkWrite;
/ v8 g+ \+ ~* T+ P6 j" J - $bulk->delete(['name' => 'JetWu3']);+ _3 b* G* w& i& w1 o2 I2 E8 ]2 R
- $bulk->delete(['name' => 'JetWu4']);9 R) N5 N- r6 \4 W8 [
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* O7 J/ b7 M% b! ?2 `+ ^
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ Z7 x: o- K8 P& b
- echo '<pre>';, i) g$ M3 D# S! o( r, b$ s
- print_r($res);
复制代码
! k }& ~# P1 ~ h+ G1 E% X7 F# T N) Z+ V% \
# d( Z- k7 o# ^+ | g% p
" R M, N) w2 P& F: | X7 {5 S6 M& ]$ Y: E2 e
| 欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |