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(). b9 E; l( u' b" H) n9 Z+ T7 l
- //参数1:一个数组或对象, f/ \6 t# T9 z2 l5 T. u, z9 H
- //参数2:扩展选项
" _+ I" W6 f: k - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘# D3 n/ J7 A3 @9 z( b6 J
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志' S3 |, [- P b' Y: ~( B- {
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认( }! [% \7 d; _8 B
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
7 S4 V9 C% ]7 D; S) j* L - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
* `7 Z0 u. Z3 w" {. E - $mongo = new MongoClient('mongodb://localhost:27017');
6 O( O8 [$ c' }! x+ T - $db = $mongo->mf;//选择数据库
) A3 |/ J8 O+ }- Z# p - $collection = $db->friend;//选择文档集合9 Z2 i5 M: ?( d! E
- $doc = [//定义一个文档,即一个数组
7 q+ f! b% D8 F# V, } `, r4 E' S - 'First Name' => 'Jet',9 z4 \9 U! ?, ?: b. K- Y
- 'Last Name' => 'Wu',& ]2 s$ w( w7 M
- 'Age' => 26,/ q0 q2 x. k- Y1 \6 F5 K* q
- 'Phone' => '110',
( c" T$ g: A* r: N) t - 'Address' => [
' S* x' M. I3 }& |5 J& P5 y' _ - 'Country' => 'China',0 h% H" t8 h" I j1 R7 b
- 'City' => 'Shen Zhen'1 t/ i/ B5 R- N. N P
- ],& Z M" a* J$ M! I
- 'E-Mail' => [- H* Y' p& I- Y; c3 O. w+ w+ ]/ T
- '123456@qq.com',8 T% g+ q! ~3 g6 r; ?
- '666666@sina.com',
0 z+ W( c3 X+ Z5 J. d% b - '8888888@qq.com',4 ^+ R* ?' ^* a, b( d
- '77887788@qq.com'+ [& o' D R/ Z' w. v
- ]; {' H$ t) y h# T7 [" B
- ];( b+ e S1 x3 U
- $res = $collection->insert($doc);//向集合中插入一个文档
- G$ }7 c! a/ W$ C% t9 d9 } - echo '<pre>';
: }& [) p8 m0 d. _% P - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne()
9 C6 ?, A9 ]; `+ ~" D - //参数1:搜索条件
) y- Q4 \& Y7 ^+ @2 m5 U - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
, W B- h; h. u' U - $mongo = new MongoClient('mongodb://localhost:27017');% F0 ], P( o" m( L
- $db = $mongo->mf;
' U* }" g( w8 o - $collection = $db->friend;4 W$ F7 d! u# q$ v/ R( ~+ q2 R
- $one = $collection->findOne(['First Name' => 'Jet']);
; U' W) A& t9 r+ a2 w+ D0 h/ |5 R - echo '<pre>';
- y* u: s% l, _5 ?+ z' ^ - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()
. u" h! E* |3 F1 [9 F1 x; R. Q" ]6 C - //参数1:搜索条件8 r c9 \8 W9 |5 k! g' n" [8 E+ W% A
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
g9 r5 {% E; e, @" }. a8 I, o - $mongo = new MongoClient('mongodb://localhost:27017');
0 s4 E8 A3 E9 G3 U5 o5 e- R - $db = $mongo->mf;
8 j) H8 H& t0 m8 ?+ V$ @3 E - $collection = $db->friend;/ t* Z' I% H, _
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
* K% O% }% h$ T - echo '<pre>';- N' j; n. `1 d7 Z! r( U1 l6 B3 A; m
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档- E' z/ s# o' B! Z w
- print_r($doc);
0 W' M0 M1 d: Q& U/ O - }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
* ~. }, q4 X" p, I/ s( N* @ - $mongo = new MongoClient('mongodb://localhost:27017');9 c' b7 q4 d: ^. Y
- $db = $mongo->mf;: \) l$ M9 B( ]5 L
- $collection = $db->friend;8 q/ V) t6 F) F- j3 i
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
0 V, G- T8 R# Q% [% h7 f6 k- A& v% I/ ? - echo '<pre>';
: P( z; j# Z; c - while($doc = $cursor->getNext()) {9 p9 H( d, I7 q$ o( Z
- print_r($doc);* q. s& k" Z8 {/ Y K8 l$ ` X" Y4 I
- }
复制代码 //查询某个字段的所有不重复的值$ I: b; K+ {/ V9 x' w: |
$res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个3 K9 O8 ?- \3 e" _" a( T
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
9 Z( _. V* i# @1 p, b5 x - $ f3 L- S: l4 F, Y f
- //$all:匹配多个值中所有值(用于数组字段查询)
8 F W% R+ P0 m* I1 H. p - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
" z: A5 [6 R' O - . b! _% P0 \& N4 c4 i5 |/ H
- //$or:或查询8 q! ^6 M; J& o$ ]8 C
- $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
" u0 P5 I5 E: C& d9 d& ]& y% m0 o - 3 }1 t. P' i+ o( ^" a8 W' I
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
9 f7 m" r- h; w; w* g m/ x4 F, Z - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email, r# M# O1 w3 j9 y. e1 r
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email* Q9 b3 s4 t; z+ r
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个% A5 U/ P5 X0 {( _7 ~
-
" c0 @2 Z" S8 K6 w6 n, Y$ P. u - //$exists:根据某个字段是否有设置值进行查询
% v- `9 N4 ?! G9 _ - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档! M! ~4 a& _+ e5 C- p- B: O
-
- j- n# B9 }' }" x/ ?" p8 D4 N3 | - //正则表达式查询
& A2 A& K5 a* T3 |+ U0 I) h& p2 T- x! x. G - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序8 W( w7 @. N" O. Y+ `
- $cursor->sort(['Age' => 1]);1 T3 L+ K0 V/ h, w: @2 V* H- D% u6 J
- 8 [ _. S0 W0 d) N( c
- //忽略前n个匹配的文档
5 c Q. q9 t4 h+ b+ d - $cursor->skip(1);: ~. r) e) A; Y6 w2 z
- 5 e+ D! n% ^' W
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
1 i& J& t, X2 [' _" }; L# k - $cursor->limit(1);
$ D2 c9 u5 D( `5 S6 A, v% U% M0 d* U- U - 5 J, H: `; p" u* z3 k( f
- //匹配文档的总数
( ~9 |) _# z) u$ F; p& { - $cursor->count();; F# {/ B6 t% }9 `
-
0 B/ J# G3 m O/ b - //指定查询索引: `* |* _$ v: p ]2 n! b9 y& L
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计
, e) z: K, K V6 c! u - $mongo = new MongoClient('mongodb://localhost:27017');: J8 }; F' k* D# g7 ]% }2 {
- $db = $mongo->mf;
* d4 E2 |: l7 b) E - $collection = $db->friend;
& y. e. y# o+ D+ F0 c% I - $res = $collection->aggregate([# y6 g! ~0 i" N' b1 t k) J+ M
- '$group' => [5 f, G3 D; s8 \6 i" u* ?, l/ G/ Q
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
) @% X8 G: d! k0 I9 T - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加16 X8 k* E# r b: X K! i4 x+ j2 Z0 }
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
4 Z# F9 x* c1 J0 }. P; {+ a) B - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值
2 i9 z; A& m4 e% T% T$ _ - ]
( W7 J u; G& w u& V( k4 q2 s/ L - ]);6 F: F# s% N' Q+ y
- echo '<pre>'; ~! Z' A" N7 C7 F, U5 f( f2 g: v
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果: B/ f7 f0 ~! f4 M
- 3 g5 k" q2 k; D: Z$ X4 D
- # [ ?( F4 R4 S8 b" W
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序. e. D4 i" P1 b/ d' V; N& r+ F
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。 i! U3 p4 ~% U
- $mongo = new MongoClient('mongodb://localhost:27017');
7 N" v' d7 m/ C. e5 v' X# J% M - $db = $mongo->mf;1 j0 g8 L7 K; C( l" ]3 c8 p* O( U( S
- $collection = $db->friend;, J) e, e2 }9 \& \9 t
- $res = $collection->aggregate([; G! _9 T* t* _: y' m
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档, y) p. T- a$ w# X: b
- '$match' => ['Age' => ['$gt' => 30]]
: L( ?4 E# Y$ S, D# s - ],4 k2 a6 J( _% j7 g
- [//指定分组字段、统计字段
- m7 @3 ^) p' L1 _2 K. Q3 a5 J - '$group' => [
1 E0 i1 S4 Q' b1 V( g" L" C - '_id' => '$Address.Country',
& M2 f- N6 N) f/ K - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和& T; E: G% |5 [2 w- y7 h) M) |- `
- ]
- t9 L/ e5 {$ P E M - ],
5 D- O6 J4 U5 X% B$ A. f* w: d - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
6 R, n7 P% F3 d1 Z3 _' G - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。! N, D) p( Q/ K
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名 f$ C! A8 c# J' w; h
- ['$skip' => 2],//跳过指定数量的文档
# R" {- Q8 @4 Q5 l' H9 r9 ~ - ['$limit' => 2],//只返回指定数量的文档
/ J1 d9 {& O2 Z; d P - ['$sort' => ['totalAge' => 1]]//排序
4 y4 K2 v6 h" ~. J2 ` - ]);
8 Q+ Q4 B. _2 x _$ S - echo '<pre>';
# @9 n- D( U2 i' d% y( O# l# ?9 Z- M - print_r($res);
复制代码 ; c" \7 C! g$ V8 ^, h/ y
三、数据修改
- //update()
5 ~# i# b0 i+ Y5 O4 O7 ~, x8 I V f - //参数1:更新条件,指定更新的目标对象。
2 ?3 F2 p5 Q1 k P - //参数2:指定用于更新匹配记录的对象。
. c+ f( z9 M% S2 J3 X% J( M+ j$ R - //参数3:扩展选项组。8 j, K8 ~: v V' |2 n. j; ]6 W/ r
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。. S& m4 T, E1 [+ a" i- \6 O8 [
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。0 o& v4 Q9 C# A2 @2 ~0 D0 ~
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) [) O8 C2 m1 o
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
" I3 u/ J4 Q& C P% A - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
& e$ a K' P6 X- ]2 c9 g: y+ g5 B/ H - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& I& c$ k: i u( x& \: l# l
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒), B+ M# `: x' b4 |
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。5 o- R5 h) l6 D: ~5 d
-
: n, D5 ]; H- u8 H e - //$inc:增加特定键的值,若字段不存在则新建字段并赋值5 z& L+ H: o3 g, v8 Q
- $mongo = new MongoClient('mongodb://localhost:27017');
2 ~1 j1 y3 a7 {7 f - $db = $mongo->mf;
9 \8 g5 e u3 v+ W4 `, y# A - $collection = $db->friend;7 R- `* {+ S4 y2 i0 A- s& m4 W
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
' T9 P& u; P# i0 K" a/ T- u$ k' _( d) R - echo '<pre>';
. p! ]4 A0 z* B - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量/ }, d8 [( M% d4 [) Z; s
-
% t! r2 P. J- {* u9 |2 o - //$set:重置特定键的值,若字段不存在则新建字段并赋值& Q5 o" w6 ~, } W# ^
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);% r3 W/ N/ K- z- {. P% w" D% |
-
; o/ P/ A' _$ Q8 O8 Y; K$ w$ q - //$unset:删除字段
8 Z) s2 t7 y* `8 t - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
7 i- O0 h0 f r2 ?0 A -
' u: @ w! |" X, I/ C) O; k, _* F - //$rename:重命名字段,若字段不存在则不进行任何操作$ R t( h# k' a' d. ]! g1 N* \
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);8 i& i$ a' W3 s' `9 ~8 K' l4 f
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
; @9 g) o: b) R- ] -
# u* C0 [. P' w6 {, `1 [3 s2 h - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
( r- }8 {/ X" r! k - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' A- G$ d# E$ N- S2 q
- $ q8 X) e, w/ |! k2 y: {
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
# Y3 x1 H1 r8 _" c8 b2 W' R5 F4 E - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
) T# a( s- r* a; h+ j& C -
$ o1 d) f, Z; a0 Q2 o9 g - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错. ?3 h% n$ m* b1 z. f
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]); K. b H) T2 [, Z z5 Y* _5 _. Q
- 0 a K/ p# {, M- F& P- S1 o& t
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
5 c+ g( {2 Q2 m: y, h" o0 }2 m - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: ?5 n' `5 M' h3 T% J
-
: _, G8 A" k8 e% _7 u - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
, K3 h, c% ?" w8 ^0 a, d2 i - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
# W9 |; M1 I& r- \6 i7 B6 Y - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
; t3 Z( C; N) ]- [9 I+ d7 C9 @& H - 6 R9 k# W) s) @# f) |! h: @- d6 `% k
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素): W2 i c% {8 ]7 k1 |3 S
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
C4 J( J$ ~! p, o -
7 r, j% k4 y9 {: `7 ^1 b - //$pull:删除数组中所有指定值
. C0 R7 t) N& o5 {* D3 \$ ? - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);4 v$ ~2 ^2 j/ C6 B! _" U4 x6 H
- 3 C8 V0 I, L$ r, M9 {+ Q$ {
- //$pullAll:删除数组中多个元素的所有值" ~' g0 b9 g+ b$ @1 V" |
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()% n" A/ D+ T2 {; `2 w1 e
- //参数1:希望保存的信息数组 j8 m4 M( E3 q( x8 j8 \- ?
- //参数2:扩展选项
5 H4 b* O9 s( ~, N9 M# H' l7 v - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
2 P& \) y# Y7 ` - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
* i9 W: E" v4 R, l* d" m - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。3 T$ `3 W/ n' Z! t
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' Z7 U- T+ B5 w3 m! h; h
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
/ V1 l) F! q, J$ G - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。/ h, K+ W8 e; ~0 h# ~
- //若想更新则应该在参数1中指定_id键的值。
. Y$ K0 \5 a6 F; N - $mongo = new MongoClient('mongodb://localhost:27017');
* C- p4 V; F/ j - $db = $mongo->mf;; `* l- p/ E- K* |# [- ^
- $collection = $db->friend;
; C. q3 X/ d# V4 [6 k% x- f. h! s - $doc = [//定义一个文档,即一个数组) E9 b4 J& `7 G$ ~4 z& o
- 'First Name' => 'Jet',
& ~* a" q2 s# T% N: k, \& q | - 'Last Name' => 'Wu',% D7 W0 X" @2 t5 `
- 'Age' => 26,' [ `$ @ [% |
- 'Phone' => '110',
" V3 t+ G# k8 c - 'Address' => [; T5 B3 Z. w5 C3 Y8 A B
- 'Country' => 'China',9 H5 L9 Z S4 h1 }
- 'City' => 'Shen Zhen'
8 r- t! e7 V3 e) n8 z0 o' h' b* F - ],
/ _# v; d# t3 n - 'E-Mail' => [4 x! C) ], b2 Y" p! A
- '123456@qq.com',
3 b- g( [. ?, v8 z - '666666@sina.com',
/ }# g/ E# b% b2 q - '8888888@qq.com',
L# [% R& V* m1 s0 t; B - '77887788@qq.com': `0 L/ g& w y: r6 A5 T1 K
- ]
) b8 Z7 ^2 \5 w, T& I: W. [$ b - ];" z8 e( D1 z1 s! b% `3 L' y* z K
- $res = $collection->save($doc); Z9 N1 A" A! |) [
- echo '<pre>';( ], G0 C7 Z* B% Z
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
7 J1 A, ]/ [4 @. D- ^ - & N. u) [. }2 C8 O
复制代码- //findAndModify()
# |1 {9 L+ X3 ]2 [% H7 W - //参数1:指定查询条件
1 B/ ^) v/ K1 L, l7 K. y/ R! K9 P& R - //参数2:指定用于更新文档的信息
3 V+ Z' D: l2 ` - //参数3:可选,指定希望返回的字段
1 @8 c. X0 u# t1 | - //参数4:扩展选项( g" s. m6 a; z' Y
- // sort:以特定顺序对匹配文档进行排序 [3 J6 d) W- v" N7 R
- // remove:若设置为true,第一个匹配文档将被删除" [: \$ {+ i9 o# e3 K% f
- // update:若设置为true,将在被选择的文档上执行更新操作. s M2 s' P9 C- }$ G y& h6 e! j
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档/ ~6 Z y; V3 }5 H3 x: b* s
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
1 F0 i6 I" G$ o5 ~2 p: Z - $mongo = new MongoClient('mongodb://localhost:27017');5 K U9 S- z1 s9 m4 |
- $db = $mongo->mf; s7 N8 z, p+ X h- T5 O& U
- $collection = $db->friend;( G. K. y* L7 s/ e3 k$ e! q. k
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);7 l& K0 q7 p& K. R% x* ^! p8 @+ c
- echo '<pre>';
$ x( _3 h' m( a0 @+ H - print_r($res);
复制代码
四、数据删除
- //remove(), `4 V6 }7 c! M; o( ^8 u" I
- //参数1:查询条件
; w0 R/ A& D7 Z- s2 w2 [& j1 T" G - //参数2:扩展选项
2 I- Q* X! h& ]+ f - // justOne:若设置为true,则最多只有一个匹配的文档将被删除 ~% _5 u% A- o5 e1 z
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。- C5 \+ T) m5 s2 b
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
/ J; H; g2 H9 V1 S - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 q" p7 I4 h2 J% C2 o7 a
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; y8 o6 G1 @6 n4 _/ {
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
& _( N) c( a& {+ H/ _) D - $mongo = new MongoClient('mongodb://localhost:27017');$ y) z/ T" m, C+ R$ B
- $db = $mongo->mf; W6 _3 {% v1 `/ K% W7 z _4 S8 W
- $collection = $db->friend;
$ P" P0 H0 Q6 L2 `+ ^7 b - $res = $collection->remove(['First Name' => 'jet']);
4 O- Y0 I, o$ O1 D2 y$ [ - echo '<pre>';
$ A3 I% X9 ?: ~$ ` - print_r($res);//$res['n']表示删除了几个文档
复制代码
7 \0 V$ c0 y: h" b" N' \以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
8 V: E( w* C( K! E
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
% N# {/ i- A0 c( i* U$ l- P- j7 p
数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
# k i. A* o+ k( T# K5 V" I- I7 V - $bulk = new MongoDB\Driver\BulkWrite;
: R; X o' D1 h. [) {" e6 _ - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);. b6 ] Q. |4 y7 F
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
; @7 t, h5 n: k' E - ; f4 h" n) y! ?6 A& H% X
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
# C" O8 f% P C: C - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
( }: b7 y' X5 o/ q$ M0 V - echo '<pre>';
- M: f6 d/ n+ S. b J - print_r($res);
复制代码 % V/ |$ S: S! A7 `
数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# d' a( Q% t6 ~2 e1 k+ S
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);, i, e& G( {) W! L7 \/ T
- $cursor = $manager->executeQuery('wjt.friend', $query);
0 t. ~) {, ]# m0 x7 X+ h E. x& [ -
- W+ l( n; s7 c - $data = [];
2 }: u6 B3 G1 B# S! s& x - foreach($cursor as $doc) {
. G/ w. A3 Y% y$ G - $data[] = $doc;
% A# c2 H* N/ a7 g- f* Q - }# c' F, E2 Y U
- echo '<pre>';
5 C3 f4 R8 B( y7 n9 z; a - print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');9 s1 U/ ?0 Z* ~: L
- $bulk = new MongoDB\Driver\BulkWrite;1 ~ B6 ~& N2 s( h3 h4 O
- $bulk->update(' [$ r/ ~+ x2 W; A& ? m
- ['name' => 'JetWu5'],# x" U6 E9 U8 A
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
: E- y2 R( b M - );8 H9 c% y0 f) p0 z( Q
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认; F' M! e) |6 i" t2 e1 x
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
5 K# v2 Y- K4 C5 w - echo '<pre>';& B7 m' V8 P( B. j2 k8 e+ n# k. N
- print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
- [" |8 [$ \5 H0 o; N% | - $bulk = new MongoDB\Driver\BulkWrite;
" W- Q7 c$ R y$ m5 `& v! k Z - $bulk->delete(['name' => 'JetWu3']); l( D2 B7 Y; p
- $bulk->delete(['name' => 'JetWu4']);* ^1 K$ G1 D7 s, N2 N% y
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认/ d$ _7 ^ z, e0 |
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);8 `1 c% F+ _+ ~6 D
- echo '<pre>';
3 ~! c, D. [' E - print_r($res);
复制代码 " |8 ^) p3 t2 s, ]4 `! l
3 `( O* ?' s* W$ F, y* a4 N
, d+ _: Y6 ^9 n6 w6 S; j; z# w7 Y
& E2 ]' Q6 {8 m( E9 d+ a
欢迎光临 cncml手绘网 (http://bbs.cncml.com/) |
Powered by Discuz! X3.2 |