您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8084|回复: 0
打印 上一主题 下一主题

[php学习资料] PHP操作MongoDB(增删改查)php7.0以下

[复制链接]
跳转到指定楼层
楼主
发表于 2019-3-5 13:50:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。
一、数据插入
  1. //insert()
    - j( G; _- Q* r6 M2 m# @9 V
  2. //参数1:一个数组或对象
    6 k+ J% C: j, P
  3. //参数2:扩展选项3 m2 R8 `1 }% C$ F* Z
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    " j9 Y- @) }7 R' A8 H, `0 e- \9 f; @
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志+ D8 e8 g1 d& S3 [
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认. m3 ]. T7 f# }$ h' K
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ F; G7 s2 O  M. k
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ( R  r' z! `; d3 ^
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    / r/ K) _0 _1 u
  10. $db = $mongo->mf;//选择数据库
    ( w+ J3 Q9 m: S2 C: [
  11. $collection = $db->friend;//选择文档集合0 j' m8 R0 Q% L; Y2 C
  12. $doc = [//定义一个文档,即一个数组
    4 z- P8 }" d; ~; v
  13.     'First Name' => 'Jet',1 ]3 I; Q! e4 R* k$ e
  14.     'Last Name' => 'Wu',
    ( E5 _; ?- a" H" `) s0 e
  15.     'Age' => 26,0 h$ P8 M* U; k& p* n) t, v
  16.     'Phone' => '110',4 U* p# a6 G% C" I/ U: z0 P7 M0 g
  17.     'Address' => [6 @, Y& g5 D; M  V5 L1 H* @
  18.         'Country' => 'China',
    : W1 t0 h( [+ m" x
  19.         'City' => 'Shen Zhen'7 c* F% Z$ l9 ^# {$ I' Q
  20.     ],7 V; C+ E1 Y: L7 {( [- H8 y4 |& [
  21.     'E-Mail' => [
    3 m; `. ^: K& h+ |
  22.         '123456@qq.com',
    * S8 `$ m2 N) x
  23.         '666666@sina.com',: R1 T' g# Y/ @4 ]' }- p
  24.         '8888888@qq.com',
    5 N) L7 J$ Q  I0 h* X4 |
  25.         '77887788@qq.com'( y! N  U" e& T- w, b% W2 h9 d0 X7 S
  26.     ]
    5 `3 X( }. I* z/ b- B" }
  27. ];7 o3 R8 \) b; V3 k( D( x& L
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    8 N% r) X& p% \7 T3 l( @
  29. echo '<pre>';
    % _0 ^9 z4 F6 p$ J6 H
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    8 j$ ]5 j, K4 E0 ~1 Z7 Z
  2. //参数1:搜索条件" A  `  D; t5 B6 u; V7 i
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段! X; L8 t$ Q% R7 Z7 D
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    5 Q, n  H3 z8 C- A8 N
  5. $db = $mongo->mf;
    ; G6 z3 \- x% W% @4 k- Q0 u2 G
  6. $collection = $db->friend;; y3 e# t9 g3 R3 j/ y7 b: `3 }
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    : g/ Z+ [" C/ z% H8 B  Q" G( ]* V
  8. echo '<pre>';# w. `/ @$ A+ g* M7 a, k
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()+ p7 A( v! ^7 B5 h
  2. //参数1:搜索条件& V9 q* [7 T$ e+ R' f+ ^2 G* A
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    ) l5 V: H. m3 M8 V$ d; O: j
  4. $mongo = new MongoClient('mongodb://localhost:27017');) R9 k$ M$ T2 W5 Y4 U0 w4 e
  5. $db = $mongo->mf;
    + f( h3 U9 G9 E/ v
  6. $collection = $db->friend;5 G% v/ }4 h% Z$ x9 a4 m
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素9 \0 j7 D; D5 y- k  @, Q! i* B
  8. echo '<pre>';
    , J7 ]; \$ @* g* F8 e
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    ) I' |* b8 ~9 E9 ^" Q$ ^
  10.     print_r($doc);* I# G2 l! e0 D/ A# L
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询) y( q9 h" l( e) ~) E2 T8 T
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    " M% d3 r' n: C* V% c$ D
  3. $db = $mongo->mf;$ a7 ~3 x6 {7 P8 K8 c
  4. $collection = $db->friend;' P' m/ G+ b. _5 O1 d
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    : F. p2 l1 Z5 ]7 ^* t! L, J
  6. echo '<pre>';
    0 ~% a8 e7 y6 ~, p4 n* P
  7. while($doc = $cursor->getNext()) {7 S( Q7 d# }% Q. ^$ ~
  8.     print_r($doc);  u  }) A. u% c7 l
  9. }
