|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
$ }5 O( {9 L! \' H - //参数1:一个数组或对象
% |" ^7 ]+ d. f) w& C - //参数2:扩展选项
5 {9 w2 x: K+ K* T; w - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
* E% T* m+ e3 p `/ e - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志2 E3 U0 q" p8 H ~3 [) D
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
6 d& {5 s( q7 i8 O8 |7 b - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 }3 q4 y! d. M3 R. n
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
( _- @5 z& F5 d" H7 V, R1 P - $mongo = new MongoClient('mongodb://localhost:27017');4 s- q+ g+ [% q2 C0 [- q! N2 K
- $db = $mongo->mf;//选择数据库
+ d% A/ k# j7 P6 o* L - $collection = $db->friend;//选择文档集合5 A7 q: K$ W' m3 l" C' M* _: R
- $doc = [//定义一个文档,即一个数组
0 e: j( i( N+ ?8 q; O8 O - 'First Name' => 'Jet',
! Q8 [6 E% z* _7 b! g p% r - 'Last Name' => 'Wu',
* e+ l' D+ {" @5 S% J6 v7 d4 R - 'Age' => 26,# i3 U q, P& i) c! o k5 b: z2 m
- 'Phone' => '110',
; j& K# l3 `) S* |6 S! _7 U/ x3 |1 z - 'Address' => [
$ Q* ~* j9 R0 ]/ t! q - 'Country' => 'China',
- @/ _+ v) Y: l( W- k: n2 ` - 'City' => 'Shen Zhen'
' @. t5 I$ D1 ^3 G - ],) i* k1 _: H! V5 ^8 L
- 'E-Mail' => [; F" ?: G/ A8 V+ j" S8 X! c5 t) R
- '123456@qq.com',
0 C! ?; r- V' `. F" E - '666666@sina.com',
5 Q- p# ?+ B7 l ~, p. r - '8888888@qq.com',
& ^4 g/ H5 r, ~4 B - '77887788@qq.com'
' ~0 r" W# D; H# V2 o - ]0 Y9 @# Y/ U7 f4 Y2 V
- ];
; \. J- K5 `5 \ N( A t& ? - $res = $collection->insert($doc);//向集合中插入一个文档
; K- b4 A U1 `* w$ N - echo '<pre>';6 \8 R! r# d8 ]7 F) g l( X" D
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
" Q: t6 A, m+ t - //参数1:搜索条件
1 l# H6 b$ Y6 z2 p+ T; M; }# s - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
+ Z) M2 F' h! `2 Z - $mongo = new MongoClient('mongodb://localhost:27017');
# q* G# g8 ]! P: T: [; o9 m - $db = $mongo->mf;
& t& ?2 @* x7 v. z - $collection = $db->friend;
4 C8 m2 Y1 h1 d9 M1 F" V: l% m6 t - $one = $collection->findOne(['First Name' => 'Jet']);
& z( {8 Q8 o7 E* J - echo '<pre>';( A2 P0 h4 F- O& }
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()( |6 ^ W& Y) e7 J5 `! }
- //参数1:搜索条件0 n: Q* m z ?" z) H4 c: H
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
: V6 b# F+ a- w - $mongo = new MongoClient('mongodb://localhost:27017');6 j- v+ R6 `+ C6 R4 G2 t& i3 M
- $db = $mongo->mf;
; s3 ?. t. |0 }- o- ] - $collection = $db->friend;
! [5 ]9 [" a" ]/ Y: g - $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
% P6 b! b( Z# p* c8 ? - echo '<pre>';: b* \9 E: G) [
- while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
$ i- d, E; `, r) j! p* O - print_r($doc);/ O$ d: _/ P7 N! D3 j* C: ]" m4 [3 o
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询1 M7 U) o4 o9 x+ b* {7 @4 O
- $mongo = new MongoClient('mongodb://localhost:27017');# V/ d2 N, j# w2 F# |
- $db = $mongo->mf;% U2 t! k* v8 q- `/ @. @
- $collection = $db->friend;
" N0 P- I9 u4 {) i" S& u$ ~ - $cursor = $collection->find(['Age' => ['$gt' => 30]]);
2 t! S4 T# H, x5 ~ - echo '<pre>';; }& p) o, ?9 y+ v5 k
- while($doc = $cursor->getNext()) {
2 Z) q% W! G' e# H# z4 N# G8 k% b - print_r($doc);
+ f, j) C. |+ m h6 }# Z - }
复制代码 //查询某个字段的所有不重复的值" u+ U$ q4 W8 ?$ u. j
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
( D2 }1 B4 c6 r) E - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
& i0 j5 o7 {$ N) a5 U - - i7 Q2 P' b( T4 X9 X/ Q
- //$all:匹配多个值中所有值(用于数组字段查询)0 A, h& u4 ~4 g% \+ P4 I2 {
- $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
; R! k9 l- o0 y% {& x% u - 8 m$ ]& Z) Q- _
- //$or:或查询
+ T$ @8 e( ^ x9 I. f0 ` - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);! H N' k! B# r: N$ H
-
0 ~ w( L5 t" I; G2 ?, c - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中/ u3 ]+ V. ]& v4 V0 u
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
& V {+ r" Q2 ~) y1 B% ^ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email0 Y: u- [ k( }, a0 |
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个- R* t3 ~4 a; ?. h1 m: W
- : { [, @6 {- M& R; s
- //$exists:根据某个字段是否有设置值进行查询
) M0 R+ R* S# C - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
# B5 J/ W* b) `" l* S - - ^4 S$ m+ Z& ?/ W
- //正则表达式查询' C9 N4 r2 y! r- f3 }# H& x2 q3 H1 w
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
+ m3 A6 j6 M/ }! x; A0 \( M! x - $cursor->sort(['Age' => 1]);8 H1 j7 D) c8 o& R& i+ l4 \; k
-
& e" [4 K) k0 T# } - //忽略前n个匹配的文档2 H, A( L `: \* e0 M/ {2 [2 U/ y+ z% l
- $cursor->skip(1);% ^/ c& d% h4 V( Q: K
- ( D* V# z/ V4 S" h' W5 q
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
5 {* }' Y9 L$ R9 ~8 l - $cursor->limit(1);7 W2 F) z+ c/ p8 X0 `
-
5 C( w) t0 I2 A2 v: k - //匹配文档的总数. L4 O; K; |: k7 ~# [4 Y
- $cursor->count();
) Z6 g! S* r% J8 G5 U0 L - 8 i, o, T6 y5 F9 l3 {& E
- //指定查询索引% G) I6 Z+ M$ ~& l5 E8 C7 e9 P
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
* k# _3 a$ y5 a; }9 H - $mongo = new MongoClient('mongodb://localhost:27017');1 D$ Y# }; T0 E! {% X0 E
- $db = $mongo->mf;* V- Q+ B! |9 I0 K2 E( p; k
- $collection = $db->friend;
& L3 @1 F0 z5 F' I% G' j - $res = $collection->aggregate([% S( Y3 V/ R5 T' s+ N; H' a
- '$group' => [6 _: N- X: \. a8 j' X! z$ h
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
9 { Z( Q0 Z. f- I: s6 [7 J, {# E Y - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1. a5 J) R o4 U. R( b" d3 r8 c0 p3 K
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
' L1 U2 G0 Q+ t+ k - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值) J; P/ m$ o0 ]0 W
- ]& w9 C5 I$ F- y7 J6 _% I
- ]);; Z. G7 p5 ~7 |/ b, }8 p; S
- echo '<pre>';
3 A" X: j- |* H* y6 A& D& R - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果8 \6 @! M* E! {7 i9 V# k+ Z
- : J- R/ ~8 `0 w! M( r' U. O- G
- 9 ?$ u: g( ~8 B2 j
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序) Q' b) T ~" ? R
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。9 G1 Q7 I+ P7 i" P& _, q1 `
- $mongo = new MongoClient('mongodb://localhost:27017');% c- q: O! T/ |' J5 @% c8 L! y: q
- $db = $mongo->mf;1 }# M. G" l( x- l- H9 A
- $collection = $db->friend;
; }+ v8 |- `* |$ e8 s' x - $res = $collection->aggregate([
3 M1 {+ [9 H1 j - [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
$ p; g7 n& h6 c) @2 T, G; q i: S0 i - '$match' => ['Age' => ['$gt' => 30]]
; B+ f7 G. n ^& ^, Y1 a - ],
s& N6 l7 s" N) B! l4 w - [//指定分组字段、统计字段
" O3 }0 g! U6 g- D3 O - '$group' => [7 L$ |9 z) P f" C
- '_id' => '$Address.Country',) k; S# E; g/ j$ W T
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
. ?6 U6 J% i/ p) m$ T8 S4 ]0 F - ]
- F' D' c. U* v2 Y9 K - ],
. j" s) ]0 v/ k" s$ H" t' E+ Z - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档" J2 s- |/ [2 @+ O. y. s3 r
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。( `" K! ?8 U. A- b- q
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名, B# R% V) |7 L& @% }8 `
- ['$skip' => 2],//跳过指定数量的文档
2 X/ M! H) Q% y7 f$ v: O' b - ['$limit' => 2],//只返回指定数量的文档; p7 @0 o/ d5 R8 }2 }. q
- ['$sort' => ['totalAge' => 1]]//排序
' M, P+ c& L' J3 O' d - ]);6 M! F1 }! M1 N/ `8 E8 G/ _
- echo '<pre>';
* L$ \$ D; D \3 u5 @" U* b4 }* y9 I - print_r($res);
复制代码 % F8 d @ E3 ?
三、数据修改 - //update()
R' g, w0 B3 Q% r' J+ E5 l. Y - //参数1:更新条件,指定更新的目标对象。8 Q8 ^ A4 X( W
- //参数2:指定用于更新匹配记录的对象。
+ d9 x- i; S- C! O9 O - //参数3:扩展选项组。
7 }. C6 ]& W: R* L) E - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。- g. u8 M W* |2 Y% |$ ]
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
' {3 g& c6 T u4 O5 a - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) F7 Q6 V% e2 n$ R1 @
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作, B) {3 c: |9 R# w$ F$ E
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
( ?3 H) k7 {7 s) M/ {8 c - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# g- X1 p+ p+ q' V a5 ~+ Y& f( ] - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)" J+ i; @" U" {- h' r+ w1 k
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: _8 C# f; b/ Z
-
% k; m6 W6 ^8 Z2 d- t - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
, s a) F/ G1 C1 J. N/ p - $mongo = new MongoClient('mongodb://localhost:27017');
' G; v: B6 u+ d& L" t) C - $db = $mongo->mf;
/ Y) J) P3 D/ o% Q4 ? - $collection = $db->friend;! B8 F$ q- k) n0 e j
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
( K3 L; S5 T4 s& u$ ^: {2 B - echo '<pre>';
$ x3 u3 ^+ c4 u: S# R g' w- I - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量% x2 d- g7 e5 @$ o" y5 R
- 4 g6 _8 M A, d( K
- //$set:重置特定键的值,若字段不存在则新建字段并赋值: E- c4 n, m' U4 o- G) `
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
7 o/ {8 l# o. W2 F* ? - / N1 R/ k6 V x" _9 \
- //$unset:删除字段
8 E' q7 B* _2 p6 n" f& Z - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
5 f { ]- O" F6 E" g& G$ p - ; ]. S& B7 i# P
- //$rename:重命名字段,若字段不存在则不进行任何操作( H! l0 r! L4 Q5 K# Z
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);& v! o* A( Q7 T
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
5 \0 M) v) m( t, D4 G - 5 n1 t6 `9 R* D! E* C! d& H
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的& V/ M; R6 l$ e# ?
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);7 R- S! J- f, [
-
/ }5 z0 \6 v: w5 j; a - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错( v# S4 G E: V) ]' A$ N
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
' s0 N$ A4 k# x4 |( A: L -
* q: `7 u+ f! \2 q+ T; z - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
" ?# ~2 |/ n0 i8 w. _ - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
: c3 L2 y Q1 h& N5 w5 t -
; \) W8 q, ~% Y; k" z: C4 m l - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错' l& {5 n1 \% u9 k2 N S3 `
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);6 b3 Z1 Q% J- @! `! [
- & M- f) s- i% S, W) A) k, o6 }
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
4 p3 C; T Q$ w9 O* [ - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);% |2 a* Y8 b/ z4 t
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
0 ~& r& a: j" G: a8 g -
+ T# `( K: D0 r- h& Q3 \' y3 [, W. a - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
) ^& X( u7 J/ g# P d6 i# R) ~ - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
5 h0 v" @8 k4 L' v7 ^% X - ; a0 j! y1 P% _/ K
- //$pull:删除数组中所有指定值) y4 g7 d, T- Y3 m
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
+ A, t8 [4 S: m1 t1 \ -
' u0 A4 }$ c" q, P9 `% n - //$pullAll:删除数组中多个元素的所有值' [ Z o" g1 w$ X' \0 ^
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
1 o9 c0 V5 z/ w2 H - //参数1:希望保存的信息数组
& k5 i) r$ c6 b, f8 h3 z7 _! D# p - //参数2:扩展选项" {: A, S. k6 n4 I7 q W0 t A
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。- ?2 m( u' H3 y- C5 J
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
; _* x H- Q/ u - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。6 [% m% W" H3 c% d" r% P( ?* o
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
4 l$ Z0 b+ X+ { - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
0 d7 ] u0 P. ~7 z6 G - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
& F% u' J# y+ g - //若想更新则应该在参数1中指定_id键的值。) u) \- \2 s; V. y. | R
- $mongo = new MongoClient('mongodb://localhost:27017');4 S P5 ^, y0 d
- $db = $mongo->mf;
) |, N, o( m f; N, q - $collection = $db->friend;
# w6 a* M6 H$ B L' u" k - $doc = [//定义一个文档,即一个数组
" B4 ~6 `( @" o* ~$ O - 'First Name' => 'Jet',
) ]' a& G3 w8 j1 W6 X - 'Last Name' => 'Wu',
8 ~' G8 r# n7 g' ?" k - 'Age' => 26,1 t& B& D% F: f6 Y3 H2 T7 Z
- 'Phone' => '110',' {' C" ~* X2 I8 X: y! G
- 'Address' => [
6 v8 H# \) {! b$ G6 A - 'Country' => 'China',. \7 P( o8 q8 y
- 'City' => 'Shen Zhen'
1 o3 r5 S% e; d6 I+ x - ],
4 \. i) V' J4 i$ E! F - 'E-Mail' => [
5 s1 @' Z& N# o0 n0 D/ t - '123456@qq.com',
- A5 a( D7 w) ~2 f1 L" o+ m3 ]8 D - '666666@sina.com',! \& D; s& I. O# P
- '8888888@qq.com',
$ K. p/ b+ | Z1 u$ o - '77887788@qq.com'. q) k6 _3 N' \5 d5 i7 Y$ z; ]) H
- ]- C. Q7 @; R$ {1 U% ~
- ];
6 q/ e& {+ K+ M" `6 u* ?" d - $res = $collection->save($doc);
" e4 `2 |) G5 e3 Z4 m; n - echo '<pre>';
~. a9 @ Y" w, M8 L5 c1 n - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
% C, x4 ^5 q2 X! ^ - 9 t+ Q" g" z5 _7 n* T
复制代码- //findAndModify()8 ]. j" s3 R! Z; H
- //参数1:指定查询条件4 g8 D$ c! [. z9 M
- //参数2:指定用于更新文档的信息
# s: S8 g# `/ \" ` - //参数3:可选,指定希望返回的字段$ W, V. a2 ~$ f5 t
- //参数4:扩展选项
" Q* [6 R2 r; Q - // sort:以特定顺序对匹配文档进行排序' f6 n. ^3 V1 l. Q" k0 c" R
- // remove:若设置为true,第一个匹配文档将被删除
& W x% t1 b* X& o% O0 f# p! E4 x - // update:若设置为true,将在被选择的文档上执行更新操作: f$ a$ z( u6 h+ I/ K4 ^, g
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档7 U" V% s4 N4 z6 z; K1 M
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
( {& K B# F$ _ - $mongo = new MongoClient('mongodb://localhost:27017');
3 M8 y. n: A1 P8 Q' P2 s - $db = $mongo->mf;
/ r: x5 f0 y' O- J, x - $collection = $db->friend;- y6 G; |8 {/ z1 C# k
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
) V. ^5 K/ a1 x; R - echo '<pre>';/ b0 y t3 v# o' `, S
- print_r($res);
复制代码 四、数据删除 - //remove()
1 d0 y/ L% l" @ T) h% r; u; y - //参数1:查询条件 } |1 G6 s Q% c* R" r. e* ?
- //参数2:扩展选项9 k: {( [* d& h. D3 v
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
4 y7 P D) f0 m3 r6 G - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。. Q1 Q# w' P$ |$ c! [, G* L
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
/ g3 f* I7 {* P3 {) N - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。. p+ j" d/ ^" F7 o' t
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
2 }- c7 s. }3 p+ [( J# o" O. B' u - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)0 C2 B# i1 j F7 b4 z0 L
- $mongo = new MongoClient('mongodb://localhost:27017');1 p9 _/ N1 p r+ H4 w$ v
- $db = $mongo->mf;
) N$ H) h$ A, w, O6 u - $collection = $db->friend;2 P0 w/ l6 e2 @5 L" ]" Z/ J
- $res = $collection->remove(['First Name' => 'jet']);, ?* ~; }, S ?+ u( p- |; k; w' ?
- echo '<pre>';
% D- k. w( |6 _& F+ v% K0 y - print_r($res);//$res['n']表示删除了几个文档
复制代码 0 ~2 M' X, w; ?# e' J* O; c
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 4 Q) K' s' C1 Y" }; ]
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
* E& b7 N# }# |* K& Z数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');2 p- E( P- o- d4 d& U- r
- $bulk = new MongoDB\Driver\BulkWrite;
6 ^) w/ I% n9 j+ s5 w - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
& S/ ?, F& w7 z* h) ]+ D) n( E - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
' C% I1 d7 P! X8 G, @" X+ i1 { - + S( _5 A5 X1 G6 Z
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
& P" ]: @9 X0 ]' Y% E! o: x - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);! p& r/ G) m/ m+ |: j- M- Z
- echo '<pre>';6 ^( |1 H4 [' w& X" Y, j& m1 a
- print_r($res);
复制代码
6 Q9 D1 L y+ s8 [2 D数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 X/ q5 t2 l$ {. u0 S) |- i) p
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);. n; A2 p2 B# _) u
- $cursor = $manager->executeQuery('wjt.friend', $query);
. t+ i. b9 @) x* q/ N0 V - ; r0 q$ v7 S: Y' x0 Z4 T
- $data = [];1 Q9 v- A O$ l$ F+ @
- foreach($cursor as $doc) {6 h% N, ? @0 Q7 f3 s
- $data[] = $doc;# D4 `1 e* [( k1 a
- }/ u) v2 `8 {) p3 L9 }/ g
- echo '<pre>';
; Q+ a u# ~+ x+ }4 g - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');8 p& |3 Q7 D [
- $bulk = new MongoDB\Driver\BulkWrite;
) n( B, e- m5 n4 L2 g4 ?7 k - $bulk->update(
7 \2 _1 W6 K9 H2 |) y7 i - ['name' => 'JetWu5'],- K% E0 \: _8 R# S8 E3 w! H" ~$ P% [
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]8 B' L- H3 Q6 I/ [% \8 t
- );
+ e. W7 a3 @8 p - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认' W6 g- X' r) E2 e9 E9 n
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
- _7 w$ o1 P! V+ i - echo '<pre>';6 C# B8 y6 g7 Z, E3 N! `9 o: w
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
# b9 {9 ^( e3 D a" P4 |9 q1 V. X - $bulk = new MongoDB\Driver\BulkWrite;
- c* W7 r4 b Z+ Q' A9 h8 A - $bulk->delete(['name' => 'JetWu3']);$ G: K. b: y- X n' Y* b+ ^
- $bulk->delete(['name' => 'JetWu4']);5 e* \. R: ]: B! [+ j# B+ J
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$ E R5 |! @8 |% n& w - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);3 q! x3 A/ ? r3 q: J! ]. @6 C
- echo '<pre>';" G* [7 P6 h- ^
- print_r($res);
复制代码 3 K) v8 V, C6 r+ b" _7 w; b
4 U* `3 w/ z+ J @% E3 f2 \- X% q9 n3 p' q/ h( m# H
4 r7 \) ]: Z/ P* M) s
h+ W7 G5 Y! Q9 |8 I4 f
|