|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()# N5 w/ @! a3 V1 f6 \) N( l
- //参数1:一个数组或对象$ s4 T0 ]& y+ v H. W
- //参数2:扩展选项
4 O5 w. K! _. _4 W7 B- L - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘! ?% D% h- y+ E B( w, G
- // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
% w& F: m! _$ ^ _4 ] - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
- m6 s/ X p3 y, q& y$ U, n- k. a - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
t' ?; e- D8 I% t' y - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
2 P! E3 C6 w' i. K - $mongo = new MongoClient('mongodb://localhost:27017');; I9 Y, D# K: m% P& G" M+ Q7 ~
- $db = $mongo->mf;//选择数据库
. C n- V' c( }8 ?5 r! L- m: H) s - $collection = $db->friend;//选择文档集合- ~: l) \* m2 k8 r1 x( X
- $doc = [//定义一个文档,即一个数组
: l3 }' s+ t; z - 'First Name' => 'Jet',5 {; |2 k" \: ^6 E" ~5 |% [1 |
- 'Last Name' => 'Wu',% A8 s( z, N. o$ Z
- 'Age' => 26,$ Z0 U( n) v5 Z# z7 W' {
- 'Phone' => '110',
4 n# X0 z) f- p% V2 ~/ h, i - 'Address' => [
5 h. ?( v! N5 t2 K0 R9 ]6 R - 'Country' => 'China',$ e6 z# X, ^# G( R+ R* m8 V2 r6 W
- 'City' => 'Shen Zhen'# f5 U- k$ f/ n2 L
- ],; r- S/ l- G' k9 q; f
- 'E-Mail' => [7 s! }6 U' C9 A0 R0 C
- '123456@qq.com',0 t5 C. b a0 J4 O
- '666666@sina.com',3 h: \7 x) p# j- g6 e
- '8888888@qq.com',
) c# F- K/ m/ O7 w. I" n - '77887788@qq.com'! ~; G8 U* D) W9 ?' T( @6 H
- ]& y; @1 B6 {3 k- j
- ];" G8 a6 z- i4 c8 s; J. f* |7 O9 u, t
- $res = $collection->insert($doc);//向集合中插入一个文档
: F$ {7 d- N5 O* M - echo '<pre>';
. X- O6 z4 K; K j/ L - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
0 F$ ~- n7 K/ a - //参数1:搜索条件% n* e0 `1 n' z( ]; r
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
( N. J U% n# W% ^ - $mongo = new MongoClient('mongodb://localhost:27017');5 Y3 l4 M y: |* Y1 p# g. _
- $db = $mongo->mf;
. Q/ c! {# P. n - $collection = $db->friend;
5 ?3 s, M2 H/ S( p T - $one = $collection->findOne(['First Name' => 'Jet']);
7 w6 ~0 e% H* V- c* R - echo '<pre>';" C/ [/ X$ c! n' m3 y9 O
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
+ }, C9 Z+ s! f5 R3 S+ l+ } - //参数1:搜索条件$ K4 [* X t V2 z x9 l @
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
( |0 X& ]; ` ?% z4 F6 A - $mongo = new MongoClient('mongodb://localhost:27017');) ?+ C/ F$ ?& g7 V3 [" N. ?
- $db = $mongo->mf;# g: F: W- L& g" W+ P
- $collection = $db->friend;. b% a' R2 `$ d4 P2 l9 x1 D" ]) w
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素% X9 J) J; l! c# K6 L2 ?
- echo '<pre>';
" l& j9 c t" |8 p - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
) m1 f+ I8 \! A( T# X - print_r($doc);! L; f; q- E& P5 |$ v
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
3 @3 R4 ]6 H( c9 Q - $mongo = new MongoClient('mongodb://localhost:27017');
* Y; m4 l; y3 _9 Z- M - $db = $mongo->mf;
$ l: |3 N: F) r a* Z - $collection = $db->friend;
- A/ o) z+ e7 a, b" E0 z - $cursor = $collection->find(['Age' => ['$gt' => 30]]);) t2 @; U3 h# Y% i. C
- echo '<pre>';% k: s t- F% k4 F0 ] N
- while($doc = $cursor->getNext()) {: T, g. |; E' {5 m/ ]' N6 m+ ]
- print_r($doc);1 | j1 M; ]" F" h, A2 z% j
- }
复制代码 //查询某个字段的所有不重复的值( M1 y K. C9 k
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
3 F/ Y9 Z4 N1 g - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);7 s* S' N, r; r( i$ s2 V1 `
- $ H5 x; H& }) x5 s0 a- f
- //$all:匹配多个值中所有值(用于数组字段查询)
$ t+ G* ` U8 ^0 {+ u I* x- ` - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);+ |0 Q6 X& D( Q+ W' S# P; \, g }
-
0 _& Q; k; u4 Q$ X4 M# T+ Q - //$or:或查询
$ y; s- h9 J) G$ g2 v) p - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);7 y8 z% x2 x& v9 b I8 c
-
" z Z- M) Q& d* a4 c7 u7 Q `' z - //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
* x& a. ?6 l- S( s, Q* H# X - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email2 N4 i+ @5 F) a+ o! j1 m
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
9 B( E9 j& I/ E+ j5 Z - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个- Z3 [' U4 ~6 L N. p
-
# J8 X) r) h' ~# F, o8 S# o - //$exists:根据某个字段是否有设置值进行查询0 y2 j; {0 J: W. g" G4 y
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档4 G. s' z% [7 o. }8 p4 h
- . [( C' t4 O" d4 ^% C
- //正则表达式查询
6 m# ~: ?# v7 e/ ^ - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
9 R1 I) J& b, Y - $cursor->sort(['Age' => 1]);3 }/ _$ \* k8 Y0 Q6 \2 b
-
! w; Y, s# e W) N5 j. e8 r* n - //忽略前n个匹配的文档; d& g: W. p9 e! x
- $cursor->skip(1);
8 j- T T/ X5 ?6 U1 C1 n -
1 }" i9 y( O# w - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
7 u; s, r2 ]7 Q1 w( A; \( h - $cursor->limit(1);
; s7 Y% u/ u2 Z% W' s -
$ J# P. q; I9 e* W& V& ~ - //匹配文档的总数7 G, s, ]) L* M
- $cursor->count();+ K' Z4 d% T1 k$ y: r
- 0 V# }" d# E/ O! B
- //指定查询索引5 a8 B1 s" M: w6 o2 |, |
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计# W9 w2 ]) b/ @' w# c
- $mongo = new MongoClient('mongodb://localhost:27017');
+ S' H8 e8 W& o: Y9 t3 o - $db = $mongo->mf;8 S( {8 v: Z; W" G! B M' ?
- $collection = $db->friend;+ n+ ~" _" h+ n4 z/ f1 z3 ~+ m
- $res = $collection->aggregate([/ I; s3 I( X% ~# J) H: z
- '$group' => [
! k% ~4 b N/ ?6 d$ Q% R# l, }# r - '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组6 X( J: M- \, z: J
- 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
& @# [$ h( K0 s+ f, ^: T - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值( h+ h2 M1 ]2 _. p* p) G2 a
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值7 y- _; |% _. g. V, }
- ]
! W% M _ ]: r j2 \ - ]); E$ b6 y+ i) W O5 R
- echo '<pre>';7 u; w7 u- k& J( [: P. t
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果3 O( @( `, d7 v; C
- 3 V+ A$ B. K7 H W$ c
-
# D- k+ h! k& G6 W - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序8 t K U: [9 |' P, W
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。5 o$ v; B7 y- c- l9 b! {
- $mongo = new MongoClient('mongodb://localhost:27017');
7 X k# G T& u& v - $db = $mongo->mf;
9 S% h5 x6 K( {# C9 Q ^# } - $collection = $db->friend;
5 h) A, d& P d3 e5 p9 ~( h' b - $res = $collection->aggregate([4 W* }. R# s4 R$ Y
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
' K' B" E7 e9 ~" N* N/ Q - '$match' => ['Age' => ['$gt' => 30]]
, O" {7 S0 F9 U9 N8 q" q3 _ - ], Z% L* G0 ]: J8 R
- [//指定分组字段、统计字段$ p+ c2 V2 K/ s4 L8 C
- '$group' => [9 P; a" t% B v& T3 K2 B
- '_id' => '$Address.Country',
( n$ B6 _3 q* l8 q( C3 k" U) {2 Y - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
! T! E) e, p& g: z# d# D' N - ]9 u3 z& W$ i. a) @
- ],
; m5 z3 y+ }1 @# h8 i - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档* C9 q% D! s: s3 a' @6 t, c
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
' f2 n) G$ i0 ?0 @- R/ v6 t - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
. P% d9 n ]+ ?5 N$ c. P - ['$skip' => 2],//跳过指定数量的文档
5 G. z+ c7 h3 U% s) ]' v - ['$limit' => 2],//只返回指定数量的文档
/ u% G4 D* c: }9 u8 p I; M- } - ['$sort' => ['totalAge' => 1]]//排序
$ O) B7 t( ?& u; M: f - ]);# k, k( u7 A9 h* T
- echo '<pre>';
2 M# N8 p5 a. a6 Z6 B9 t: F% A - print_r($res);
复制代码
+ g* |$ o" T/ J/ ^2 }6 X4 U三、数据修改 - //update()
( e+ m s8 t0 p1 @8 {6 M - //参数1:更新条件,指定更新的目标对象。1 z/ Q5 ]2 {4 Z$ N9 e
- //参数2:指定用于更新匹配记录的对象。
& c: f7 _0 s+ U* K; `9 t - //参数3:扩展选项组。
6 l3 o" u" d/ V) `2 c: a - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
! t4 v' @3 _. m3 A, |; ?+ o, K: R - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
5 t: Y" H% D% H; j( D - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
, s* \1 `9 s8 G* S- x/ w4 w - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
0 G. K+ @% w/ W( R6 b$ \8 y3 c - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
: d6 h3 }) U9 ^. C+ `* h - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ I5 B- e, Y) @* V+ ^
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 }6 e4 n& N4 s& g9 B
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
3 J1 a! j' s+ K9 C9 }% R" M w* k0 x -
- G9 v/ F2 R2 x) h5 l - //$inc:增加特定键的值,若字段不存在则新建字段并赋值
1 b. J& b6 S3 h6 {$ Z - $mongo = new MongoClient('mongodb://localhost:27017');) I9 p% |8 L# L- N( D6 Y1 P
- $db = $mongo->mf;( J" ~8 Z+ f9 ]7 ~
- $collection = $db->friend;. e* o" y5 G6 H6 a
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
G$ Q* R" Y0 ~9 f - echo '<pre>';
; y' f, c5 M6 L% _: {) |9 f% L - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
# r7 j8 |+ y+ c -
0 U* c( s/ k( r; F/ h1 \ - //$set:重置特定键的值,若字段不存在则新建字段并赋值
8 B/ i+ G. L& `8 u; b" \* i1 d9 M - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
5 f( ~6 F; h/ d. o4 q! I2 m5 S, d -
8 a8 ]- \9 K* {: F/ g - //$unset:删除字段/ f7 j( K" a/ N }0 d
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
: W8 P8 u) ^( Y. U# E, \ -
' B6 `) Y4 M: l$ @' E3 d# q - //$rename:重命名字段,若字段不存在则不进行任何操作: i( s, A e( j. B$ i
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 q. y4 F, Y' y. _
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。8 j3 o& k: V% V
-
0 k8 A+ Q" T) y9 K; g! G( l0 P: ? - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
( Q5 L6 @" `6 S' Z! E - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);+ n s3 }+ R* H d0 s3 {
-
4 u3 [8 x2 U' ]1 T# z - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错% c7 m. Y2 s6 N. {( v% X
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);, {& O& W, Q% C% B; w
-
* I1 z0 @& Q; G - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
7 k& b4 B! v% ^0 q% z - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
! [# ^8 \2 y% z - " d7 ]4 l3 p. |" E7 E
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
, Q3 `9 N5 R9 | - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
! @8 Z" g: p) h+ S9 C3 g - & @9 X- h$ S2 o9 {0 _
- //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
, a1 j% \/ `+ c3 ?# D7 d$ U1 X - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);' G; x+ ]" T3 M4 V
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);0 T* b& L+ ~' U* W$ N; T
-
- [$ K' d g! f2 g2 ^% j - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
& X5 U5 N i! e0 d/ v) X" q% U& O - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);2 t+ t1 q/ [+ F5 M- a- y
-
0 _# c! l6 ], U! x6 D - //$pull:删除数组中所有指定值* _; }* ?0 o1 F8 g1 K6 L
- $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
7 }: \% j0 B, D. C -
' \& y* z, S4 v" |1 K5 \( R: } - //$pullAll:删除数组中多个元素的所有值
3 E# m _1 ?" T* u - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()
1 e' E# { `4 B A6 n - //参数1:希望保存的信息数组
% n! v$ V ]& a" r - //参数2:扩展选项
' i2 j1 ^* H# Z- Y7 ?! p; }9 e - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。3 O! j' Z0 _7 d! Z
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
, _" X7 g" s! X" } - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
& c# l% p$ ^; |# U- u - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
3 t0 A G) l! W - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)# `1 m- ?& z9 \( Y8 Y1 o
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。% E- y- ]' ]! v D2 ]
- //若想更新则应该在参数1中指定_id键的值。
" u& }$ P" L! b - $mongo = new MongoClient('mongodb://localhost:27017');
4 R8 J5 M* x7 c- w# e' g2 ]) S - $db = $mongo->mf;# m( \% b0 X% [# g8 V) I
- $collection = $db->friend;2 d- ], u8 l% y+ [0 o
- $doc = [//定义一个文档,即一个数组
4 D* h: }1 N- S1 Y+ R$ {$ B+ c - 'First Name' => 'Jet',* _% y0 q' `7 @. ^; n
- 'Last Name' => 'Wu',0 C. p) _! ^6 ]1 h
- 'Age' => 26,
F6 e( K+ k; P( B, J1 t) N, ] - 'Phone' => '110',
- ?! m" a/ {/ x& v0 j3 } - 'Address' => [
- j8 H: g0 _% M" w4 u - 'Country' => 'China',% S/ D5 d# g: } F8 r {" V
- 'City' => 'Shen Zhen'
0 M" B- a7 }% C' ~" X5 v - ],
' q+ Z, M& p7 L/ A. E - 'E-Mail' => [
- o" Q6 R& y- x, m- L! K8 v( |" m - '123456@qq.com',$ y2 Q9 ^7 {8 M1 A3 d7 p( v
- '666666@sina.com',
6 s# U; X7 i0 I4 Z' O0 O - '8888888@qq.com',
$ g$ q# `" ]$ f" n - '77887788@qq.com'
6 T: N. z e p, ~- [" x" { - ]
( k6 }/ y N7 L B( j0 g5 G0 \ - ];
2 ~5 C: y. m ~/ S D - $res = $collection->save($doc);
. M7 n/ z, \- p/ X H - echo '<pre>';
3 z0 W/ V+ Q' @1 B4 ~7 X. F: V) B - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
4 ~$ ]+ Z3 |3 Z% ?$ J6 v' F6 ?) o - , r6 X9 Q4 Q' }' C9 g4 i
复制代码- //findAndModify()5 M, d2 W% \9 J+ E! w
- //参数1:指定查询条件
0 U' T% c) Q7 x3 Y5 p( h: N - //参数2:指定用于更新文档的信息
) c) s4 O2 N/ V - //参数3:可选,指定希望返回的字段
1 S9 [3 A6 s' g2 s - //参数4:扩展选项. b% {* [; r y5 L# d/ K1 s% s7 k
- // sort:以特定顺序对匹配文档进行排序! i5 }6 T* c! u# P
- // remove:若设置为true,第一个匹配文档将被删除$ W2 O( |( N7 o/ D$ a/ u2 R% [
- // update:若设置为true,将在被选择的文档上执行更新操作
) |, p+ t" f8 D2 B" n ?) F u - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档2 P5 S7 x, A3 {) Q1 X
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
( P5 C3 d6 ]. J% c - $mongo = new MongoClient('mongodb://localhost:27017');
0 G% j, |+ V# H7 \6 A. W( z z8 @ - $db = $mongo->mf;. Q; W, \1 P) N% H8 N e/ O+ i
- $collection = $db->friend;
; P* N5 {" F) a4 W - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);* s% d$ h' c& u
- echo '<pre>';: J% N2 w. O; B7 K0 h) B' M: I
- print_r($res);
复制代码 四、数据删除 - //remove()
% }/ T7 k% q8 @; l - //参数1:查询条件& l5 X* l, Z6 N, Z% K
- //参数2:扩展选项9 o. O: \- N; x* k, D
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除) y; K) {# L1 _& g! J/ O
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& O' X# _* s/ W# N" Z1 g( y
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% z; q0 c, t5 O" X: Y5 d
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
- m4 z7 R, b2 I2 J - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间# C; t9 O! k- U& R& Q2 i4 I( E% {3 `
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
9 b+ u3 G) i1 T: V) w$ o - $mongo = new MongoClient('mongodb://localhost:27017');
8 r c" j% v; w4 _) m9 B& C5 k! H! F - $db = $mongo->mf;
$ r4 N' I' X# [) A8 b8 L9 S2 D - $collection = $db->friend;
$ }8 {, r( j- }( Z& A - $res = $collection->remove(['First Name' => 'jet']);8 y+ S; `" t, N" j+ T% e! k
- echo '<pre>';
n2 p1 g4 g; s" _0 ? - print_r($res);//$res['n']表示删除了几个文档
复制代码
& M6 K4 s, M! C* ~* Y/ l& K, c9 } e以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
$ h( O6 A0 W& l8 l$ Q-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
0 _% S' W8 D; ^! u/ D数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
& b# X4 ]7 O E2 F6 y m: ^. i - $bulk = new MongoDB\Driver\BulkWrite;, k( e( b B% j2 m. A* t7 Q
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
H+ p$ R, ~& J0 V. q - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
6 d- Z* [) v+ N9 X" w -
! I3 a5 s+ Y" Y& a9 d - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
& D5 J' ^) S M" m2 z I: L - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% ?" D6 } g8 \3 l- A
- echo '<pre>';
6 V! C5 X5 ^5 B* N L3 C* D9 B3 y - print_r($res);
复制代码 3 X; t. p# s% x/ G2 j5 p9 T
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
9 H* ^6 V1 a R7 r! W - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);) P, D% H9 |% e1 A7 [
- $cursor = $manager->executeQuery('wjt.friend', $query);
! Y+ b7 q8 V7 k/ _9 _3 m: A) H; T - / j5 }+ A. K9 Z2 {
- $data = [];) l R5 a$ y' K! N
- foreach($cursor as $doc) {6 T4 [* y& Q0 f8 G
- $data[] = $doc;# p$ j9 S3 i- q2 r0 F. w0 j/ a
- }0 R& @* W5 e2 |' v9 M% M \; r# I
- echo '<pre>';
0 ]- @4 b3 q; e& r# {7 ^5 a" k8 P h - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ M8 `& E! e V- Y* b. B( N4 z
- $bulk = new MongoDB\Driver\BulkWrite;
6 o \# @( X* \1 I) b - $bulk->update(9 Y$ h$ n/ A( O5 W* C6 q2 e
- ['name' => 'JetWu5'],
2 g! C: K m3 C1 d% D9 b3 T6 ? - ['$set' => ['age' => 30, 'promise' => 'always smile!']]' \: T$ D8 h4 E$ p5 R9 L& \
- );
$ T0 p. p9 ^' {* }1 D - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
! n7 y, ^. ` U: G1 n2 B/ ` - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);8 s6 U5 d, P7 @6 l: {6 z
- echo '<pre>';
( I N, M( W6 M0 N - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');* r, d9 g+ a0 B2 s, w1 _' q
- $bulk = new MongoDB\Driver\BulkWrite;- ^* J, |6 p' \# l
- $bulk->delete(['name' => 'JetWu3']);
6 E5 l6 }2 S' W/ M9 C - $bulk->delete(['name' => 'JetWu4']);
" c2 E4 `6 I( y# Z1 p - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认3 t6 t: z1 M( d; n' \3 Z
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);0 G# |0 J" A. y( f2 y$ V
- echo '<pre>'; P# \) O$ ~. @/ i- m) q
- print_r($res);
复制代码
9 S/ S2 m. B& M- `2 K$ @. o9 _( J# L' C5 B5 l
( o+ ^( \2 J0 S; ^
l2 M8 ? g: i c$ {, c- _5 C3 [) F, }( H/ \ J
|