|
MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
5 Y' J, k* T+ A. M' Z( o$ ~) K - //参数1:一个数组或对象 K( _' L% l) v* E) I5 u
- //参数2:扩展选项
3 C: z q, Z Y; ~ - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
! Y2 V* u3 r4 _+ s6 W, B- s& a5 |. ~ - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
2 D/ G ^) w, N) {0 I) E - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
* r$ ~: Q2 T7 h' o - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
6 H$ `- N: X9 y9 [+ Q3 y5 U* B - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)' O, K) d% `6 K8 [) r7 Y
- $mongo = new MongoClient('mongodb://localhost:27017');
1 w" M* w& g' Y1 l2 C; \1 X - $db = $mongo->mf;//选择数据库5 \# h$ ~# T( O6 Y* _
- $collection = $db->friend;//选择文档集合
Q0 M( f4 Y3 w$ F/ P - $doc = [//定义一个文档,即一个数组
, m. R5 j6 ^) u7 Y8 U* S9 t - 'First Name' => 'Jet',
: L$ Y; x. L) C% Q4 D/ T - 'Last Name' => 'Wu',
. |. y! h) M0 P2 e - 'Age' => 26,
b: K' s; `! s - 'Phone' => '110',* \7 r( e) r d7 B$ j! E7 [" A
- 'Address' => [
# U% b( c" L$ v# ?: L - 'Country' => 'China',4 U% ]0 w# N+ L# w, V8 u8 m0 N$ c
- 'City' => 'Shen Zhen'
. _% b; G- h- N+ C6 A - ],1 L% W9 k% H6 l4 r% u4 t3 D, G
- 'E-Mail' => [
; d4 X0 f, U1 F. t- A, D - '123456@qq.com',
+ s" C+ U' q7 M) \3 g, @ - '666666@sina.com',, f3 J4 O& V X) s
- '8888888@qq.com',9 z ^( g g) Y) l
- '77887788@qq.com'
" n' S& J# U' h/ Z/ q2 q& a - ]$ u3 s$ |+ e+ F5 Q
- ];
: h c6 w+ r9 u3 ]+ H - $res = $collection->insert($doc);//向集合中插入一个文档
8 q/ w* S1 H. e7 z) [( ? - echo '<pre>';
4 \4 \, T4 b6 j" ^3 `6 Q - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
" B! I# o8 N- ^ R/ h - //参数1:搜索条件* D W* m. \; O
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段# ?+ f$ P0 B `5 l* l' \
- $mongo = new MongoClient('mongodb://localhost:27017');, S# D2 Z8 v: s" [/ \5 R) l
- $db = $mongo->mf;
% J" m% p' X) {+ _. W R i - $collection = $db->friend;, Q4 \8 X" C1 o. b' n
- $one = $collection->findOne(['First Name' => 'Jet']);& \. Z4 `. C6 ~9 p# s
- echo '<pre>';* I6 {) p# D. l0 ]
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()$ S! t- Y1 Q: Z" T, E/ r0 i
- //参数1:搜索条件
4 H& x% Y- @% k; S* c - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
2 }0 t w w I, o - $mongo = new MongoClient('mongodb://localhost:27017');$ t4 a& w4 e% V. b2 R! R1 @, |
- $db = $mongo->mf;3 H) m2 J8 \( f/ O6 q
- $collection = $db->friend;8 L" d/ f$ b; b8 g) [
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素! j E! h2 x5 W6 |4 b* d: X
- echo '<pre>';
^+ K& z0 i4 L - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档! t, s5 a5 r! f1 O0 j1 U, c/ V
- print_r($doc);. k6 v& H) f. B
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
0 m- ~4 B) c5 Q; a - $mongo = new MongoClient('mongodb://localhost:27017');2 q5 f! ?* m s
- $db = $mongo->mf;
, F3 F. W) ]0 P# D0 A - $collection = $db->friend;8 E# G' P: ~# L
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
V& i/ F/ M# F. D" a6 ~2 x! N - echo '<pre>';
9 P& a, ?$ x8 F9 h - while($doc = $cursor->getNext()) {) s4 H% D4 [( B& l- g) l7 L
- print_r($doc);- T) `# i7 q T7 b% c
- }
复制代码 //查询某个字段的所有不重复的值# C+ U! J% O2 R4 X
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个4 r1 o1 Y3 j* K" {( p5 \
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
4 q% C" V9 u1 p! U$ t9 |6 C - + o! O, D8 N P
- //$all:匹配多个值中所有值(用于数组字段查询)
6 H& E) E& V# M5 q' T- s% |2 ~ - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);) K$ J+ i% _/ b
- M+ I) w# S$ @3 Z* S7 A! B7 L
- //$or:或查询
6 K* K" V v3 A0 u. f7 f1 L9 | - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);$ y; C' Z: L8 \/ m
- . ]0 N2 N1 }% S* s$ O
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* C, A& [; v9 {* m4 S8 ^
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
- ]+ ], p8 n& e/ i |& d. f - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
# G/ q! _1 I0 }3 P. ~ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
& j% Z9 i3 a8 u) g% [ -
+ c6 I9 x) l$ ~$ n, e d1 c - //$exists:根据某个字段是否有设置值进行查询
0 y$ a/ e6 }% c6 [, v) } - $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档! H1 `* q. y; g: o- o; {
-
7 X/ o6 I! A2 J$ U' d0 ?0 n; l - //正则表达式查询$ W. s: ^6 s* I9 ~( x8 \
- $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序$ ~/ k* j! m4 S) V3 [: S
- $cursor->sort(['Age' => 1]);
# y) x% k Z* l, h1 J -
7 Q+ X0 I. S% v) l) C" j - //忽略前n个匹配的文档
& @$ W# w3 o3 j1 ]) `& z3 v4 u - $cursor->skip(1);$ g4 {, V0 v/ k5 k, x6 Z
-
% \: i( H9 c$ W8 n - //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
2 @6 h) B: R) N3 N0 e - $cursor->limit(1);7 B+ ~+ K0 b0 ~. ~ E1 b
- : S8 A# B: X m: f8 F" {! L
- //匹配文档的总数
8 \- G' b: p$ Z2 ^& s( R - $cursor->count();
, K" W4 @# p( h: v/ O* j8 g: ~ - - C. E3 X& ]: |" ?3 |
- //指定查询索引6 G; f3 z/ e) n5 A" m
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计2 F. C# s: \) z( y2 A
- $mongo = new MongoClient('mongodb://localhost:27017');" o* Z( C% @$ t8 a! j
- $db = $mongo->mf;
) b7 l( q0 r9 y) f - $collection = $db->friend;
6 ?* `; [, Q8 C# u. f8 {) [ - $res = $collection->aggregate([. T; X% y' K: j; u5 o$ r
- '$group' => [; s* j" [( }, n9 f
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
# c2 I& s) q1 j; z - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加13 Y9 r: a9 L1 f9 q
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值- A B+ y3 j3 l |" N4 G' c
- 'minAge' => ['$min' => '$Age']//分组中Age字段最小值9 O$ U% F5 I/ N) V* }# s9 W
- ]
: l+ F4 ?% U9 J) }1 d: k4 g - ]);: t3 K0 M3 U0 f
- echo '<pre>';& g4 i5 o9 f5 w% ?- t& H; T# K R( }- u
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
) N( e( l5 J! S$ Q5 O - 8 a1 C9 D2 [& ^, z5 V% A
-
% A+ K& \* I) n, X Z2 P% q/ ?# ^ - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
9 Z; q/ s0 C* D; j/ d2 T$ G - //聚合查询中的所有操作,包括'$group'在内,都是可选的。- G' ~0 r( V" h2 k% O) Y
- $mongo = new MongoClient('mongodb://localhost:27017');
9 t4 K6 Z3 X7 l' K) w: h - $db = $mongo->mf;( T' ?7 V- D) E
- $collection = $db->friend;0 m1 d9 }6 t) b% b: z+ ]
- $res = $collection->aggregate([1 w% W9 b, Q+ `0 g% ^8 o g! J
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
, T N( E6 x7 H - '$match' => ['Age' => ['$gt' => 30]]% v! S/ i# C8 k
- ],
6 ?7 |0 A# S5 q$ T - [//指定分组字段、统计字段
# F3 ]6 a) I; Z, t8 W: j - '$group' => [
/ g. m1 N+ a, F5 M1 \ - '_id' => '$Address.Country',
% }5 d9 K* W" E$ Q5 l - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
: Q; _& T5 O4 |- T0 C# w$ ?& }! x - ]
' z3 D# {- Y u4 w3 Q7 s - ],( [) H$ ]6 z( R6 t- e% }' C
- //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档6 S' f6 J" Y" u8 k1 q7 w
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
& k/ M0 O4 F B4 L Q- o: ` - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名; n+ N$ [) `7 O
- ['$skip' => 2],//跳过指定数量的文档& U( D% k, P' ?7 [ n
- ['$limit' => 2],//只返回指定数量的文档
9 f2 A9 {' t! E! D - ['$sort' => ['totalAge' => 1]]//排序/ J8 }$ }" L L* o
- ]);& E7 u$ V* c8 b
- echo '<pre>';
6 b( K* J! p% f* n" X% z5 i - print_r($res);
复制代码 3 D: {4 Q( S: A$ r1 M
三、数据修改 - //update()0 \# M4 F% h0 S$ e2 k
- //参数1:更新条件,指定更新的目标对象。# ]9 K2 k, R( ~8 x$ C+ \: K
- //参数2:指定用于更新匹配记录的对象。0 M4 ]. T% u1 e* t' p
- //参数3:扩展选项组。; c1 r8 j9 V, y0 s7 _
- // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。) _# b' L5 [0 n& j
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
! p# t' q# R t0 H - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
' }9 f" I, r0 s& { - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
7 p( }2 L) l& o - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, G* w; ? R6 e, I& h6 _, x
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
' S2 d6 e2 q" d0 b# w' I - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
+ D( W1 l: N ]+ S - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: Z2 a6 h% S" M- T0 I, [
-
7 I- b+ R: A4 n9 Q - //$inc:增加特定键的值,若字段不存在则新建字段并赋值8 K" f' p# }/ ^. I
- $mongo = new MongoClient('mongodb://localhost:27017');
Y& U9 G0 ~% }( g2 Y - $db = $mongo->mf;. M" a2 S1 K+ ~, t/ U
- $collection = $db->friend;
, n! x7 v/ O7 @5 ^- L9 b; [/ G) W - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);6 ~. j9 [ ~1 A$ u+ k& I
- echo '<pre>';5 |6 k5 U- b6 v3 W
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量( h9 e1 w- ]% m) \$ M- d: `$ D$ H
-
2 G+ q/ l" O8 O! F) ~& ^ - //$set:重置特定键的值,若字段不存在则新建字段并赋值' {( @1 ?/ n$ n, \) Y& z: j
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);- D: R' u0 V3 |
- ) E+ X( t; Z4 W4 I
- //$unset:删除字段& W7 ?% d- a0 t% w% K
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);) a `0 B& x' i& g* `7 {. M
- & C: G0 c8 n- j" d+ A' A
- //$rename:重命名字段,若字段不存在则不进行任何操作3 _4 `! v1 y5 p0 w c! Y
- $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);, w( @( T$ a- s( o' h0 ~) V$ N
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
- }" c, I8 [- I -
: h- r4 ` ?3 ~, ]# y& t4 X - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
* p( Y7 C, T% C6 y8 V - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]); @$ R' ]* Z# K5 [ Q4 `
- ( W$ G7 ], k2 q
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
8 g* O$ A/ o" X0 m# A0 Q - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);- c" }2 G# d# t. f' Q
- $ X( s9 A- I5 O; Y: o
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
$ q1 m# n* A: y9 y - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);& P6 U( Y% _6 C" a& N5 N
- $ U0 }, l6 t5 [! h
- //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! ^ A$ J8 u( z3 w
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' X" ?1 N7 ~/ }* ]% I
-
: o. ~+ @/ d Z - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 ~! f- k1 x- ]* M7 \/ K
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);/ n5 y' O' C# B* Y5 D
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
% n: h9 x/ V5 `" d% o -
4 v d4 V! X' n: k% o; J - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
2 E4 a$ r$ J% ~* U1 [ - $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);* g3 q. x" s! W$ s3 X; Q) Y
-
7 r) k6 h8 J! F9 { - //$pull:删除数组中所有指定值
- |9 A" a& x# c6 T% w9 ^* B - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
/ M! x0 ]! E7 j -
8 _/ v1 W. I! s9 U - //$pullAll:删除数组中多个元素的所有值
: M+ Z) S. }9 R+ n - $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()" ?4 D6 Q2 u) S, ?# l
- //参数1:希望保存的信息数组
. p4 U$ z0 y% D; z9 Z7 j1 P6 U - //参数2:扩展选项
8 d( a& B$ q! n - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
5 ~. e+ j' c5 c - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% W% Y, ^' ?; |* X# P2 K. b8 H' @
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
7 m, [" C8 d0 _ - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
) j' {7 r p' X# X* p$ ^/ ? - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
7 E3 ~/ ]$ i, c+ M) l) ] - //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
0 E( k( u2 V, \; S - //若想更新则应该在参数1中指定_id键的值。
/ l; U$ G7 L$ J0 V8 n - $mongo = new MongoClient('mongodb://localhost:27017');+ e2 r( ^& C/ r0 a5 h
- $db = $mongo->mf;8 Z2 @6 J- A' a2 \
- $collection = $db->friend;3 z" e& Z; S* Y! X8 x [- d
- $doc = [//定义一个文档,即一个数组/ s8 b2 d Y3 f" t
- 'First Name' => 'Jet',
. J# a! @3 K1 c - 'Last Name' => 'Wu',+ _3 B: V `, v9 L& t2 ]
- 'Age' => 26,
( a6 ~: }! U3 D) w - 'Phone' => '110',# \- Y6 g0 i' E d* g/ ]# b
- 'Address' => [# z$ A2 t" J) g) N
- 'Country' => 'China',
; g2 V' B4 A; i$ q' {+ M) G* F$ F% R - 'City' => 'Shen Zhen'
4 A; z. s& X7 u& ^# ^4 h; x3 ^3 m - ],
) u! h/ z7 `6 j/ {5 Q - 'E-Mail' => [9 }, h& M8 _- B1 G# V
- '123456@qq.com',
" L) Z; c8 \2 m" w& {+ @4 j3 T - '666666@sina.com', ?- \! x7 Y, ]
- '8888888@qq.com',
# X+ S( G1 c0 t' t( H - '77887788@qq.com'
: ~ L+ x+ u2 r H - ]
8 ^2 B# O% C: p/ @. T' e7 l/ ] - ];% }4 ?) Y4 u5 [& c* ~$ R
- $res = $collection->save($doc);2 ?: C' P% U8 M- g& L* _
- echo '<pre>';7 Q B, o8 K0 n S% Y- @' ~3 u
- print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
# ~* ^0 f' b8 ]) [3 D; w
N6 z9 p7 T+ ~ j2 g, A
复制代码- //findAndModify()
: Z! ^; W9 x6 \. X - //参数1:指定查询条件( e( d% D% h# @! M
- //参数2:指定用于更新文档的信息
# k) Y- j/ V+ G) }9 F+ Y% c - //参数3:可选,指定希望返回的字段
" v$ X. y- l- g1 }1 N$ Y0 [ - //参数4:扩展选项
k% h$ n5 d8 S6 d" [ - // sort:以特定顺序对匹配文档进行排序4 Y! p8 v. U5 Q! x T, G
- // remove:若设置为true,第一个匹配文档将被删除' ~ S. r0 I! O- b5 _/ @, h5 r2 j
- // update:若设置为true,将在被选择的文档上执行更新操作# [/ [: S6 c& \5 ^9 w( a, E% n
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
: j8 Z. j) p9 N/ |+ w - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档* V- e! [# {8 t0 K
- $mongo = new MongoClient('mongodb://localhost:27017');
! F& N- X+ Y) B. j9 b - $db = $mongo->mf;
: o) B, }5 d q/ G* H% o - $collection = $db->friend;
& O! g) _+ P2 Y6 g8 O8 P, m - $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);$ t5 D- X* V' [! B, u
- echo '<pre>';" G& D3 }- V+ m2 @
- print_r($res);
复制代码 四、数据删除 - //remove()! f! {; x% m9 e4 ^' ~3 l* @
- //参数1:查询条件8 P6 o# o. q9 L) C) _2 J' ^
- //参数2:扩展选项$ E+ N- z% U( G% F: q5 p! k
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除- H; g; s2 H$ o4 G( c/ l& l/ y
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% u( C" `5 j) Q1 ~6 h3 x9 ^# f
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
) ^: r/ B5 \1 ~* l8 R - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
+ s: q Y: Y* N B# R* t7 a/ n - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ K0 ]' L8 D$ j+ h! q. `. o - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
: Z) a; g# o% x5 C - $mongo = new MongoClient('mongodb://localhost:27017');6 D" f' D: [ E; z) h
- $db = $mongo->mf;
; O5 n7 K' _8 F - $collection = $db->friend;
' k% P# ]7 D2 s. {& N4 q% w - $res = $collection->remove(['First Name' => 'jet']);+ U% p* ]+ H% N1 z, Z
- echo '<pre>';: l5 j9 [% m9 ?+ p; M! }! a
- print_r($res);//$res['n']表示删除了几个文档
复制代码
6 f9 W6 M0 F2 v; C以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
2 R* a5 @# {% t-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- + M X6 e3 W+ D3 v
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 t5 M4 r5 l: ~3 |* C; v* C4 h
- $bulk = new MongoDB\Driver\BulkWrite;, R( H3 ]8 C6 j6 @ j" n
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);0 j: J r: m1 a& p6 S( q
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);' x* H5 I# o E% j3 P! K0 R, p
-
6 G- U, M9 D) X" x# y" u. o - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
* r/ e) W. P. l& v, _ - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
( [, u9 L" u. K' q7 `/ o4 I, T& { - echo '<pre>';
! k' S* P7 Y8 K- S$ l - print_r($res);
复制代码
1 e. k8 B1 q) F. d d7 z4 `' _数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
+ f- s& T) l- J( X) ^+ c K - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* f6 v+ N0 n, H& c; ^
- $cursor = $manager->executeQuery('wjt.friend', $query);
1 }4 J- [, f: ^9 }+ x -
5 S, _% I; L3 ?, g0 i [# G - $data = [];( }# X: j. i, p% L7 a; |
- foreach($cursor as $doc) {
- w; ?$ s0 u4 l: V; o# D - $data[] = $doc;
+ H8 n& u+ c9 J+ _- J9 [* J - }% {, F6 T+ f; i% k5 I
- echo '<pre>';- ?1 J6 p7 Z! V% w9 l: f( W
- print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017'); l5 Y4 k$ j1 F$ J' y/ D
- $bulk = new MongoDB\Driver\BulkWrite;* q# T) w0 S0 D. V0 J$ T6 s k
- $bulk->update(5 S6 @5 a! @ J: _$ y6 s3 ^5 V
- ['name' => 'JetWu5'],
! C: R6 G* A# [- ]+ }: F9 o - ['$set' => ['age' => 30, 'promise' => 'always smile!']]% M+ i( W3 |+ g/ }3 ?. e( L
- );+ x2 n" A0 q& X: M5 X
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认# S) i1 z* A. q% B4 _( H
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
! J5 `) F& b3 A/ W5 M0 o" n: H0 ^ - echo '<pre>';
; H) _ ~' A" G: | X' r0 l - print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
( Y( s! x1 T3 ~ d5 S8 |1 B - $bulk = new MongoDB\Driver\BulkWrite;
- {1 r( _ i% q4 x( d4 j - $bulk->delete(['name' => 'JetWu3']);
# [7 M9 ?. j) ~/ G - $bulk->delete(['name' => 'JetWu4']);1 A+ t9 ^- p# f) u0 I3 D6 H
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 L: m5 ?2 }% q
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
: R" O( g3 W1 _9 {5 Q5 | - echo '<pre>';
' J. Z7 B& U2 ~; o ] - print_r($res);
复制代码 " y0 ?% q' j& d8 O+ Z$ {1 N6 ?! [
& f8 u P3 I" c& [; k' X7 {
# z) r( t9 |) |+ H- c
: O7 g% _, g- n' m; s
# h8 Q U& w$ x- X1 I |