复制代码
  //查询某个字段的所有不重复的值
8 H1 Q  e; F  u+ U# U$ W3 r+ ~  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    , ?- @/ [1 L( g$ \1 O9 I
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    5 d" a) h# A0 @" i
  3. ( u3 o  r) X: K# v  q
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    8 V  C: F. y; P, k' G3 S2 `
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    0 o! e$ G/ W5 }$ n+ A  }

  6. # L; F- ~) }, h# F* P
  7. //$or:或查询
    . B$ f" h3 D2 ?0 f7 g) O- d- U
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    8 ?+ b1 r/ V& [* S8 `/ n
  9. . n- p  |( A+ }9 z
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    " j; z9 H- q) O4 ~
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email8 Y  s0 J' H" g% T, l) i- z
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    3 _3 ^% k5 v2 u* V
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个4 O( g- L5 H* o0 V

  14. ( b& g2 ?6 E7 T3 U# G- L% ~$ T* \
  15. //$exists:根据某个字段是否有设置值进行查询
    ; G5 N2 Z3 |4 j3 v6 p2 ?
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档1 ]2 y, k2 N3 i; F* V. D% a- p" A9 _2 g1 [
  17. - c4 R9 f6 w! q8 @" Y6 G, E
  18. //正则表达式查询$ Y+ H- Y& s% U( p7 I, D2 a
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    " \  z+ r+ O; [4 m3 X& m$ v
  2. $cursor->sort(['Age' => 1]);
    1 b% m. d" C8 \( s) A. X. b

  3. 0 C8 S  Z. ^1 M
  4. //忽略前n个匹配的文档
    $ k! K: M. a; \2 O) b! S
  5. $cursor->skip(1);
    7 S  ]8 i& u* M% }* M

  6. 4 i$ t1 ^$ B* Q6 F6 S
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    1 T  E5 Q, r- [. |% T% J5 [
  8. $cursor->limit(1);0 p: W6 Y: s4 O. P

  9. 0 U+ c% V. k# E$ H* U
  10. //匹配文档的总数$ e- m  s4 d9 g+ f( X
  11. $cursor->count();
    ' c  e* _. {3 d* R- f7 V
  12. - m% m# x/ x9 b$ p$ G! U
  13. //指定查询索引% C3 ^, w6 _) H. W5 \& d6 `5 r* m; {0 z
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计0 I0 T6 R# A! T; T- {. s6 O
  2. $mongo = new MongoClient('mongodb://localhost:27017');+ O( }0 x5 U4 m" }# d6 }2 r! p
  3. $db = $mongo->mf;2 e; k) F% K1 v  K
  4. $collection = $db->friend;4 w# Y" P7 ]7 L+ z3 _/ w/ J
  5. $res = $collection->aggregate([. `; D/ v, }" u- d- O
  6.     '$group' => [6 ?9 x5 ?) G6 n) `/ |0 q
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    - k. b! s4 A; X& n: {3 D- \
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    4 j7 s  {5 t; B/ }" K8 b
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    * |4 ?% m9 p. O% k, M7 ~5 O
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值% E) B$ @* C* V  Q8 A
  11.     ]
    * B1 f  C1 s- o' j! Y" @0 r
  12. ]);" P0 j( R+ D. S
  13. echo '<pre>';; H0 n/ z  m( H7 j/ \% ?
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
      n- M+ y7 I" F

  15. , n& \; b1 h3 Y

  16. 2 M. [% U6 G1 Q: h
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序3 F7 [# @9 U# X; `3 q: b/ ?& v
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。$ h5 P, l0 u( K
  19. $mongo = new MongoClient('mongodb://localhost:27017');; N6 s% p# U' g0 s0 p8 o, J. m  W/ u5 k
  20. $db = $mongo->mf;
    7 U) r8 F$ A/ e2 D
  21. $collection = $db->friend;1 o" P2 l! M. L; R" H& w
  22. $res = $collection->aggregate([
    8 V1 y, V* I) Z6 O$ H/ X
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    ( X; ~2 T5 `+ z- p; m
  24.         '$match' => ['Age' => ['$gt' => 30]]) u! ?( I- W7 q8 B& C! u
  25.     ],6 v! q( b  B# Z9 }8 Y
  26.     [//指定分组字段、统计字段
    + Y5 Z$ v! F7 r) K/ t3 i) f$ e
  27.         '$group' => [
      [( E: u: `, p$ P, N
  28.             '_id' => '$Address.Country',8 b* j* J$ K8 J4 f9 G
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    1 \5 g' Q/ _4 X, v( l) U( Z
  30.         ]4 s0 J! p$ |# G3 {  P
  31.     ],, d$ q' K9 {/ f+ |4 C
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    ' P5 w9 B/ d# M' _) k' e
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    3 O5 v" U( f0 P# o, H+ h* j
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    9 H# }/ `, B, v) i
  35.     ['$skip' => 2],//跳过指定数量的文档
    ' O# ?7 I' j, R& _  \, q
  36.     ['$limit' => 2],//只返回指定数量的文档, f# T4 g, G0 A5 e* D- e( r
  37.     ['$sort' => ['totalAge' => 1]]//排序5 }& x6 E4 K4 r1 u! e( N$ N
  38. ]);
    + ?' \/ C7 X, }7 V2 D
  39. echo '<pre>';
    % S5 G6 O" ~8 M2 S/ s" U8 }' |
  40. print_r($res);
