MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。 一、数据插入 - //insert()
: Z8 M0 a" T- _' [" ^7 L2 [ a - //参数1:一个数组或对象! X5 P; o, ]1 F+ J0 c! s
- //参数2:扩展选项
7 p/ B0 d5 K* d1 \% w; n6 F0 w# \ E - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
W% n$ p7 r4 ^' M8 P. u' W! J6 [+ x9 f; n) x - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志# s1 G7 {/ Q: [5 d5 U4 d0 _8 H
- // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
. w% G, E( G% F$ A' ?3 l5 ] - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
$ {" P4 B( q( C- ~" t9 t/ ? - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
/ T* ^' B/ E! F/ C/ N! A" [ - $mongo = new MongoClient('mongodb://localhost:27017');
4 u( x; O" ^+ d - $db = $mongo->mf;//选择数据库
) V p, |* ]' \& z; V$ K) V - $collection = $db->friend;//选择文档集合
) n" {: ?0 o- c; q- }% i$ E - $doc = [//定义一个文档,即一个数组
- O: K( c& U# ^7 a% p- g' _ - 'First Name' => 'Jet',
: Q- W7 z3 i! ?- X - 'Last Name' => 'Wu',8 j! H( U" u) J! _2 [% y6 t8 B3 t
- 'Age' => 26,
& W5 \" m6 t* k7 b. E- q - 'Phone' => '110',* B% L2 v' B m+ \! A0 n
- 'Address' => [
* |3 Z7 W K4 s* h/ Z; n - 'Country' => 'China',
' J( M3 P5 b! _8 l1 A - 'City' => 'Shen Zhen'
& O! S- S4 E2 W7 K! d - ],# }* s0 [+ i1 [5 s3 @( v0 X! a0 N4 {
- 'E-Mail' => [6 E4 q" w$ C! u' a
- '123456@qq.com',4 m; H4 U' X; s( t5 r5 X
- '666666@sina.com',: S! ~% b( F; C9 p
- '8888888@qq.com',- t5 ?% @0 B. x3 u- c0 _; l+ G
- '77887788@qq.com'- y/ e5 A1 \0 z: S# V `
- ]
4 o1 m- S8 q! r( J6 \" Q - ];; q0 v: c7 ^1 v; Z
- $res = $collection->insert($doc);//向集合中插入一个文档
+ _: Z: H* |% E6 |5 f! d& _" M - echo '<pre>';7 J% S& ^; p& x: B' H
- print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询 1. 查询单个文档: - //findOne()
1 H0 Y, `* L6 q% `- C - //参数1:搜索条件; ?7 q1 W3 o \7 K- z0 S
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
" O, V; _: H- r" e - $mongo = new MongoClient('mongodb://localhost:27017');
: ?/ i& @( N3 t; T, j7 L - $db = $mongo->mf;
3 s. ^( W( u4 s# _6 j - $collection = $db->friend;; f" Q* |- |$ ?. l
- $one = $collection->findOne(['First Name' => 'Jet']);. V, j {& g9 z( q. @/ e3 w# l
- echo '<pre>';0 E$ K! o1 u6 A( q& C' [" J
- print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档: - //find()
# U9 }) r0 T9 a, q. J# O3 r& L - //参数1:搜索条件
: b9 l5 r- `5 j9 g/ w - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段" D. L1 m; ^' Z2 U
- $mongo = new MongoClient('mongodb://localhost:27017');
0 B9 W6 ]/ }6 k, l' O: f - $db = $mongo->mf;( Q# P% `, o6 I7 \$ l7 |
- $collection = $db->friend;: A8 c8 d$ p% W8 o1 i
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
" z: h! V8 h& D4 ?8 `6 b - echo '<pre>';
2 l6 {- p8 s3 y' g, }) O - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
( d4 S3 o) ]; M- f) _ - print_r($doc);. `6 i4 x t9 k& M0 {+ y% w' K
- }
复制代码使用各种条件操作符定义查询: - //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询+ t# ?) V4 g: Y
- $mongo = new MongoClient('mongodb://localhost:27017');
; L; r5 _9 e5 l3 w* U" o- Q5 l2 D, C - $db = $mongo->mf;
0 \. T) ?# ?6 A/ L: ^$ Z7 L - $collection = $db->friend;1 j" c6 R; Z7 `+ g; t
- $cursor = $collection->find(['Age' => ['$gt' => 30]]);
8 e" h0 V3 |0 `5 B! d8 D! ^ - echo '<pre>';6 V8 f: M# ?- x& l! S7 s
- while($doc = $cursor->getNext()) {
R$ {5 A/ m% v( G$ }5 v - print_r($doc);
1 e+ [1 W j7 Q# j: n$ L3 @ - }
复制代码 //查询某个字段的所有不重复的值$ T5 x1 ^+ a: c1 j$ {3 M
$res = $collection->distinct('Age'); - //$in:匹配多个值中任意一个
! ~7 U t, x6 \! _ - $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);) K7 y# c7 Y$ F, a) q
- 5 ?" @) Q; K* m2 c2 S2 T' ?
- //$all:匹配多个值中所有值(用于数组字段查询)
+ N7 `5 H" w5 C - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
8 b, a5 J; @' R- r# B7 q - * v$ x- P7 w' A3 u# U
- //$or:或查询
+ [( o, r) c6 s6 ], ^+ D7 j( B - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);8 G+ c$ ^0 d2 m- ~6 _8 `; O+ j/ k8 t
- ) n8 B+ c) |+ ], M- O7 e& u
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中8 H1 C0 {, R4 y" ^8 L0 R+ c
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
' @& @" K0 W! A& @ - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
" `- Q7 c i0 G' U" m - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
$ |; n! d1 B0 k2 J: U( q2 W -
5 i4 Y2 g5 ^" j2 W. |6 d: G - //$exists:根据某个字段是否有设置值进行查询! l s2 P/ M2 T. O4 G' o
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
$ a& ]. \4 i% t7 B. w) ~ U5 H -
% P( ~# [4 W7 p& o% L( v - //正则表达式查询
3 P' R1 a' O7 x: P - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数: - //排序:1升序,-1降序
; z9 ]) R- A7 ]9 v4 F% f - $cursor->sort(['Age' => 1]);% I9 v; l$ y8 X: l
-
+ T+ t% E: C* i5 v% ]- y- D" d - //忽略前n个匹配的文档' E" Q: x0 ?! B; v, {$ K
- $cursor->skip(1);% I' z' v5 j9 s1 A
- - F2 a/ J1 G1 e
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
; u, E. y* i6 ?1 y1 ` - $cursor->limit(1);
3 m5 D# s+ Y/ U2 L - 0 Q7 i- x v1 m. y6 x# y( C
- //匹配文档的总数" _% S3 U/ D1 R: ^7 R) H4 i+ d
- $cursor->count();
$ j! p- T# }- Q1 I; [/ V - " T( d ?$ S' T8 g7 J
- //指定查询索引' |" U( k* {6 [" N( p m# Q' @
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计 - //聚合查询:对数据进行分组统计
# T; I1 R3 `3 s - $mongo = new MongoClient('mongodb://localhost:27017');1 _6 O( J! j0 `8 Y8 H
- $db = $mongo->mf;
+ s1 |# Q# S+ ?& O - $collection = $db->friend;: Y1 R. _ g/ r& r+ p
- $res = $collection->aggregate([# G- z. H8 y/ \+ o1 A# J
- '$group' => [) O% G: H1 \7 \4 l
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
1 }7 E T& ]. T3 I* i - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
5 D% X, p4 n' ?: P9 H; l& X2 J - 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
; I! r) ~1 j6 a( g( e! R# S - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值. \: U9 h V) w4 \
- ]0 f' a1 {: o' Y. r
- ]);8 ?' e |+ S# D M* I+ ?) l7 f
- echo '<pre>';
5 h! [; _8 X5 D: j8 \8 B* m$ u4 k - print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果8 v4 l, }* c' t+ w' D/ U
-
1 S( a W0 T5 A, v, c - : `3 D/ s: R5 ~+ E* h
- //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, Z2 Q, b' _4 I' u% B# q
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
1 s2 ?! B. W9 V( n4 f& y8 ^ - $mongo = new MongoClient('mongodb://localhost:27017');6 n0 F* x, O7 v7 D/ w# P
- $db = $mongo->mf;/ z2 w: _' y+ S6 v7 z& A
- $collection = $db->friend;, `0 l8 Q. t6 a, F" R [" ~/ |
- $res = $collection->aggregate([! h& A' ~' I) A# J( O
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档1 e H: G8 d. H1 [4 [8 J9 X' u1 P2 F
- '$match' => ['Age' => ['$gt' => 30]]( d: x' e) Q0 Q5 o& |0 ^( }
- ],* l: ^8 e8 q J& @, e/ X( ]% y
- [//指定分组字段、统计字段
; @7 w, Y1 ~; Z c/ m! d$ R- `9 O0 \ - '$group' => [/ R& \$ X$ O- _- c8 ?
- '_id' => '$Address.Country',
* G* D! \: J; S8 U2 Z& ] - 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和5 ]3 E0 a2 L6 H$ C! K2 v, [+ K0 U
- ]4 Q% R2 N7 J0 p) O4 ]- |
- ],
( t6 S$ [/ p& C+ i - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档; E- g$ |# ^, B3 a$ ` n8 n
- ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
, |4 ]# V7 _4 g7 m/ v+ U1 D" A: Y - ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名$ u. F8 B, v8 ]8 I
- ['$skip' => 2],//跳过指定数量的文档
6 a; I7 F; s0 {8 k - ['$limit' => 2],//只返回指定数量的文档
' n3 f# e8 @8 q. r+ y - ['$sort' => ['totalAge' => 1]]//排序- @: n, i3 Y6 o
- ]);
5 g/ ~ v2 G a) L; s. u - echo '<pre>';6 i( z. y, U1 _0 ?% O$ _
- print_r($res);
复制代码
4 t0 E( K1 g0 n3 h- g三、数据修改 - //update()( a" c0 r9 |/ G4 L
- //参数1:更新条件,指定更新的目标对象。
: u/ f' @- y- b- U7 k8 L# s* F6 { - //参数2:指定用于更新匹配记录的对象。
( K- s2 l( l, M) l- K7 C; O1 { - //参数3:扩展选项组。
# W+ ^* V- Q( N5 d" h - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
* l9 e: `- A o# ]. j+ s$ b - // multiple:默认为false,若设置为true,匹配文档将全部被更新。
8 e, ?) C" E* S% y" x - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
0 i5 T, [3 U! Z4 L5 a - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' O/ \: F6 Z; Z
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! y8 E3 ~/ J0 H/ @! N/ M* z - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
+ R. D: X& }: c! f! c" I6 [0 X( M8 C @ - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)0 ]3 Q: ~3 e' g4 c
- //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: ?% C+ h" ?; Z) W3 P5 Q1 R
- & G+ C0 A. b: t+ K
- //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 e' q# L* E, r! q6 X
- $mongo = new MongoClient('mongodb://localhost:27017');
9 n9 P& ?8 k* }% U - $db = $mongo->mf;
]. @3 Y! r2 ? - $collection = $db->friend;. B/ V! V, j' ]: P8 I
- $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
& S+ @! `3 P5 ]! ^: c - echo '<pre>';* D {1 j, k; u
- print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
% Q5 Z3 M7 H' _8 g& z' J$ X% p -
- j6 p5 u7 x0 z& \ - //$set:重置特定键的值,若字段不存在则新建字段并赋值
0 y0 D0 r5 ]$ E0 { - $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
: [4 d; J8 d( [+ T7 t* z* B6 m -
( q1 l) `4 a7 L" s' I4 w. B - //$unset:删除字段8 n& \# F( q# T5 r
- $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
( F% |$ c# j; r, _ - 3 b. l6 m$ A, Z9 U4 ]
- //$rename:重命名字段,若字段不存在则不进行任何操作
2 E) s" q6 N2 `0 t( i3 V - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);8 O; d1 C* n% ?- v$ Y9 @
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。 r# n9 F6 }! a# e s
-
/ V( |4 \" M8 R6 a. L/ V - //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
! {( {! |( y8 r4 P7 w/ [ R& u5 A - $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
) ~2 k9 A8 K) N$ F5 h: A - ; l% n i$ {# Q
- //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
8 B4 ]7 s7 z% K' v) Q - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);8 S4 I; `2 o0 A5 v( e
- # }) j' T( J$ x" F* H+ C- p- O
- //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错) `& i. Z/ m& V# b! R' Y. q
- $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
! S2 m0 E& u1 l& Q/ u% Z/ { -
* G3 E O5 }$ v. [" B" P8 O5 t# ^ - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
& f5 y0 ]. R8 P6 N; y$ C, n( p - $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);( [0 [1 H m% Q; L" G2 f) B# u% I5 ?
-
9 T0 ~+ }" W0 D, A) ]9 q+ y - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中). M; }1 A! \2 Y; V& {5 N
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
! L0 u. z' F# {$ A6 y, W, r. s/ ? - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);; j$ H$ a) v# w, S. ~
-
, s- M8 ~- o1 n1 [/ G - //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)* s1 ?0 a: J( j6 a( a! e
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
2 ?+ Q5 u& e: Q+ _" R -
8 s) j+ m7 T2 m9 N - //$pull:删除数组中所有指定值
2 B. j( b9 U8 w. n3 A% b - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);9 o4 h$ b! M K6 Q+ w6 ]
-
I$ c( ?; y; j. Y; V p L* E) j - //$pullAll:删除数组中多个元素的所有值' O, L; _( t) y. a- S* ]
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()* c$ g! z* @ P, ?2 W r
- //参数1:希望保存的信息数组& v# Y' W7 c: n0 J& ?2 t' S
- //参数2:扩展选项
8 ]2 T5 ?# ~3 k7 d - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
' k8 C6 c( `3 G. Q - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
2 l- O/ H+ H! j - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
+ _% V& F6 p5 e; h - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
: m, l+ V" S- W) z1 q9 U: J5 s - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)2 s- ~% A6 e6 ~* |& j g
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
7 e( D# a' R9 ?( S; {4 y; B - //若想更新则应该在参数1中指定_id键的值。
* P& i! X5 Z! ~0 ]: F4 J; M- p' _$ P - $mongo = new MongoClient('mongodb://localhost:27017');
" i, F/ [* y$ k. S/ n$ l( O" `8 l - $db = $mongo->mf;+ N5 F% V% i- Q! Y
- $collection = $db->friend;/ v6 C4 A( @& Y
- $doc = [//定义一个文档,即一个数组9 c( \- a' a$ ?% d# R
- 'First Name' => 'Jet',
8 h* ^) d8 f, A: M3 j# t% y - 'Last Name' => 'Wu',
: J3 f+ p- f) ?; W# P - 'Age' => 26,
8 ^: N) y& g6 U, p - 'Phone' => '110',
* ~/ O9 p! c. w# r1 v - 'Address' => [/ Q4 x ~* ?$ e2 D# t6 Z" V
- 'Country' => 'China',
, _5 |: N1 i* _* q - 'City' => 'Shen Zhen'3 |2 i' x2 Z7 h( c7 n! P6 Q
- ],
: v" V" b% a% q5 i, X# r4 |- L - 'E-Mail' => [" K% j/ U7 o# y6 I5 q& ]3 a
- '123456@qq.com',
4 H. F9 j3 o% ~+ p - '666666@sina.com',$ R( Q& e" O$ X" o7 M3 q
- '8888888@qq.com'," I% o* S; Y7 }# w/ _7 v& L
- '77887788@qq.com'( @/ X' Y6 o' a( b. x
- ]
/ w, k( o5 O1 L# f. L - ];/ l' t- R& A \. w- h1 ?
- $res = $collection->save($doc);
$ ?. E' o) _; ]1 x - echo '<pre>';
4 l4 J6 R6 O4 s6 \4 C - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
3 c' n! L9 Q1 t) C O0 ~4 h - , _2 R2 L* g7 V4 M6 Z2 R' N# l
复制代码- //findAndModify()2 }4 u- h" P" P
- //参数1:指定查询条件
# v6 M/ n$ u* O. }$ @# w - //参数2:指定用于更新文档的信息6 U- Q" m5 y- h
- //参数3:可选,指定希望返回的字段
- u' l% i2 S* ~" O) p1 \ - //参数4:扩展选项7 U3 W0 v1 b3 K
- // sort:以特定顺序对匹配文档进行排序
* a) w! s6 F$ n6 {/ y - // remove:若设置为true,第一个匹配文档将被删除: ~; t Y/ ]! p/ X% P
- // update:若设置为true,将在被选择的文档上执行更新操作" e& t" t+ [( h/ s2 H
- // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档 H7 y2 E; E: g6 N: R) \
- // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档0 |( @6 K- A6 m9 z4 B
- $mongo = new MongoClient('mongodb://localhost:27017');
~# {, S, \/ a; \' \. O - $db = $mongo->mf;
3 y+ T9 v' v% B+ V3 z - $collection = $db->friend;8 n* E# X9 d9 o5 _
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
' A, z( a2 H7 C" j - echo '<pre>';
) {5 K; \% }* N* x/ Z) P) H6 f - print_r($res);
复制代码 四、数据删除 - //remove()
2 a$ M6 x9 D% E - //参数1:查询条件3 C" n& O3 ^# s+ K6 ~$ A" M2 r
- //参数2:扩展选项
5 }/ h( N [, S* T G - // justOne:若设置为true,则最多只有一个匹配的文档将被删除7 D4 o9 s! H* r( ]
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。! ^5 c8 T$ ~# O, x; j. n2 |
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
& ^- B! Z) w" b: B6 {# c1 Z7 a3 t - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。; l9 |7 S- q0 K4 H
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
# E; G6 V3 C4 V$ x - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
" N: U/ Z: l: C4 G9 U. o+ l - $mongo = new MongoClient('mongodb://localhost:27017');) ^( s& L% i6 S% l. S
- $db = $mongo->mf;3 @6 J! a) [. T7 E7 @( [$ Q7 O" I- Q
- $collection = $db->friend;
; t, }0 I; B) N" [& L5 g' r - $res = $collection->remove(['First Name' => 'jet']);1 F) D k: i1 d, B, K- X6 q) i9 P
- echo '<pre>';% y- v- J3 b% w$ o6 \. n" D' b) m
- print_r($res);//$res['n']表示删除了几个文档
复制代码
' R% b8 v; k8 g- _1 `以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。 0 X6 D3 }/ g( B0 I. }9 S
-----------------------------------------------PHP7分隔线--------------------------------------------------------------------- ) T" R5 y+ G7 m" ?( j& P
数据插入: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
! Y1 O% d- d" F0 B3 \ - $bulk = new MongoDB\Driver\BulkWrite;! X; B0 F1 a( K ^6 q$ e( t) w
- $bulk->insert(['name' => 'JetWu5', 'age' => 26]);: V: N' p& m9 ~( F7 T# O( |
- $bulk->insert(['name' => 'JetWu6', 'age' => 26]);8 b- A7 S1 n+ W, A6 X7 ]+ Z9 ^
-
, I0 p4 \- }6 g! h8 T - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
/ {" e9 E2 F4 t* l+ h3 l' r/ v - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ e1 G' n8 [$ [2 H3 Y# m; `" P
- echo '<pre>';
( e; n/ N: b/ }) u3 `8 I, D - print_r($res);
复制代码 5 H8 P% I. |4 V0 T# U1 u: P+ d7 [/ D
数据查询: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');2 R; ^6 L4 y5 M1 V( m! z
- $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
2 u( x: |7 ^. w2 Y* x# [ - $cursor = $manager->executeQuery('wjt.friend', $query);
. r2 i- |# C1 f6 Y; ` - $ L* v$ @8 N, m4 }
- $data = [];5 }0 z/ p. m1 t% q6 I& i3 [
- foreach($cursor as $doc) {
. j0 f6 l9 G1 ~1 S - $data[] = $doc;
, y6 \0 c' z! y/ q - }
% S* m2 }8 |% M, F6 s0 a+ ?' D - echo '<pre>';
% }% C7 s8 w; ^5 U+ K: T2 c% a8 \8 B, @ - print_r($data);
复制代码 数据修改: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# l2 p S( `# D( t* \
- $bulk = new MongoDB\Driver\BulkWrite;3 T4 [) D5 I' T
- $bulk->update(
7 X# @4 ~8 @# H! k& _% A" Z. ? - ['name' => 'JetWu5'],
- Z( s' F% g K- o7 d: P - ['$set' => ['age' => 30, 'promise' => 'always smile!']]
8 y; w' o) [7 b7 ^7 c* \1 m6 W - );
& _& x- V) j& F+ v - $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
2 J0 U9 N; u, i: g - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
6 b3 f2 \) ~2 H5 L( t7 v( x - echo '<pre>';4 M% B: i% ]% [+ X
- print_r($res);
复制代码 数据删除: - $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! A2 ^8 G& @: C# t# f. W7 G
- $bulk = new MongoDB\Driver\BulkWrite;5 t+ |, B* A7 ^' c& X
- $bulk->delete(['name' => 'JetWu3']);
2 y4 M# D9 J/ f- y. p - $bulk->delete(['name' => 'JetWu4']);; q7 {6 I% q t r$ s% `
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认! s$ S+ F# e ~. k# P8 g
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. X) @1 {9 A, R7 E: W; s
- echo '<pre>';9 J' X6 F ?+ J/ j" ?6 V
- print_r($res);
复制代码
% X9 A2 K. M/ g+ M+ |0 b' A9 C* U' x1 a
7 z% r+ |$ ~7 L4 s, P' j/ H5 \
, C, _1 R: L" \) r: f9 i! l- F4 _8 s# W& a; n9 v5 l% Q
|