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的操作。
一、数据插入
  1. //insert()
    ! ]7 D6 S' `& P; z
  2. //参数1:一个数组或对象- J5 T7 W) M- U8 G2 B* z5 ^
  3. //参数2:扩展选项
    7 i+ G, D3 s- @. s  i
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘3 q$ z. l8 K6 ?5 C. w
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    8 q) |8 S! m4 Q) D3 H
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认4 K6 U6 k8 @" \9 Z1 N+ j
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ' d* ^- v& P# C6 D9 ?
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    " [1 o, o, N5 q, L9 z
  9. $mongo = new MongoClient('mongodb://localhost:27017');* @4 o0 Q7 P' L6 G/ x/ {
  10. $db = $mongo->mf;//选择数据库
    . M1 y5 s( @6 T9 y4 Q
  11. $collection = $db->friend;//选择文档集合; E4 d" u+ ^5 O0 _( p2 F+ n
  12. $doc = [//定义一个文档,即一个数组# G" S% f2 w0 m
  13.     'First Name' => 'Jet',) G- L' G7 w0 n8 X, ]$ k9 ~9 J
  14.     'Last Name' => 'Wu',) X: i; A, G' A2 {. Z4 u) n
  15.     'Age' => 26,
    ) U, W" {$ ?( b5 F; r3 w% }* n
  16.     'Phone' => '110',
    ) @* X+ _7 o" y1 N1 L" d/ \
  17.     'Address' => [' k4 m- C; S: m7 _6 ?+ _
  18.         'Country' => 'China',5 W& V9 l# J$ a) p
  19.         'City' => 'Shen Zhen'6 [7 w% ^* \3 c0 I: I* l
  20.     ],
    4 x5 I4 P; ?, z. D7 h6 ]6 Q/ O
  21.     'E-Mail' => [: _4 v2 c! C- r7 o3 x! u
  22.         '123456@qq.com',
    0 Z. u1 [3 N. _5 A
  23.         '666666@sina.com',
      j/ J- C9 Q' s
  24.         '8888888@qq.com',
    4 O+ K4 L* s8 }  y8 u7 h
  25.         '77887788@qq.com'* k4 S. K* y, e) b. Z
  26.     ]9 S3 F* [: o, x4 ?) K" @1 P
  27. ];
    + f- I  h+ j! h  w' q8 T
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    2 w& i/ G( k: ~4 e8 o5 ^: j- m
  29. echo '<pre>';
    ) h' U$ X# V: K; ^
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne(); P# z" S& z' j
  2. //参数1:搜索条件
    * p$ l) [, ?* O/ V1 w( k
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段1 |" a* p( C4 N" q" R9 W
  4. $mongo = new MongoClient('mongodb://localhost:27017');* v9 O7 w' w  p& I5 S9 T0 T; ^
  5. $db = $mongo->mf;/ J( v" q# d" E8 J; [
  6. $collection = $db->friend;, t+ z9 b, d& L, f; r) j, R0 e
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    9 Z) y. ]6 ^3 ?3 |
  8. echo '<pre>';
    & S( y2 o8 R* y  i
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    0 [5 m& U& u2 r/ x! c
  2. //参数1:搜索条件
      n( L3 @& i1 h1 k
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    % M2 N) o% i9 }' L7 D& k
  4. $mongo = new MongoClient('mongodb://localhost:27017');: D/ D3 V8 k( o( Z
  5. $db = $mongo->mf;
    ! H" \7 d& h/ f% [2 J( v1 o% s0 ?
  6. $collection = $db->friend;
    " }! b4 P9 m) k  O
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素, o3 v9 C4 K2 x$ O2 i1 }$ q
  8. echo '<pre>';
    6 M8 Z4 o# m7 c' |+ v
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档* D3 M+ ^4 X* z, V* t+ |' v9 f
  10.     print_r($doc);" T4 m2 H: A/ r
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询$ F* @' M; F: [! i4 O
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    7 J! B* D/ ^% u7 O8 ]
  3. $db = $mongo->mf;7 q( P; z; E; e2 L# N* T4 U
  4. $collection = $db->friend;
    9 ^; {! N/ K. P- ?
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);6 Z! F& a# Z# H  U
  6. echo '<pre>';! C! w7 h; @4 j2 b4 }+ L1 H0 q8 g7 Z* d
  7. while($doc = $cursor->getNext()) {
      j) n" w4 K5 m3 U
  8.     print_r($doc);1 V) T5 G# G' }2 C1 W
  9. }