复制代码
, X2 k, P  d2 F2 Z, z
三、数据修改
  1. //update()* \) Q* z1 f6 k+ `) w0 a) R9 n
  2. //参数1:更新条件,指定更新的目标对象。
    $ I9 v' v2 Z+ c4 Y. f: t% ?: a8 w
  3. //参数2:指定用于更新匹配记录的对象。! m( O2 I/ @' P2 J- L% o5 _
  4. //参数3:扩展选项组。
    - k& l& W# E. U" z6 z% o! y7 m
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。7 l* n& v( h1 [% }7 |5 M+ n
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。6 }6 z4 y- G8 V' l2 l9 i3 D
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    # `' M" w9 W; [9 ^
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    . |6 Y! e1 L1 E7 }* W
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    0 s2 f+ U6 s' m$ Y4 I
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    + Z! K0 V  ]: f" b  ^' m4 c+ r
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    : B/ W, J5 ]2 v7 X
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。5 f0 M1 B. k$ U6 |' G+ Z

  13. 5 W  @# J* I' m& I3 O$ z/ i
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值" ~" c1 |- g8 n$ h" P, s. d: `
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    2 ]6 X+ M1 l; ^* I2 g( S0 l0 ?, f
  16. $db = $mongo->mf;
    % c/ T" F. v; Q$ K( z
  17. $collection = $db->friend;
    # Q* p% x% d! Q' Q% S" J
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    3 g; _9 e* t  m% @
  19. echo '<pre>';
    ( Y( v9 ?2 P7 a" G0 F6 G
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    ( F8 U: |; {+ X) q) P
  21. 4 d! F/ X  h) [9 A8 T8 o3 X
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值& Q' ?; L$ @8 o. x) D0 }- t0 b# p
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);8 ^% d0 v' [3 \1 W& N% c: D

  24. # b' [0 F8 ]3 H: v7 ~4 }
  25. //$unset:删除字段
    $ w# M7 s( a; a8 [+ c
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    6 A7 `4 W. [  @% I
  27. % a- Q) W1 {. a+ _
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    1 u. W  A- T5 r! i1 ~+ f1 [/ E
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    : \+ t  }& x# e! ~" ~# W. M
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。; |1 w+ `! A( ~

  31. , P, k9 U: ^2 Q
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的0 I1 s- R$ g. ?4 f
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    $ e0 j& y: D1 s, g

  34. 8 _) D0 c4 y! y8 q( s) Q% z" {
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    4 Y& J' ~/ o. A$ X7 l+ |
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    3 E9 C! n8 C2 F: J- l

  37. 6 Y! T! Z. r& X4 n2 C6 Q6 K$ B) u
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    . q; v8 w8 Q: v0 r, ?% T
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    ) n. {* y2 e! C- n- e3 P

  40. ; I* k7 ]- J8 b5 N$ h& H
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: r, P* K6 u% g; N' e- ^8 N9 X* \
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: Z) K4 g; H: t% [; g2 C

  43. ' R+ }' o3 ?; l" V7 c5 E
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中), ]& z- Y7 R8 A4 h, B
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);& T# i5 ]+ @9 }& d8 y. g+ R* q0 q
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    * G0 i/ v0 |4 l0 `

  47. 5 x$ O: s3 c/ J# F" Z0 q: j5 z
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    , d1 w6 w( K* T& S
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ U2 k. ^4 J- P: \& R0 |

  50. ) X/ o+ H; y. U( r2 @& h7 U' Z
  51. //$pull:删除数组中所有指定值; ~, |( q( x3 p- Z* {/ p
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);8 F& F: l( u, z1 U7 p4 U6 q

  53. . b9 L4 a, j( L1 z7 p" v
  54. //$pullAll:删除数组中多个元素的所有值
    ) W/ j  ?* H! u' f  ?9 _! K* k
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()8 i9 _3 u! P. `: S
  2. //参数1:希望保存的信息数组
    5 U( n% f9 I, ~& v. f
  3. //参数2:扩展选项
    : ?# z% ^) y# N6 r1 q( Z- {$ x. ]  m
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    * |2 i4 a* ^& `
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
      F' v. ?$ r' T
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    3 e/ B* t, q) [9 I: \
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # v4 L5 u) |  j7 D7 Y" |. j) h, j* ^
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    8 v6 o' I7 J+ w
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    1 t' A: j5 t: S  i* }, {" ]- G
  10. //若想更新则应该在参数1中指定_id键的值。. W; o% U* O5 Q& g( x3 z. Q7 S
  11. $mongo = new MongoClient('mongodb://localhost:27017');7 U4 s9 ]  u( f/ J2 S; q) f
  12. $db = $mongo->mf;& c1 H3 v2 D' k- Q
  13. $collection = $db->friend;& G2 S, K! H! G: ^
  14. $doc = [//定义一个文档,即一个数组, ?5 z2 f% t6 i
  15.     'First Name' => 'Jet',
    % k. [$ o" W; o
  16.     'Last Name' => 'Wu',: Z8 l: m8 ?) I7 |6 _
  17.     'Age' => 26,/ [* H& ]) s5 A- r
  18.     'Phone' => '110',9 d7 e7 o) g* V0 D9 {
  19.     'Address' => [
    ) M; \; y) W3 V3 X. k
  20.         'Country' => 'China',
    ; q( c+ A" _3 ]3 G' a
  21.         'City' => 'Shen Zhen'# u+ R: y9 O5 m, g
  22.     ],1 o  y/ Y/ G5 o( ^+ o( R
  23.     'E-Mail' => [& |' K; k! Z; B0 z+ w3 q
  24.         '123456@qq.com',) ?4 B1 s( K5 u6 E5 m% O3 c
  25.         '666666@sina.com',
    # j8 ~7 T: H4 p) W$ S) x
  26.         '8888888@qq.com',0 q  G( j$ e- v  @
  27.         '77887788@qq.com'. C* u& t- W3 K! t+ n
  28.     ]
    + o% k) K% f& H& i9 s3 F2 }
  29. ];
    5 n  \' r* P1 F1 H
  30. $res = $collection->save($doc);8 n- y, ^" Q9 ]0 m- q2 D
  31. echo '<pre>';3 U( ^8 a. p+ I$ q+ d5 k; o
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入. n/ c2 C6 d3 B" i. [8 r

  33. 4 ~$ C: E# _" B% e2 a
复制代码
  1. //findAndModify()
    ! F7 G7 a: J* m! s
  2. //参数1:指定查询条件7 g' ^' z: k- Q# \, T' d' w
  3. //参数2:指定用于更新文档的信息
    / N" G; A2 _( h. M
  4. //参数3:可选,指定希望返回的字段  `$ Z+ v! p/ }; z
  5. //参数4:扩展选项; a4 ^; ^, N7 [! m( H' h& ?7 c
  6. //  sort:以特定顺序对匹配文档进行排序: v# o$ z% ]9 O: R# o
  7. //  remove:若设置为true,第一个匹配文档将被删除
    , r) O# E+ c7 F  Q
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    3 F- g5 I0 V+ y; y
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档: z# ~( F8 A9 R) ]+ j" k  J
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档0 e- q; `* k% D2 X  o8 T/ x  f5 b
  11. $mongo = new MongoClient('mongodb://localhost:27017');5 N/ D! [3 ~* Y2 Q8 g& a0 [
  12. $db = $mongo->mf;
    8 \" z7 |2 a5 K
  13. $collection = $db->friend;
    $ R$ g/ B0 E# A4 P8 L# Q. `
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);0 K* D& I. g2 ]' r
  15. echo '<pre>';! I' h7 d3 [- w$ v. p
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()6 ?% v3 a* M4 W8 U% A- b  R
  2. //参数1:查询条件
    3 ^4 u( b2 |2 W8 V9 X' I3 z* U
  3. //参数2:扩展选项
    , J) d# G$ H. r& e" G
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    & V' s) v; x, ^  @
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, N0 F; @/ m- l) o! Y2 M8 _9 Z  L. P
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    , \1 c2 a' @, K7 m& c; y
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ! d. P3 @  H2 o0 y. n
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间$ K2 C( o$ B; Z" w2 }
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ) v4 s% P7 ^0 \
  10. $mongo = new MongoClient('mongodb://localhost:27017');1 f) A8 @0 A8 J  \# E
  11. $db = $mongo->mf;& M: B) H- u/ y: U$ U
  12. $collection = $db->friend;
    4 l2 K/ q% n- `; w& [7 G6 U- ~
  13. $res = $collection->remove(['First Name' => 'jet']);
    . i. m$ V' z' v5 x+ L! Z) ?3 r/ d
  14. echo '<pre>';" j( e! i( t% ]9 \7 u
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
! \; w- Y. z; s/ t& J( t- K
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

5 n% @# T% y' J. v6 D) [
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
% N& ]6 o0 c0 g9 L
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; C; R! c8 P$ s
  2. $bulk = new MongoDB\Driver\BulkWrite;# Y& X2 E3 a% b4 q
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);3 A8 m* }3 d9 q" S# x$ k
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    # F9 q! B; r6 X$ |7 i5 y
  5. 5 p& A/ Z9 }; y) V4 Q; }2 @1 p9 ]
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 V: `( O6 ]7 f: b  L7 |# m
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    0 G- k2 `& H/ W5 R9 q
  8. echo '<pre>';
    9 Y9 T  l- f: }0 U
  9. print_r($res);
复制代码
* A  o+ i2 ?0 a1 [
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');' Z. w" s5 w- C3 X* H
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    & q* W" Y" X% z* f- Q; W
  3. $cursor = $manager->executeQuery('wjt.friend', $query);. D0 U+ u1 N! F. @
  4. / [$ _$ d( C2 u" h: m
  5. $data = [];
    " M( N% v( W- [8 g4 D
  6. foreach($cursor as $doc) {* o* Q  m6 }+ {7 m, U0 K9 C
  7.     $data[] = $doc;
    - @0 m+ T! q& T# T
  8. }+ ?/ m' x" q7 r5 N! J6 }
  9. echo '<pre>';3 c$ v, ?  Q7 H- L
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( n6 F. k8 ^9 c# |6 m
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ) z% I( Q$ w. f* R. a/ |3 ]
  3. $bulk->update(4 F6 m: {' Y& _3 G" u) [( n- Q
  4.     ['name' => 'JetWu5'],
    4 I; l* d5 ^" u
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]9 z" V+ K" [  u+ D. i$ [  p2 N
  6. );( M4 D; C) G+ d/ `$ g5 h# \% g& ]6 I
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    6 ~% U+ }2 t+ I/ \2 f: ?6 ^. m& v
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ! N' E6 a6 u; G
  9. echo '<pre>';
    $ {& b3 }" y% e
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! v/ C% ?' e  ~9 K  q
  2. $bulk = new MongoDB\Driver\BulkWrite;
    1 [  c$ M& m2 @0 s# t
  3. $bulk->delete(['name' => 'JetWu3']);: Q: ~0 V1 e% Z0 N
  4. $bulk->delete(['name' => 'JetWu4']);# A$ N" j5 a- }' E' {& |: E
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 g# J+ ~: u' l9 r+ z4 b! Y& }
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);5 M+ n5 n" E! s' f8 _; q
  7. echo '<pre>';# S6 c# @9 r' m" S% b) n
  8. print_r($res);
复制代码

/ d" K2 [8 g- I$ B) i7 N8 S
. ]$ ^, A4 c3 i' Q$ r5 l
/ N7 q) H1 k5 y& Y

+ u2 j% q! y4 F0 {7 N) {/ x; h- b; }, C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 11:43 , Processed in 0.149976 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!