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()
& A/ ?$ P$ K) G& ^" y/ y1 g8 i - //参数1:一个数组或对象$ D2 }, o- e0 C( I! P" K1 m+ f1 O
- //参数2:扩展选项
& ~; }2 @6 x' ?% {; E - // fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
! O. L, u# M2 B9 ^9 g% I! w - // j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
9 E( s0 S. i2 ~/ R) V - // w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认6 u. D3 ^3 i _* E
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间4 W$ S: M; j5 _+ l- z2 J' Y
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)+ }6 X3 p6 G% n
- $mongo = new MongoClient('mongodb://localhost:27017');
8 e% d9 Y2 e( R( D1 D7 U+ d; b* m - $db = $mongo->mf;//选择数据库
3 O" K4 I* h3 n1 e( B% a2 c - $collection = $db->friend;//选择文档集合
5 }- Q6 h7 F* |2 F: }7 |* ~ - $doc = [//定义一个文档,即一个数组
5 E+ {6 j4 R4 a9 @ - 'First Name' => 'Jet',
+ Y( W# x. I6 O - 'Last Name' => 'Wu',( [7 D0 ?; i! j6 b& i
- 'Age' => 26,
9 w6 H; {& G7 |( W - 'Phone' => '110',! u5 u g& m/ Q- q
- 'Address' => [* q; s3 y4 P9 C- e# c& O- ~
- 'Country' => 'China',$ {" U7 j9 R- q6 S0 `
- 'City' => 'Shen Zhen'7 h' Z5 Q7 G; q) }& S
- ],
% ~ i. a# p; b Z2 h - 'E-Mail' => [; v7 b* \9 I$ X
- '123456@qq.com',& X+ V4 @+ b4 G5 L1 @- l+ l" b
- '666666@sina.com',# h/ G9 l, e( q9 h4 Q
- '8888888@qq.com',2 c {0 a {% w5 V( d$ i" Q, B
- '77887788@qq.com'+ u* B1 |4 u1 R
- ]
! G( \4 U! }# N$ b' r- r - ];
1 T1 [$ g: B' y. T* Y3 G - $res = $collection->insert($doc);//向集合中插入一个文档
" U2 f: N0 t% Y. v& l. }& B - echo '<pre>';
9 V6 ^/ @! _) Z! { - print_r($res);//$res['ok']=1表示插入成功
复制代码二、数据查询
1. 查询单个文档:
- //findOne()* [' n' R0 n+ M, m+ P, H
- //参数1:搜索条件, Z; d! j9 k* H J! x2 ^1 T& \0 D
- //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
" O& w! [# Z4 e5 c3 \% j - $mongo = new MongoClient('mongodb://localhost:27017');* c6 c. i+ t k( A
- $db = $mongo->mf;
4 F. w e$ j" @2 @+ ?, u; H7 j - $collection = $db->friend;
& C) E$ Z. n4 Y - $one = $collection->findOne(['First Name' => 'Jet']);
% X e6 U; P* Y7 A - echo '<pre>';
6 a7 {8 x; _. k* M2 j8 I: {" i p - print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码2. 查询多个文档:
- //find()
3 \6 y6 O( {; v: l3 d! ~% v5 o - //参数1:搜索条件
3 T# Z) L6 S5 ^3 F( M- ~7 V - //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段- g# I1 q `3 N% i
- $mongo = new MongoClient('mongodb://localhost:27017');
' V0 p p* ]$ j8 ~4 E - $db = $mongo->mf;
$ [" c4 B3 a7 Y* v) V4 t- B+ x - $collection = $db->friend;4 l; Y/ O" n* E# I% x
- $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素* v, t( P1 U8 ]9 t+ G. N8 g& Q7 ?
- echo '<pre>';
$ q9 u+ X( P: J/ { - while($doc = $cursor->getNext()) {//循环读取每个匹配的文档- S0 Y& j- z% G3 _8 g" a* }
- print_r($doc);, g. B( u- y U! [" Q- V- @2 M# y
- }
复制代码使用各种条件操作符定义查询:
- //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
: V3 G. K- N" C7 X T - $mongo = new MongoClient('mongodb://localhost:27017');
' |) q u' k5 q8 j; ^ - $db = $mongo->mf;
' {& J0 D; \! |/ S3 [6 t, X h6 K& s - $collection = $db->friend;
* r, H0 p' n! _ - $cursor = $collection->find(['Age' => ['$gt' => 30]]);0 B% m% B, |. m0 r$ ~
- echo '<pre>';$ E/ g t2 i( B( o
- while($doc = $cursor->getNext()) {
" h7 a. l. {% X) Q' x- J - print_r($doc);
9 ]4 B+ Z+ t1 W/ q q+ c: h5 I - }
复制代码 //查询某个字段的所有不重复的值
9 e' M* H- i$ I) s3 V! h [, G* p% Y $res = $collection->distinct('Age');
- //$in:匹配多个值中任意一个4 f7 A0 N, Z1 O _+ m
- $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
) E( z- o3 Y/ a; j) ] - - c/ U: ~/ G% }0 [: S; l1 k+ s7 C
- //$all:匹配多个值中所有值(用于数组字段查询)
4 O& F; y' T* D5 p; w+ H/ P2 T l - $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);/ J5 t1 x/ D2 ~. Q% Z9 b3 T2 i
-
+ B8 t8 L! C' o - //$or:或查询
* p' H/ e! ?) x3 W - $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
7 C5 t$ E; e' e( `& v7 C' w+ k - 1 u' l) m8 R. H* b
- //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中% E/ X7 {: ^1 v$ b% y
- $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
+ v$ A, {7 |0 t7 L7 d' t! W& { - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
0 Q2 {3 a4 A6 X( S - $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
& e' F0 ~# f* M; a$ W -
) j4 _% D2 K8 ~ - //$exists:根据某个字段是否有设置值进行查询! { D0 i5 s/ B+ I+ S( ]& m, [: h7 e
- $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
$ o# M7 C4 S) m6 ?7 A& B - 2 i# w4 ~3 P `+ W
- //正则表达式查询
) y2 V% |+ x( r4 D - $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码使用MongoCursor类提供的其他函数:
- //排序:1升序,-1降序
+ {* a5 o' i9 P) Y2 l* a d - $cursor->sort(['Age' => 1]);
; l3 D2 R6 f5 Z# l' N3 L* [0 V- P - 8 R6 c7 G, k' @9 A) I# I0 n
- //忽略前n个匹配的文档: {" C0 W: R6 k
- $cursor->skip(1);3 F, G( d$ Y( }3 N
- 3 E% K0 w7 n1 A7 h) W
- //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)0 C- S4 j, s# Z+ g- S2 x! ?) c2 C
- $cursor->limit(1);6 d% z9 {) d3 `3 F. w8 J* W1 W
- / k, z0 A! X) E* G" L
- //匹配文档的总数4 g2 u7 v V; P& k& \! D( W
- $cursor->count();5 X$ g( {8 R1 U( @% `4 l3 k
- 4 M/ e+ l/ X g0 Q6 u- i
- //指定查询索引- N7 o' h7 q) P, r/ C
- $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码聚集查询:对数据进行分组统计
- //聚合查询:对数据进行分组统计
1 G8 v% y$ }2 s - $mongo = new MongoClient('mongodb://localhost:27017');
& D% W8 k( F; v; H- n+ j! j - $db = $mongo->mf;
v# w7 U6 w5 c$ S% A5 p# p6 t - $collection = $db->friend;
# I/ x* ~- D, U& l' E - $res = $collection->aggregate([' n6 b; m4 s( U' z8 P2 S8 L* X
- '$group' => [# b+ ]- {8 T+ M3 F' v$ L
- '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
- Q& {8 j7 O( Z6 K6 y+ P - 'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1. H$ T9 @- M9 V
- 'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
# d8 t+ A: `9 {# H - 'minAge' => ['$min' => '$Age']//分组中Age字段最小值3 S; Z; k( \/ x0 g, M9 A' j9 Z* d
- ]
. Z( g; B* A# A2 Y. h - ]);
/ ~8 v" Y! o$ X5 {; Q2 n' z - echo '<pre>';+ j& ^. W9 _/ a0 H& [( C
- print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
1 r% G" X, u& S8 ^ - 3 z4 l2 |- R: v( D
-
2 _" V) m4 W2 f2 X; [3 { - //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序4 a: j/ m8 i3 }8 ?, W" c- p' k
- //聚合查询中的所有操作,包括'$group'在内,都是可选的。
% f4 c* ^! h3 o5 j7 d - $mongo = new MongoClient('mongodb://localhost:27017');( h) i' F' w3 L, W# {0 w
- $db = $mongo->mf;
0 C2 M* p J; t, ~( [ - $collection = $db->friend;9 _( P# d, x9 h: Q9 q
- $res = $collection->aggregate([$ L1 i. T4 c: |9 T7 Z3 ?& V
- [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档1 e4 `6 ^" t4 y! m# n8 L
- '$match' => ['Age' => ['$gt' => 30]] C) O" d! h/ G1 r, E r$ L, r9 K
- ],
- S& [; C3 R& |7 @) q - [//指定分组字段、统计字段) D9 ^8 [! M! t0 H
- '$group' => [) [2 o8 e; c: x% j- o
- '_id' => '$Address.Country',6 C5 R* {$ Y1 z$ G% L" n" Z
- 'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和5 ?3 M* v8 Z% u& b4 t8 w
- ]5 p) X, l1 t* E
- ],
9 U9 U5 P8 Z) r8 Y: K - //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
: U9 m5 h: U- D. \ - ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。* d5 v9 e7 s0 \( x' O
- ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名6 T: j1 T5 G) ?
- ['$skip' => 2],//跳过指定数量的文档
( S% g) n4 e3 ^4 N" Q* j3 _ - ['$limit' => 2],//只返回指定数量的文档 V- D8 j0 u' `. D1 y) _
- ['$sort' => ['totalAge' => 1]]//排序. m8 I% d# X- W
- ]);: H! x7 X. Z4 T6 P
- echo '<pre>';% w1 Y* L6 x/ A/ q6 Y( B& E
- print_r($res);
复制代码 ; s2 y! l/ Q$ D8 l# {
三、数据修改
- //update(); B) I$ c T( w
- //参数1:更新条件,指定更新的目标对象。+ I- Z/ l: a, A- w' {
- //参数2:指定用于更新匹配记录的对象。
+ d- w% K6 l( Q% w8 H - //参数3:扩展选项组。
/ I; {7 s/ d) ^% F+ M/ n) Y+ b - // upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。: Y" d2 h8 L- A' R
- // multiple:默认为false,若设置为true,匹配文档将全部被更新。
! R2 o+ x; G/ f - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
: W& E3 r$ x" L - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
; e3 f4 O0 H& B2 a4 X$ g+ Z - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- _7 ?7 @, }( H& Q0 g
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ z3 @8 B0 w5 i0 Y% {
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
. ^8 Y4 A9 s, F% Z% ~ - //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
8 v6 V m9 u: Q! H4 i% K( ]3 P -
9 Q# R+ q7 ^, ]$ T8 A/ W - //$inc:增加特定键的值,若字段不存在则新建字段并赋值7 f. Y Q$ X; ]$ u6 N' \2 g2 C- }
- $mongo = new MongoClient('mongodb://localhost:27017');
1 L! W6 t& H3 X/ ]' l - $db = $mongo->mf;
/ R! J( K# g3 d- T, R - $collection = $db->friend;
) ]" p2 [- T% u) |) ]' ^ - $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
: k/ ^0 t B2 w$ _5 G - echo '<pre>';
6 \: C. w7 a: X3 x! i C% z- i - print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
3 n& G& L: ~; v - 9 l- ?3 @+ N* |
- //$set:重置特定键的值,若字段不存在则新建字段并赋值1 w8 d8 r9 ^3 R5 ~5 v6 _! ]
- $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
4 v8 H4 i& P" r7 R+ Q/ o4 X -
$ v9 t- F. D! K - //$unset:删除字段
4 r( a* Y _3 p0 s' s1 r2 ?+ S - $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);/ {# |+ L) w G8 g
-
6 ~1 c6 K, K1 D- }3 Y- g j - //$rename:重命名字段,若字段不存在则不进行任何操作
: |+ p/ i \& h- H" ` - $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);& v8 w* ?# e) R
- //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
5 {) _* Z, e8 T1 Q& l" L2 R - - f) @2 P1 {/ w
- //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的$ }9 K2 j+ X; ?: ?7 {. T8 ^
- $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' M9 y/ k3 J; v2 G
-
: i7 U/ O0 Y( x5 r6 Y: Q9 ^( F" | - //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# e/ k4 g. c: q' Z+ i0 p
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
4 A3 X. c# b5 n* r) _ ] -
$ s; @- P& c/ ^3 j4 x5 i: r0 M F k - //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
" k- J% J1 e5 m( p% z - $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);" z% E0 M" E6 H; {1 l
-
7 W6 ^# ?+ [9 y1 l7 R9 q. z. i& I1 g - //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错; E) r# L8 h- A5 t3 I3 ]
- $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]); P, `) @6 z/ Q
-
9 S. I% X o2 ]1 U/ j( ^( i/ H3 K - //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)& D! t4 E: `6 T- l5 G- ~% v4 I
- $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
1 U$ }% |+ N* ] - $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' M5 ~2 U* K- S& A8 Y' a+ Q
- - H3 m+ m8 |! }0 t1 Z
- //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). P/ G! X% s. I4 D3 H) f! |
- $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 X. A7 E) C( a% |6 x& a& |0 M
- . N# Q) b4 b9 K, C$ p6 `3 [
- //$pull:删除数组中所有指定值
6 _5 l5 q; ?8 W8 ^ - $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
( R$ D$ ^5 {6 n- y6 Y9 i. J - * q: }$ K% j" E9 `' s* {+ r! L) B
- //$pullAll:删除数组中多个元素的所有值) R% Q8 @- m$ x. k! L
- $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码- //save()6 v! F& i8 O* X, u. u# Y" v
- //参数1:希望保存的信息数组 ~5 @3 D2 s9 A. Q6 P* ^* R
- //参数2:扩展选项4 v2 ?# s$ R1 Z& M( U
- // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。7 i1 P6 ]/ c# D% @1 \2 H
- // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作( I; c# f8 P; @
- // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
! y7 C% N; p5 k - // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
/ C1 U7 N6 d) w6 l* R; Y+ ] - // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ J' T6 R4 p9 n) H) {$ H
- //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。7 T! L o. T6 C
- //若想更新则应该在参数1中指定_id键的值。3 s3 w- N# j& T
- $mongo = new MongoClient('mongodb://localhost:27017');
, ~* |+ W3 W x8 P - $db = $mongo->mf;' k& b6 ~2 ^: n/ V$ ^5 Z
- $collection = $db->friend;6 X" l& h, E0 W
- $doc = [//定义一个文档,即一个数组
0 g( r# k! m; ^! t: k# P8 N) K9 } - 'First Name' => 'Jet',6 ^ g/ p8 s% t6 k0 y: u& [9 j# }
- 'Last Name' => 'Wu',
! R0 t* Q3 P8 z' _; i* O - 'Age' => 26,+ R' m( @9 ^, v' b
- 'Phone' => '110',
6 |% C. I! |; R/ b - 'Address' => [
( Q9 H1 u% Y8 c& ]' a - 'Country' => 'China',
& B+ R+ W4 Z8 c- I- i% e - 'City' => 'Shen Zhen'& v) |% U+ z3 z/ x/ P: h5 b
- ],( ?# ^; l2 m3 |7 i" c A: e
- 'E-Mail' => [ D2 t9 s2 M/ Z6 }' F4 A
- '123456@qq.com',
2 t* m0 s8 r2 x* L8 F. J2 f% [ - '666666@sina.com',
1 \# J" F$ V) x! D7 c - '8888888@qq.com',
, V. i- l8 ?- O, M: v( y r3 ? - '77887788@qq.com'
2 B4 W- d' _9 ~5 O9 T% b$ m0 y' h u5 b - ]
. I( \9 J3 l# I" U( m. ~7 Q- X - ];( M3 b2 A1 ~& i! c, H/ S$ n
- $res = $collection->save($doc);% @7 w# l7 P: ]( ]* [: `) K5 D
- echo '<pre>';
! X" j2 K/ b+ a8 |3 Y7 t) ]1 u - print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
7 j" @: \. Q* V) k% H l - ~ e! D5 n& e
复制代码- //findAndModify()
g7 j% Q5 {4 n- c7 p0 j+ W" ~5 Q% y - //参数1:指定查询条件' R0 U+ {, ?5 G: G! _' I
- //参数2:指定用于更新文档的信息
& a- Z. F3 a' k% f8 ?/ R( F( a X8 v - //参数3:可选,指定希望返回的字段- [4 s# e) W* }
- //参数4:扩展选项
, s3 ~; l! m% Y - // sort:以特定顺序对匹配文档进行排序8 B4 |/ K( |* K& y; E j
- // remove:若设置为true,第一个匹配文档将被删除0 v1 G g+ S; U- L6 G/ F T
- // update:若设置为true,将在被选择的文档上执行更新操作
N3 f: E* x, R - // new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
T% C, x: d, q% ?' ?* y6 l - // upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档" F# j% f$ A- b$ Q I: ]: B
- $mongo = new MongoClient('mongodb://localhost:27017');' m7 K% M+ V6 ^% n9 N! e+ k/ \! l6 [
- $db = $mongo->mf;/ L4 o1 {* T& N+ }0 \) F
- $collection = $db->friend;1 z5 _; x1 |( q% f
- $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);8 a7 d! J, }; [/ z. r" e
- echo '<pre>';" {1 W) z7 @' L$ @$ t- |
- print_r($res);
复制代码
四、数据删除
- //remove()
2 k$ X$ }# V2 |! n4 z& V. l) r - //参数1:查询条件9 `( `! G, }$ Z! N5 w
- //参数2:扩展选项" O# M) d$ k. x! K: \+ L+ r/ e
- // justOne:若设置为true,则最多只有一个匹配的文档将被删除
5 U: B) y- Z! [* e* b; T - // fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
" p q/ X! i% d- T - // w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
I; g- i% [9 C- E - // j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ M O$ P9 o; [2 r# F: X1 S
- // wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间: ^* I0 ?( Q! m3 `
- // timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
# {$ j- d) C% E2 U - $mongo = new MongoClient('mongodb://localhost:27017');
3 J/ |8 p& j, B4 C8 n4 k" B) B - $db = $mongo->mf;
7 M' O; O- K& @ - $collection = $db->friend;# P W8 E. Z* l L1 T t0 p( ]* T# l
- $res = $collection->remove(['First Name' => 'jet']);; g- W' X; p" ~2 p* b V% p x% {8 r
- echo '<pre>';7 K4 C+ l) e i4 B
- print_r($res);//$res['n']表示删除了几个文档
复制代码 6 w& E2 I" E# c% |- V
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
/ o$ j. [+ U* `-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
& m" [, e) x3 H5 M' x
数据插入:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ f2 I" s, {9 [5 M# l3 {6 [5 c
- $bulk = new MongoDB\Driver\BulkWrite;
% a, }* i3 y5 G9 J/ G3 B - $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
" k/ `, D* B# v* k - $bulk->insert(['name' => 'JetWu6', 'age' => 26]);$ q$ Y* `. Q* N7 K
- 2 W3 k. w! W7 h9 ~5 P3 S$ `
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认% q+ P5 X, {3 n! C( B
- $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
! ] P: ]3 h2 J; Y - echo '<pre>';: w a! j; M8 v3 m* s" ?
- print_r($res);
复制代码 % t1 E" n0 X. r4 a$ q
数据查询:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
3 r) \0 N( f$ w - $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
5 H* w6 a$ u* ?" [0 w - $cursor = $manager->executeQuery('wjt.friend', $query);
& M7 o9 Q) E1 X7 ~. F6 y& m0 K8 n. k( C - 9 c! T- Y! K3 t2 Y9 K
- $data = [];# z8 r- |) @* T- S8 Q; { n! h4 B
- foreach($cursor as $doc) {4 M+ b% D5 l/ g j: r2 V! l
- $data[] = $doc;
' X' g8 W& p. j% N9 M* ^% m - }2 j) x: x$ K% F4 d) N7 \7 G1 }
- echo '<pre>';8 e. R# ^" t# K7 V3 U5 u' i6 @# m
- print_r($data);
复制代码
数据修改:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');* ?# R0 a' U* ?7 {
- $bulk = new MongoDB\Driver\BulkWrite;$ K* L# h1 d' u4 g* B
- $bulk->update(
; h6 H( [& e; S - ['name' => 'JetWu5'],0 ~- h2 Y3 x/ Y7 R- F6 d
- ['$set' => ['age' => 30, 'promise' => 'always smile!']]
: p9 h+ S9 t! C7 @$ F) g - );+ ~' U/ ]6 F- y% {( O$ O5 F7 e/ z
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
# D8 L9 y5 ?& {; v& L - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);* C7 ^. C& e \# x6 Z- D) r
- echo '<pre>';
, {5 E, C/ i- J! p5 b( n - print_r($res);
复制代码
数据删除:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( b% v/ {) ]) T' X
- $bulk = new MongoDB\Driver\BulkWrite;
+ m7 ?% ~# f; U - $bulk->delete(['name' => 'JetWu3']);
2 }* s: o$ U) ~# x( [9 P5 ]* e) J - $bulk->delete(['name' => 'JetWu4']);) s+ T1 j7 F; _
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
+ F1 u, s+ n( @- L2 \: V - $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);2 ]" a/ T! S+ C7 i& `
- echo '<pre>';: ?* }9 C6 K: Z, ]3 W
- print_r($res);
复制代码
) y9 u7 R' e J |$ ]$ S
! w7 a/ m) `% O7 h$ O9 ?" K7 `
/ ^7 o% s3 J/ `0 p T, E% Y5 k+ E; B7 ~7 ]
' r' g: p0 J1 Z$ r. K
欢迎光临 cncml手绘网 (http://cncml.com/) |
Powered by Discuz! X3.2 |