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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7935|回复: 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()) Q5 T, s8 d4 I5 H9 d5 t0 s: H
  2. //参数1:一个数组或对象
    , |7 @4 _3 L2 [  {
  3. //参数2:扩展选项
    2 {& J) T$ k4 D! o! u" {4 v$ `: M
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    3 b2 N. v" y6 e. o' E; G" v
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志! i1 a0 H4 |9 O2 |4 E& T
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    . i: l  p6 k6 o( g" d0 Z) e
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 ~2 I8 t3 q8 O! T' D; X+ c7 Z
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    4 d) E, I, o1 E/ g' W* J9 s7 R$ |
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    + O  Y+ N" j! K9 {4 D% M
  10. $db = $mongo->mf;//选择数据库
    5 p* I0 ]& y3 O" C* |3 K; c# E
  11. $collection = $db->friend;//选择文档集合
    " F( y' H; m, s: g6 s
  12. $doc = [//定义一个文档,即一个数组) Z( v. A, [- q
  13.     'First Name' => 'Jet',
    0 A3 Z1 D3 G3 c
  14.     'Last Name' => 'Wu',( K1 P, e$ I/ g0 A: t/ s
  15.     'Age' => 26,
    ) `( J/ h* |% e& [& I
  16.     'Phone' => '110',; s: d. @0 _8 h$ u( J8 t% I
  17.     'Address' => [7 H' G: Z- C6 S/ x, k2 J7 y0 s7 O
  18.         'Country' => 'China',- g& R7 E9 Q. \3 B9 x
  19.         'City' => 'Shen Zhen'
    0 L' i" }/ l' i. X7 [: ^6 {# Y  i$ C
  20.     ],
    6 N6 l1 P0 f3 G" T5 z5 `. o& C
  21.     'E-Mail' => [
    / [# H* ]% R7 j' J. F) r- S
  22.         '123456@qq.com',
    6 ^, f3 m7 e% B$ t2 T( u
  23.         '666666@sina.com',
    ! Q# D; A' D9 U* I/ j, K9 o
  24.         '8888888@qq.com',) F$ d1 S7 w  @/ [9 ?4 L/ V
  25.         '77887788@qq.com'
    7 L) w( F2 g; @, n" Y$ B/ n9 v" v
  26.     ]
    + C- `1 V6 r& G- x8 M1 x6 c
  27. ];
    5 k: Z) M, }& C  k
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    9 ^2 p3 Y3 J6 ?! h/ ?. f1 y1 B
  29. echo '<pre>';, B' b8 Y7 V  j, t+ W
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()( \9 L% e3 E! e, @# ^0 ]; Z8 \
  2. //参数1:搜索条件. [  H/ H: b, s- f! f
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段' I  K; K* s* t
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    : {! u7 O$ A, j
  5. $db = $mongo->mf;$ C( q, v' b* S. P, K
  6. $collection = $db->friend;
    ) \) q1 M+ p% C6 A" g2 u
  7. $one = $collection->findOne(['First Name' => 'Jet']);* Z$ K% k$ K8 P& m7 v% z
  8. echo '<pre>';
    - D) B" D7 P% h" x
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()2 Q, {9 w2 L( W8 a5 o7 h
  2. //参数1:搜索条件
    9 y1 N( J- f/ X: O, f. m
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    / u/ i% `. g. a6 ~- ~! b
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ( L/ X7 S5 ]( U0 X% r" n
  5. $db = $mongo->mf;
    ( K- k& c7 k+ Z/ M
  6. $collection = $db->friend;
    $ Q% n  N5 H4 T  C' k
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素% ?2 j8 `6 Q1 O6 Y0 Z/ W
  8. echo '<pre>';
    8 z) u; q$ G% {( p) P8 X
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档) M0 i5 |" n8 E  F5 F% ]
  10.     print_r($doc);
    % |1 ^) S! x5 P" M* N) j
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询+ a  q( m+ M- m% S% `- ]" F
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    8 Z/ R0 M' E' [7 J; p: L
  3. $db = $mongo->mf;
    . H# r6 n& M% L$ v" W
  4. $collection = $db->friend;2 k' f* Q2 j9 V6 f* G) \8 N+ O& f
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);$ |& |. u9 T- F! y" w# k# g+ @7 {
  6. echo '<pre>';
    3 ]% m8 k% [. V- D
  7. while($doc = $cursor->getNext()) {' W' {& o. U* \1 E. O1 I
  8.     print_r($doc);8 ?1 W0 s, K5 t
  9. }
复制代码
  //查询某个字段的所有不重复的值6 [$ t6 O* a7 v# u" p9 u
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    ( y1 W6 V# s; ^6 I2 Q+ a% F
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    : {/ Q1 `1 N& g: {; q

  3. % O% f/ W  t# E$ e6 H
  4. //$all:匹配多个值中所有值(用于数组字段查询)7 N; [- t  k3 D) D
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    4 X  u" t, @  M! |
  6. ' T5 x5 `7 _5 }% t) J: f' k
  7. //$or:或查询
    + b. r. f$ o/ f4 \
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);; [1 l+ p; B6 J4 C7 i

  9. ) f- k0 F+ W5 F3 x
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    ) b" ^/ v* n4 b$ _) v8 }
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    $ s3 m: ]5 ]4 M( A7 I$ r/ D; O
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    8 q. }2 A7 M/ o! N7 f' n9 S
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    ( H+ R2 q  ]5 D4 v/ j) v# F

  14. $ _" z) J0 p6 v
  15. //$exists:根据某个字段是否有设置值进行查询
    # e0 W  K5 O  _, w
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    % h, G. b7 d) B% [" k6 N

  17. 0 a$ U# y9 m5 G* T. H" r8 }" q- Y
  18. //正则表达式查询
    + B3 N; p; x# ~* s/ I
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    / \3 V8 Q+ c6 V; c, O: N
  2. $cursor->sort(['Age' => 1]);3 I+ V8 \$ j, k
  3. # |3 d! q4 G) ]! L# P( k& p) n  ~
  4. //忽略前n个匹配的文档: |& u9 g  G- E) v+ F% p$ W
  5. $cursor->skip(1);* ?. r! I3 v) M5 F

  6. 4 D. t, g% o! Q! K; L, O! J
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    ; n- K/ c; U" Z2 {, |
  8. $cursor->limit(1);% n% |6 c- p1 d' v3 m, Y

  9. , _6 I* w3 q7 u$ b7 }) X( Z
  10. //匹配文档的总数
    ! x; U! n/ K6 ]5 ~( H1 p3 c: a# q' }
  11. $cursor->count();" \) S  ?) \4 U$ i8 H0 I

  12. + P1 [9 ~; l7 {+ P! H9 w
  13. //指定查询索引7 U! {" N7 X8 i; f& _
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计6 o8 j' |6 z- D2 W0 p& n( d
  2. $mongo = new MongoClient('mongodb://localhost:27017');- w# n) G1 o( F  ]! ^  s5 i
  3. $db = $mongo->mf;
    ' t3 i/ G  }+ U- g( A( Y8 b, G7 I# m
  4. $collection = $db->friend;
    / i+ ]; q2 s6 k
  5. $res = $collection->aggregate([
    5 I2 [* _3 j5 u5 Y' Y
  6.     '$group' => [
    ) X" y/ P. E$ n1 h2 ~* T
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组: |3 {- l" n2 g# ]) @+ t8 T  S' J( {
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 z/ U; M+ Y/ f1 a5 [" O  Z
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ! G  H; a( }6 H+ O) k) h
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值) F% D1 M8 ~  R; p: C- C
  11.     ]
    1 }1 Y8 n4 z5 J/ w. Y- K7 n& s& T
  12. ]);) h3 A% ^# P% Y) |7 u- C
  13. echo '<pre>';" K/ ~7 C0 ^. i: |7 \
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    5 W3 j% P4 [' d1 x! E# j1 K

  15. + I: d0 b9 C/ W, d( A8 X9 e
  16. + G' |% {. ~' [% l5 M/ c& k! ~. R
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序0 f3 ?7 S( ~  p
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    ' i5 m) j: G2 R- c6 [0 D
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    ) |0 w! Y- m& ~. g$ k" u
  20. $db = $mongo->mf;) f$ X4 ~2 y# R0 R) Z
  21. $collection = $db->friend;* v# p1 ?+ _% H
  22. $res = $collection->aggregate([
    4 C8 N; ^, R! D5 T! f
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    ' ?8 S& E5 l' ?7 x
  24.         '$match' => ['Age' => ['$gt' => 30]]7 ~( T8 z; w' o+ H
  25.     ],
      I! e; U. C* i
  26.     [//指定分组字段、统计字段: B- D& v- Y* B7 l* \! m1 H8 {. N$ y
  27.         '$group' => [: j+ Q7 @9 L2 c0 M5 b+ Q
  28.             '_id' => '$Address.Country',
      X  k2 T! B7 u. y
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和4 L/ o& M6 p* y- j/ R% d7 ~) E7 X
  30.         ]
    0 L" k/ N( G, ]  u
  31.     ],  N! I( W  E) f& }5 ~, W, A
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
      g2 m9 q( t+ D* M0 d
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    4 h; l8 `3 X  y# F5 d& ~* n
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名2 ~9 K4 ^" y1 {: B3 `; q
  35.     ['$skip' => 2],//跳过指定数量的文档
    ) x! Z$ Z( Y2 I: o
  36.     ['$limit' => 2],//只返回指定数量的文档1 x3 @" L( r4 h# ]' [
  37.     ['$sort' => ['totalAge' => 1]]//排序& L+ [6 {: M/ W! k0 g( v
  38. ]);
    ' k! s- S$ y5 Y: |6 a( k8 P- [
  39. echo '<pre>';  \* h$ P. N* Q5 T
  40. print_r($res);