复制代码
  //查询某个字段的所有不重复的值7 y: d. J; g! O" X
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    $ I, n# Q0 ^. A3 W/ Q
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    / q8 O) e! R& J+ w

  3. 4 Q+ H' {# @, @5 K1 q, x+ x7 t
  4. //$all:匹配多个值中所有值(用于数组字段查询), c6 a4 ?+ O- M4 J. w# T  Y6 j
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    , y# Z& T: }, S" n* s0 g8 x/ a1 u
  6. 3 h3 w  f5 d3 ^+ G( o
  7. //$or:或查询
    4 Q) }& E6 R( Y: u) v
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    , y: T" e* O* i; g) I
  9. ' k2 |2 R# {; F9 s$ V& Y
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中) N; k- J; e2 ~2 B! X; ^
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    * W3 ?& x: x- ^9 E" L4 z& m
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    ) `. D+ [5 W% R5 S) f, @" G
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个% w; |9 M% l8 C+ p

  14. 8 n# X; I+ G+ m; h- T0 f9 h
  15. //$exists:根据某个字段是否有设置值进行查询
    + M! ?  ~$ k, S4 ?
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档  t: z/ k4 ~2 j& U
  17. 9 l6 u1 {7 K& k" F8 H* V9 |
  18. //正则表达式查询: ]6 f; ^1 S: q( t
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序  _0 f0 U& t, V' T! P
  2. $cursor->sort(['Age' => 1]);. O- Q, y9 V( l$ J3 q

  3. / o( x8 o' J+ o
  4. //忽略前n个匹配的文档* H. A9 s- x0 ]) @& n
  5. $cursor->skip(1);
    % d! A7 ?! j' Q5 f# d

  6. " X' `$ o" @$ J9 R* O; ~/ e. O
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)  p6 E7 S! h; o
  8. $cursor->limit(1);; O  i% Q3 u; i( ~3 S; p: |2 X/ Z0 `6 I1 P

  9. 0 N+ L# f) d6 J( n' u
  10. //匹配文档的总数
    ' |* U& E  t' `# b
  11. $cursor->count();2 J/ ~$ P" y/ Y& G8 I

  12. 1 l( j' A, e, F6 N
  13. //指定查询索引
    ! f; q( f: R- j% a
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计$ b. x* h% N8 {, ^4 c
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ! Y# Y% y7 ^* v
  3. $db = $mongo->mf;6 c6 O" v1 _( H
  4. $collection = $db->friend;- Q3 O0 E/ Y, _2 W# \
  5. $res = $collection->aggregate([
    9 y2 Q7 |7 x" z. i% o, M8 M
  6.     '$group' => [
      |5 x' r0 _- t8 E
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    ( q/ i! t' C/ X. M+ J* Y
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1* n8 }+ o- B7 s) |2 ]* y
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ' z( j3 {. O4 n9 X
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    / ^3 O  r9 W" C% W- z
  11.     ]
    , O. Q# j) k; S5 ^( n4 o
  12. ]);
    3 I) Y/ E: J. c7 ^% |# l
  13. echo '<pre>';/ R) b& B; t$ n# t* Z
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果0 V/ A' f! W% e
  15. 8 O2 t7 K2 R2 b8 t
  16. # ?5 j; W# M4 j2 b) B
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    5 }% o( ~* K" j& w% l6 |: M. N
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    : B" G$ [4 C9 i. W' T
  19. $mongo = new MongoClient('mongodb://localhost:27017');7 R6 ]' e# O1 `: W6 I
  20. $db = $mongo->mf;' I: \( Z3 v! X4 O
  21. $collection = $db->friend;
    7 M3 a* \' F  w6 E, v& C6 B
  22. $res = $collection->aggregate([9 a0 W. R' _' ~' r' b% O6 h
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    4 x1 E; u( b1 V: I5 h5 b
  24.         '$match' => ['Age' => ['$gt' => 30]]
    ; t6 t8 d+ d- x8 U; S
  25.     ],
    . B) k4 \+ t2 z( h4 q# u- R
  26.     [//指定分组字段、统计字段6 g# [( K; e6 X4 j! w$ n
  27.         '$group' => [
    7 V- m2 P6 p8 v, B
  28.             '_id' => '$Address.Country',
    " `1 m4 u, r+ }9 o
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和% X5 X, [) o  O, J) Y1 `
  30.         ]4 D  v3 _' d! S4 \
  31.     ],
    / e! B/ T+ z7 [6 u9 n+ \5 \
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    & G% \  |0 |+ _& n9 \! p) Z
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。; l% \* h( [: m/ }/ r( K
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    * s$ ^8 R) u) e/ n3 \# u
  35.     ['$skip' => 2],//跳过指定数量的文档
    - @! ]: z" M+ _# I, V: p
  36.     ['$limit' => 2],//只返回指定数量的文档( K; M+ u) F0 S* y
  37.     ['$sort' => ['totalAge' => 1]]//排序
    5 @3 x2 n: h$ W& Y
  38. ]);
    3 J6 J# n8 R( [; ?* f& j! q! m! u
  39. echo '<pre>';
    4 f4 {! }: J, l, A( J0 q
  40. print_r($res);
复制代码
0 i7 F$ N0 b5 N8 `
三、数据修改
  1. //update()
    / w5 h# r& i7 `& r( f, @
  2. //参数1:更新条件,指定更新的目标对象。
    & s9 i; z' ?( m7 E0 T+ b
  3. //参数2:指定用于更新匹配记录的对象。
    & `% s) k, I4 Q6 V8 b
  4. //参数3:扩展选项组。
    1 D9 Z" H0 S$ s4 [4 h2 o) S
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 F& H9 _" U3 t2 I0 k9 N0 l
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。9 g2 j4 _7 Y& l: W, e2 ^9 t/ S. c
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    * U- E" J7 `) U% e$ g
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- @6 Q! _( B6 C" m" }9 L1 K" L  H
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。! }. o- n! n. k; L/ i. x6 @
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间8 s+ [/ p5 t) g2 @  Q& Y6 g3 n/ \
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    7 n' l/ @. P& ~4 r+ }
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    ( g4 \- O1 _# D5 c1 m) V. H

  13. ' T7 m) N9 P! n' h/ B$ p. _8 V
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 `0 T7 {. ^8 ?. E1 E) T
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    . o9 l' o$ C$ b- B: m- e/ n" c
  16. $db = $mongo->mf;: N; |6 p% b4 C; B- K) R  y- p6 L
  17. $collection = $db->friend;
    9 H/ A- ?3 a; l) o7 [
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    ; q$ u: d) U* r2 f9 m
  19. echo '<pre>';6 l9 M$ s$ V, T7 J2 t
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    6 W; J) ~5 M2 j: M

  21. / R; m8 g5 j6 V/ L- q! k) |
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    : Q$ n( K8 }% ~# A# G* }) |5 z
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    , V6 [7 M5 H& Y& C" ~: }! m7 K
  24. - M8 p; {; P8 L/ l9 ^2 V
  25. //$unset:删除字段
    7 e7 c  h& t* N
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    $ o. V& e8 ~: i* h. L  [

  27. # Y7 T3 V1 j$ o6 F0 j
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    1 h, R4 k2 {) A7 {* R1 y" [2 }
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    % n/ c$ L  g  |$ \8 g0 U( p/ W
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。6 w5 q/ c" |7 t2 q
  31. 1 {" F* O( B, U% W( x6 ]% ?
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * y0 {  \4 t( g5 j+ e6 C
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    ' C0 M2 f: J5 Y. }6 P) B
  34. . J7 f& G; t0 |' s. G
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    $ f1 p; z% m: |
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);: `% x' P+ R$ d
  37. . X7 `2 t- e( f: `, p1 ^# I
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错" O" y8 _$ A5 k! l. F* m1 w
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# p( O- H) B7 c: b6 w! E

  40. ) e4 }0 g: _3 m
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错( O0 h+ Z& e+ V7 ~, `( V8 f2 K3 z; W
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ( r/ ^' Q+ D7 M, T" ~. z( E

  43. 5 s# {" D9 G9 i3 J( ]+ k, Y' f
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    , S2 r; w5 [$ w& J) B2 i
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);' i7 N+ z1 _& O4 I) o; I) `
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    - V1 l/ e2 a- s/ V3 o$ J4 G
  47. ) @/ I7 H' y5 c8 H( H
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)% ^& i8 i' Z) O' u+ K9 W+ ]
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);, S! _: L0 Q, }: N

  50. ) ]: h; c. D) b5 @# p
  51. //$pull:删除数组中所有指定值' ]) N& ?* a- j4 a$ V  G7 P
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    8 |; X9 Q/ h6 F
  53. 7 s, Y7 U( l" O8 R5 I2 {! L
  54. //$pullAll:删除数组中多个元素的所有值
    $ W; ]/ X  U" a1 j$ I) [+ J
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()$ o6 w) }; l8 i
  2. //参数1:希望保存的信息数组
    6 e- ~' H8 m3 l9 d6 y
  3. //参数2:扩展选项
    8 O5 a" Z& L- |7 N8 i# _+ S
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 m) c% T6 I$ h  T  G: g
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    7 R' J& c/ Q4 b
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 W" |+ Y. z4 W; ]* @) {$ x
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    5 a: o0 |( U& F# d+ y
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)4 ?% M0 f, d9 L9 q
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。2 h! V" j$ [  ?7 I2 a
  10. //若想更新则应该在参数1中指定_id键的值。$ V1 p" C( x6 z2 b3 R6 a7 L
  11. $mongo = new MongoClient('mongodb://localhost:27017');+ r; ]1 ~4 d5 ^- t6 D# t
  12. $db = $mongo->mf;$ V. s* e9 U# n5 d7 Q8 R# u% W
  13. $collection = $db->friend;
      m+ o* T5 S$ F& \1 O
  14. $doc = [//定义一个文档,即一个数组
    ) y+ o$ }3 m3 q5 J/ e
  15.     'First Name' => 'Jet',2 _# ?; }, ?5 X- o$ I& ~9 N. U
  16.     'Last Name' => 'Wu',
    0 A. t. R9 n8 \
  17.     'Age' => 26,7 J$ d' q! Q- ]4 ~3 ~3 X
  18.     'Phone' => '110',
    5 B, z* G6 E8 n3 g
  19.     'Address' => [
    - |5 U( o* g. e  K, o6 q; m
  20.         'Country' => 'China',4 X7 X% P4 l1 z# }( J4 D. A
  21.         'City' => 'Shen Zhen'5 h, A, w) I. g; k2 T
  22.     ],
    5 m+ [( j& Q7 F. L
  23.     'E-Mail' => [
    & V) Z# d3 |: n
  24.         '123456@qq.com'," d  [$ v8 M: S7 V& a- F
  25.         '666666@sina.com',+ U% p: @4 R: Q+ E' F1 x! S" w+ {+ A, y
  26.         '8888888@qq.com',
    4 m. r& ^  g. i; q5 ?- X. F  m: b
  27.         '77887788@qq.com'
    - ^7 w) O: D, T  B  g" y
  28.     ]; r. u7 C; ^; I# M$ O0 \4 g
  29. ];
    # S! U4 }* a" r- q* X
  30. $res = $collection->save($doc);
    " o6 [/ t, Q: q
  31. echo '<pre>';2 e8 `6 {- X8 W. U9 f; ~; w
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入6 a! f' f2 x+ M
  33. / s1 X9 z# P, X8 X  c: C& S
复制代码
  1. //findAndModify()3 k7 E: w& ]4 h% [$ P/ K8 a
  2. //参数1:指定查询条件- L7 m+ j6 k$ k# V7 ?6 l) \
  3. //参数2:指定用于更新文档的信息
    % y0 W0 ?% n- [& G
  4. //参数3:可选,指定希望返回的字段* G2 Y  D( u2 h+ {# Y
  5. //参数4:扩展选项
    $ Y- p% P& X6 B$ T- I
  6. //  sort:以特定顺序对匹配文档进行排序
    % \6 b. i. a" E0 e8 e$ l2 d' f9 x
  7. //  remove:若设置为true,第一个匹配文档将被删除0 J; ~) s/ Q1 n# ~
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    ) q; D) g; }* D0 {2 c! l) z
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    : n" P: h# q  C) F2 U2 E/ x
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档7 c  ^4 I) F. `2 f: b7 P
  11. $mongo = new MongoClient('mongodb://localhost:27017');& u% }0 x6 p2 X* e7 Q8 L; |
  12. $db = $mongo->mf;
    + l) Y: J5 o  }& [2 N8 F, u) P( ]
  13. $collection = $db->friend;) g* p* L/ H( n& t
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    1 z4 J5 T; w3 I! [1 h
  15. echo '<pre>';+ a# i: K' ^" Z% b) D2 Y; ^+ L. ^
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()- `/ S7 [' {+ D2 y8 k' k
  2. //参数1:查询条件
    # \6 v6 a8 {6 a; B/ n$ t
  3. //参数2:扩展选项4 o1 P/ w8 ^6 b% @* Z4 ^/ r
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    9 F6 K1 N3 i; V0 `1 G: Y. Y
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    $ ^) t& l2 L: R1 _$ h3 s4 Q
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作, n6 [0 R: p: @" X9 W2 ]
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。* V2 X' d& k0 i5 ?3 R  a3 @* r
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& j) c. W6 n& j7 k1 A! z0 P% R) A1 k
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    : p- S# s2 }; N& L, x4 h3 i& @
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    $ ]# X8 A& V6 q' _# ~* m
  11. $db = $mongo->mf;  B0 S' y& d+ X: |' O
  12. $collection = $db->friend;
    & f, q$ o1 V: J2 N4 i7 q
  13. $res = $collection->remove(['First Name' => 'jet']);/ {  S* t7 R1 e! D0 K
  14. echo '<pre>';' v5 Y5 I; H! S" J
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
3 c; t! }1 }( ^
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
' e; y# X: f/ N4 H8 f7 I
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
; P0 n3 \8 \( \" y2 K
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    6 X# z. V. y* F, {& N+ c
  2. $bulk = new MongoDB\Driver\BulkWrite;
    + U4 y# p1 r% Y$ b* v
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    " S* a: X& \5 V; K$ m& |
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);; s/ d* y8 k9 R" `0 }* V- f

  5. & G! ]3 F) v( R: X' G$ e; A3 @( X
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ p( i! }. `, C! F" ]* k1 D2 L5 V
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);: [2 [: s( d2 a% N# r! Y& T1 J5 f' ?
  8. echo '<pre>';
    0 H. X3 h# N- V- X" M* h
  9. print_r($res);
复制代码

* Q6 S# \# k1 }5 u! c# u; C/ i) [: H+ ?
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    " l6 d- c' b9 ~1 W3 I
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);' N: {$ X. C/ B3 U2 `
  3. $cursor = $manager->executeQuery('wjt.friend', $query);; V5 A$ i& N; Y: V1 ]2 D2 d4 ~7 j
  4. - y* g" ~, h+ V6 a' c( |
  5. $data = [];
    3 `; J' C& F: D2 o( O0 k
  6. foreach($cursor as $doc) {4 O* \+ J1 q' g4 p/ P2 \* u
  7.     $data[] = $doc;
    ' e" D  S( n" g( ]2 V
  8. }3 o0 y* U% o5 t% q3 m- m
  9. echo '<pre>';
    ; F1 J# e. j% ?4 s
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    / H# M" k) p' t  x
  2. $bulk = new MongoDB\Driver\BulkWrite;! t. e) k/ l! K
  3. $bulk->update(
    - n$ @0 o/ f0 {; v5 T9 }" p
  4.     ['name' => 'JetWu5'],
    0 f8 q4 J: \' C" \: i- i
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    0 X: y* T6 T8 Q, `1 K5 t9 d
  6. );
    / W; p: h* b) S
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    2 C; M8 n2 B6 m0 a8 a2 n& W( n3 n
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 w- H8 w  e% p( _
  9. echo '<pre>';! J$ m7 l# g* g6 U. c
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ! K6 `# e8 ^0 P1 M, {. P6 o$ e
  2. $bulk = new MongoDB\Driver\BulkWrite;9 [. Y' x9 ]* M3 X' T; V5 ]
  3. $bulk->delete(['name' => 'JetWu3']);* J) Y7 F7 y2 ~3 U; X- Y8 U: l
  4. $bulk->delete(['name' => 'JetWu4']);
    & c- U1 ^# Z% I* K% v( e
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 @$ c  X( v$ V. n- e
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# q( Q% z" G, l# Q
  7. echo '<pre>';
    6 g- p: l! ^/ N. T, C: X  \( S6 A
  8. print_r($res);
复制代码

% x) G' `) u3 ^0 N: o- F, i+ L0 A# e, s! o; ]$ H
( H  N9 F( G7 {) l! m- i! a

4 o" ?; h; a  {  x( h
6 O  a, |( d) P& M( y




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2