复制代码

5 U& t5 L9 R4 U, r
三、数据修改
  1. //update()0 D% Q9 ]4 V* n) i6 m5 i/ }6 C
  2. //参数1:更新条件,指定更新的目标对象。: m2 H# w) a5 m3 a
  3. //参数2:指定用于更新匹配记录的对象。; b4 h8 O; M  i! N- G+ g9 g
  4. //参数3:扩展选项组。
    ) U1 h0 q( x# v4 y6 n$ K% B# ]
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    7 G4 r. h& U/ @5 r/ s! X, \4 a8 Z
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。6 E( Q9 A7 `3 h3 ?! r3 Z' Y2 x+ A
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。9 n- v9 h+ ]" |3 P
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    + ?7 I! v* L1 b' k2 {7 A3 `
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    # v3 s0 q* S" |) l8 V
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    6 k6 G9 w  [! M' S
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)1 j( [3 }. C5 V' h
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    % g9 @, {# u1 x1 n* j/ \7 D

  13. + `7 S1 Q. Z0 K1 g7 d7 B
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    3 P: H3 ~* g. q# X* @! Q4 Y* v  p! |
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    5 y: A  s- ?2 ?& ^# E4 I+ a
  16. $db = $mongo->mf;( z) w& v9 N& p) w
  17. $collection = $db->friend;! ]: R4 F/ f3 S5 {6 s
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);+ @# n* g% b2 y
  19. echo '<pre>';
    , s. c- L" I$ i3 T% `
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    - B- h2 ?! h( P

  21. . g( [! |+ \. _; A3 J8 r
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值! I5 b3 k8 [9 y7 r# ~# p2 q
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    / X' v; Y  `. Q6 x

  24. ! q+ q' a( H) h3 w1 ~
  25. //$unset:删除字段3 F% E" ~+ Q# c9 G& @
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    9 n( d, z$ |) p% g% i

  27. + E; }* Z3 r  F, x1 f4 I( F' c
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    ' r# G- m- H# R# P
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    9 T1 V! G: p  I2 U
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    + O% ]1 A: j9 F, @( s6 r

  31. 0 _4 b6 p8 y, H
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的& V# X4 T! B6 D! i, L
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);8 `* w, `% g2 d1 o( K$ n2 v' A7 X( R9 n
  34. ; D  b9 E3 _9 t) j% b4 a
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, x1 Y! @1 I' ~  y
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);( I9 z  [) U: r5 {

  37. 8 e5 V! {( Y& M' h
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ' ~2 f9 w6 [  ?, k
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    0 p  E% x# I$ s, ]

  40. % z  O: U* o/ T( {& K% A, _# A3 {
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    3 t4 ~: C$ U& g% S+ S( ^% B
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    3 Z7 _* Z  e* b' \1 P' i0 R/ n+ t

  43.   f5 a% V$ S7 M
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)1 ]# G5 {" O! }  X5 h
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);' R5 ]' Y: E- }% ^, k* A8 M
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);5 m. t8 o+ U1 F0 Y; [6 a
  47.   s, O, @8 B( M
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)8 @3 N$ _0 y0 g8 b1 b
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    * W, @" y3 H6 Y. }' M
  50. 8 W/ o# Y( b  v: [
  51. //$pull:删除数组中所有指定值; x* V3 A4 T& ~: @! t( D' E+ l) {
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    $ W: _" a* C+ F+ [

  53. & ?+ }8 G. }9 L5 e; V: U2 R. X
  54. //$pullAll:删除数组中多个元素的所有值
    0 c+ g( u/ \/ w1 W# A+ [2 j
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    2 g& D7 n3 M  {  u  r6 l
  2. //参数1:希望保存的信息数组/ x: u5 {+ H* }  j' m& W7 C1 b+ o
  3. //参数2:扩展选项
    - v8 T2 [9 V6 `6 R
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。! Y3 n1 S0 t3 S& X  X! A3 }9 b+ G# a
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作4 C# F4 V6 W3 T0 C
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    * U; p" Q- @0 {: z- t# j
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间8 E: k  l' y) P5 q
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)* C; n$ e+ h3 ]+ I$ ~1 p7 |
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    % {4 I, J5 G2 g# N7 @; ]( |6 O
  10. //若想更新则应该在参数1中指定_id键的值。& I5 f! \) c. L: q6 S4 E
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    0 n" w; s/ D* G) i( T5 V
  12. $db = $mongo->mf;
    . D* P; I3 p* i3 x4 ^4 w7 V/ W, F8 s
  13. $collection = $db->friend;7 ~) n# F& _, Y" O8 w6 @) V) i
  14. $doc = [//定义一个文档,即一个数组- P9 Y6 Z) k4 g7 y" c
  15.     'First Name' => 'Jet',
    6 r& d" w# }1 H6 a. d5 x
  16.     'Last Name' => 'Wu',
    + I' {+ o$ K$ J
  17.     'Age' => 26,
    * W; c7 ~* H2 h) L0 Z, S3 Z
  18.     'Phone' => '110'," y! c. U+ \5 e+ J" S
  19.     'Address' => [2 s, N! B# K, j, p# X; m2 O
  20.         'Country' => 'China',
    ' H& X3 p7 ?2 K3 }
  21.         'City' => 'Shen Zhen'! K' O( D, D5 L* G0 R; Z* n  O
  22.     ],
    1 u& n" Q- U+ K+ w/ t, g. j
  23.     'E-Mail' => [1 l0 W; c& v" _, F8 G6 C; s' s
  24.         '123456@qq.com',1 r; s" P' g: W. M
  25.         '666666@sina.com',
    # g8 r8 x# g  A5 r
  26.         '8888888@qq.com',
    9 H! v+ o) Q% ?3 S9 U' U
  27.         '77887788@qq.com'
    ' ?* W2 w" S% E/ B5 T) s( O
  28.     ]# u: D( Z3 I: O+ L- l; y
  29. ];. k6 c6 @2 M5 ?( i" x3 u6 e
  30. $res = $collection->save($doc);
    $ u/ e+ |& U' O1 H+ T* C. E- [6 P
  31. echo '<pre>';9 |. c! T  A+ w7 Y' a1 A
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入5 G' _3 h9 l( e/ K+ G
  33. 1 K# s1 ~3 J+ @
复制代码
  1. //findAndModify()2 B6 A# V' h' V) X+ d( T% H
  2. //参数1:指定查询条件5 I5 u7 l8 D& E. T  m
  3. //参数2:指定用于更新文档的信息! Y. l- e7 B/ Q8 P, ^0 J) ~
  4. //参数3:可选,指定希望返回的字段% u1 S+ Y4 N2 q( v
  5. //参数4:扩展选项
    ' ^/ ~! b+ ^9 [  G
  6. //  sort:以特定顺序对匹配文档进行排序5 {+ G$ j* O7 a! u* u
  7. //  remove:若设置为true,第一个匹配文档将被删除
    # {" E1 {* h* e2 c0 B; Y3 E
  8. //  update:若设置为true,将在被选择的文档上执行更新操作  x, i6 @" \" ^+ Y
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    & {3 e1 [* o4 N. A- c- P6 x
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档: Z$ e: e" {8 Z5 i% X3 I+ C
  11. $mongo = new MongoClient('mongodb://localhost:27017');' I; [( W% `2 B2 Y' o, n
  12. $db = $mongo->mf;% f% b) @& {( M0 _3 C
  13. $collection = $db->friend;+ |5 c1 P" l" Y8 C
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    # `3 I" H" v- E
  15. echo '<pre>';
    ! S" X+ `( ?( S4 m
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()3 V6 u7 i- |5 W6 K& e( b4 P8 B2 B& N; ^
  2. //参数1:查询条件3 ?7 }& z! X" r' b4 S) P. S# Z  ?
  3. //参数2:扩展选项
      e  o) Z! Z  T4 y' C
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    - B, d" D3 p9 d* Y7 }# u
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, r' `) ~3 `* R- x/ t# m
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作+ W( E$ t# T1 r0 t! u" {
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。0 g+ }! c( V8 M4 N
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    8 `$ U- f% y) t1 d& S
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    4 m, o& F8 N# E0 y0 ~
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    : L( F3 }% ?, c" y0 \8 a
  11. $db = $mongo->mf;* r- [$ Z- Z$ O5 U
  12. $collection = $db->friend;( F3 {/ U# m8 e
  13. $res = $collection->remove(['First Name' => 'jet']);
    ( U$ n2 y# K, r0 q# D; b+ }8 C
  14. echo '<pre>';
    / s9 S* R) Q1 O; H
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
+ V( c* G$ L* p# S
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

; R! {1 L: m4 R3 n, z5 W/ J! f
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
5 Z+ T) {4 x! a# y
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    / p/ D( e- Q* h$ _; _$ j5 ]
  2. $bulk = new MongoDB\Driver\BulkWrite;
    $ R6 H5 C9 k$ O/ x5 u5 \
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    # L( u- q9 u6 f8 x
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);6 [3 c; Z3 s+ o3 f/ h: Z
  5. ' u% X0 t  C% ?, f0 d1 h. \# M. ]
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认" ~6 z, ~! Y$ t2 f- H
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    $ @$ j% g7 f( p# J* U5 Y. Q/ u7 z; O
  8. echo '<pre>';8 ~8 L+ l  F: z0 K, s+ r7 R
  9. print_r($res);
复制代码
& h+ O. [% W! C6 X) R9 Z4 Y
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ; }0 N; t' {, \& Y* G/ W
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    8 V. H" J1 ~  ]
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    ( ]/ Z& T- l+ J$ \
  4. ' L) b7 S1 K2 k3 t% e# I" E
  5. $data = [];: c; z% a5 e0 S$ G2 u% t! X$ U( L& h' @
  6. foreach($cursor as $doc) {$ U0 O6 T+ x/ }7 t; @
  7.     $data[] = $doc;/ g$ x/ @  H3 i
  8. }
    ; ?7 }* ]2 U9 U. ?+ l
  9. echo '<pre>';' t! C% ]# Y; e7 T6 |; G
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');8 @1 L* p" Q4 s5 ^3 ]4 R4 }3 O
  2. $bulk = new MongoDB\Driver\BulkWrite;
    5 G% \% R3 w. W/ ?7 W
  3. $bulk->update(  _2 D" y% W- B
  4.     ['name' => 'JetWu5'],
    6 }, F: {. W4 @5 R
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]6 O# X- S; k2 h! U+ _
  6. );
    7 v- K4 Q' Q& t1 Z
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    # c, M. ^. c) h) P2 K& G' T0 d( R+ m
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);8 h6 B: [2 J' H: R% q, ?% X. E
  9. echo '<pre>';
    , R- d1 p4 c( n9 Z" A
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');& D4 ]' S% X4 I4 }4 v0 a
  2. $bulk = new MongoDB\Driver\BulkWrite;
    2 j! N, k9 f3 o5 S7 C. L+ ]. k5 p
  3. $bulk->delete(['name' => 'JetWu3']);
    + z2 i" [& a; Z
  4. $bulk->delete(['name' => 'JetWu4']);. C4 n9 e6 k- n8 x$ z. w# m! J
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认6 n0 z- p- l: |4 P& Z: V+ F
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);! `9 q+ f1 d" Q8 x. K+ Z
  7. echo '<pre>';8 R0 ^2 A! J) X6 J9 ^3 Y+ f3 T
  8. print_r($res);
复制代码
8 x; @7 _7 U' N# {
  S2 j- L8 v6 t$ O" r9 L

# w2 N# ^1 A5 R2 D3 V9 z

0 k3 z, R/ i, f$ F( A* O, a: {5 a! s  Q5 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-9 11:39 , Processed in 0.126148 second(s), 19 queries .

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