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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14077|回复: 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()
    , p; a3 l& E6 R& D2 d2 ]
  2. //参数1:一个数组或对象
    " `- q& [, v* a3 ?; ?1 b
  3. //参数2:扩展选项. g* @% O2 {* {$ X! S, |
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘: s: R5 v& [4 u, Y
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    8 y8 i4 a0 U4 U' i9 P7 h' `
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认% P9 e4 N% E- y- J
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间0 t  X. y/ W/ o* L% @7 m
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ m2 s! s9 }) ^3 m( S- \1 E1 Q
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    * M/ K! O1 N" Z: c& }
  10. $db = $mongo->mf;//选择数据库
    " D1 w5 N' h$ M: y( d: [1 m
  11. $collection = $db->friend;//选择文档集合1 D+ e/ G& ]" F  \% l8 N
  12. $doc = [//定义一个文档,即一个数组; A7 b3 e& h) x3 U: |+ h
  13.     'First Name' => 'Jet',
    ) t  W; {' n8 `6 z
  14.     'Last Name' => 'Wu',
    - P6 U; C0 I- i1 |
  15.     'Age' => 26,
    " S2 D1 O2 \8 ~0 o9 W
  16.     'Phone' => '110',! X7 I$ j4 J' T- v+ @& i
  17.     'Address' => [
    $ W! @9 s; j( E
  18.         'Country' => 'China',# j3 n2 Y* U% I  i) v$ {( ~
  19.         'City' => 'Shen Zhen'
      t, V8 a6 `; o! ?
  20.     ],
    0 Q' Z% m$ |7 [- F
  21.     'E-Mail' => [
    . Z& U, s2 f3 |5 T5 c
  22.         '123456@qq.com',: Y  N+ k! t$ ]; I* B, h  l
  23.         '666666@sina.com',
    ) ?) E, a3 `+ V% R
  24.         '8888888@qq.com',  C8 X7 F' u+ b# ?& j
  25.         '77887788@qq.com'
    # g- ?# D. |; b, M" F
  26.     ]! J8 L( \" \" H& E
  27. ];. g; d# g+ G- o: S( a
  28. $res = $collection->insert($doc);//向集合中插入一个文档4 B: P; S3 |/ M. Y3 o
  29. echo '<pre>';
    ; G' T+ J0 ^4 D4 k2 M4 |9 _& J5 Y; l
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    , W, K& c. S) A+ J2 g
  2. //参数1:搜索条件
    " C3 ?$ E. x# M+ h5 f! W6 ?/ q
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    ; n  T# o5 M3 [  ^( [  M
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    4 @! Z3 Z! e# r- ]+ K/ {  t; C
  5. $db = $mongo->mf;% C7 g7 n) U0 b3 h2 p; A4 `
  6. $collection = $db->friend;* i) i8 @5 }- }, ~/ `
  7. $one = $collection->findOne(['First Name' => 'Jet']);) S0 j6 D, `" F  L- n* ]
  8. echo '<pre>';
    ! I1 p7 d( k% n. ]
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    1 h/ H5 v& O0 C
  2. //参数1:搜索条件
    ! p4 Q! S1 t% y. G! j4 Y% c; I* S
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段( ^" c) J) R. w* w
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    2 M5 o5 E* w" i( |: t: c
  5. $db = $mongo->mf;
    4 l* l; H6 x9 s+ u( U4 Z9 O
  6. $collection = $db->friend;
    ) P% b+ @& X3 n3 s$ C
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素6 H* d7 j6 L$ Z0 E5 n. y# z
  8. echo '<pre>';0 M/ r2 a5 E+ [; t
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档5 g1 K: R% v- o1 Y# B+ t1 Y1 u
  10.     print_r($doc);
    0 E# h, d4 `1 m
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询! L, J9 W4 {: W0 u" O+ K+ I& \
  2. $mongo = new MongoClient('mongodb://localhost:27017');) E. a7 ^# L- D/ g0 O
  3. $db = $mongo->mf;& v0 K3 k! J1 u3 F3 ^
  4. $collection = $db->friend;
    ) B; W; y9 ^  F  J% ]# R8 I$ P
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);& v# `5 o6 L5 F; w$ i4 Q7 e2 r
  6. echo '<pre>';7 b# n, S# S7 p' f6 b
  7. while($doc = $cursor->getNext()) {( X- t* U6 R/ U4 Q
  8.     print_r($doc);" j. n7 s& _. f# Z+ `
  9. }
复制代码
  //查询某个字段的所有不重复的值/ Q# W" C6 a* ?0 `
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个* o- b3 |9 H% d1 O/ l
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    0 n5 ?1 v; q  ]3 @& P

  3. ! S  V  M5 t4 C! Y2 V8 M
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    8 x2 m% R1 k, Z# X7 ?7 J' D
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    8 x& z; p8 I  [* h: u
  6. ' D. J4 c! U& J" j! Z
  7. //$or:或查询# c* u9 t; J8 g+ n2 Y( N
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    $ {" ?. S1 n" M: h% v7 \
  9. $ k1 ^1 d4 J/ q6 d: w: o
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    . w3 g* Q  y) g6 l% ~
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    1 H7 \* I: g# g4 C
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email6 g" _' m7 U* s: G+ u
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个' s# c  _0 T0 L" c8 Z" k4 j0 x
  14. 3 J3 j  s6 ^; p5 [" d  b5 V4 X8 @
  15. //$exists:根据某个字段是否有设置值进行查询
    & ]4 f9 ~, `+ W
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档, o$ \/ E; m; r, B( ]9 b

  17. : o. I/ S+ ?; i, C" w
  18. //正则表达式查询: v! f7 M0 T2 @
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    + n' f0 e: V( K1 Q) S+ b. ]
  2. $cursor->sort(['Age' => 1]);! i. |. ?+ v' v0 v$ C) ]' S
  3. : d( E0 M& ]+ |5 d2 r
  4. //忽略前n个匹配的文档& n6 H5 t) `" X. [
  5. $cursor->skip(1);
    / j' i0 r1 u1 O2 o
  6. % q; d2 b9 d) t; j/ P1 [
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    4 q9 ]% g7 T1 |9 ]/ ^
  8. $cursor->limit(1);& r% O9 n/ U  {. d3 Y- Z. ]3 Q

  9. 5 C$ Z& j  i  q7 K: }
  10. //匹配文档的总数
    ! o+ \6 I9 d8 ^6 w, J# I: F  v
  11. $cursor->count();5 f/ `* [; S( y' j0 E

  12. 4 F5 o# V9 P7 k
  13. //指定查询索引9 p: h' {& z1 ?! f, d
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计/ F- @" E. U  P0 ^2 Q; i+ M5 m
  2. $mongo = new MongoClient('mongodb://localhost:27017');5 S* K. `5 R# ]2 Y; O
  3. $db = $mongo->mf;1 X3 L8 P) F1 y2 L/ ]: `
  4. $collection = $db->friend;0 e! w  T- M: }: C
  5. $res = $collection->aggregate([' {/ W6 E. r; u: l
  6.     '$group' => [9 T" n( V& R  h+ b1 X
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    0 `% H6 F/ ^# \
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 k, \+ i3 }8 S8 Z( a5 \( |
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值' Z1 k% M6 J6 ]1 Y' ^% L+ c
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    5 w/ J. H- K* N* a) B* z
  11.     ]: a% M; ]+ g/ q- m' u/ N
  12. ]);
    1 h8 n; e: S" w: O
  13. echo '<pre>';
    ! V& m: V9 e; `3 B4 P
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果3 y" w& e2 u9 D' S

  15. . u( C" d( R2 Y5 G
  16.   @7 P3 u  _  l+ z+ F% Y6 \
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    # D! Y% B0 w3 U
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    6 D, I' O6 @' {4 w& \. q: S
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    ( t# J6 z% d- i3 V1 J" G9 @
  20. $db = $mongo->mf;
    3 Z$ e! s7 g' S; ?0 l4 i: l
  21. $collection = $db->friend;
    1 K! W, g$ `  C; A, z: x2 H8 }
  22. $res = $collection->aggregate([9 N' t' w8 |5 M! o
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    / v" A' ?+ K; \
  24.         '$match' => ['Age' => ['$gt' => 30]]
    9 p2 H  c% [% q, m) D( o/ n
  25.     ],6 V' D& X: ?3 t1 i" ?2 x/ E
  26.     [//指定分组字段、统计字段, ]9 a& ]8 F. i3 B% @
  27.         '$group' => [
    9 X8 B* O0 y: F  n* O
  28.             '_id' => '$Address.Country',
    % ?2 B; [4 w1 Q) ~; P1 K+ d6 f/ A
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和8 l, p5 N& ^: {/ R. m! I1 q5 W
  30.         ]
    8 H3 n3 ?3 w( b- I. Z
  31.     ],
    ! T" L# y% U/ _, a# a5 D2 z
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    9 q# V4 Z( ?- C
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    ; K+ B: Y- ^* _; p. |" X' C+ m# a
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    ! k" J- B# ^2 \1 z4 P' \
  35.     ['$skip' => 2],//跳过指定数量的文档
    / {) e/ B- a6 |. C9 J$ ^
  36.     ['$limit' => 2],//只返回指定数量的文档6 G1 }+ C( ~; S1 i  _, O
  37.     ['$sort' => ['totalAge' => 1]]//排序; Z+ U8 h# W( W7 b
  38. ]);# N8 [6 h- E4 f; W) K* X
  39. echo '<pre>';5 r1 l* {4 }; T' W; v6 ^; l) ]
  40. print_r($res);
复制代码
! T  u# L% y8 i6 i
三、数据修改
  1. //update()4 m4 J$ c" T/ x* }% x( O
  2. //参数1:更新条件,指定更新的目标对象。
    8 U' C- K' Z5 }5 K8 b! f  G8 `
  3. //参数2:指定用于更新匹配记录的对象。
    ; {* I: K/ V0 f) [0 B- ?
  4. //参数3:扩展选项组。+ {! O# z7 o. }5 ?: f! x
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 c0 W$ X2 `0 o+ G% d
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    9 T8 U; h( e4 ~. h; n. X' w
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 m+ O: Z/ x5 q( s3 g
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    - _1 S# {  A/ i" }9 C
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    : U0 q& M5 U9 \- R0 k+ j
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间- M. {" }  D4 x; k
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒); y0 P- g% u$ X2 ^$ ^; t/ |
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    2 M" f2 }6 I, l+ y

  13. / i4 ^3 S4 {- v2 S3 ^
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值& L0 t) G* r+ ?: Y, W! ]
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    % z. X6 F$ |/ x2 g
  16. $db = $mongo->mf;
    6 i$ i) X3 \2 |) P
  17. $collection = $db->friend;
    2 p# R% y6 S% f" e8 C
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);8 b4 o6 V' M- b' v+ F8 x
  19. echo '<pre>';
    2 u, \7 r* E0 g) l, L
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量! r+ D1 r6 w! A: N% f* X

  21. 9 N4 h- n! G4 k) _2 k
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值7 S+ S# [. N' |# K& ~
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    % J! h1 B* ]( ^( v% q+ r5 p
  24. " E6 q$ |+ P5 D" e8 |% I
  25. //$unset:删除字段
      q- }! ?" P* C: Z$ _. \
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);! X( N- s6 j& C3 C3 i6 x
  27. 4 I$ I' O/ }* W' `6 l- |3 {4 ?
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    - m- o% b- i- \' I8 Q
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);5 q5 X$ j8 B( ?, a. j0 D
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。. J, J& ]) X5 u: M9 q, |# n, m4 @
  31. ! t! \/ ^0 h2 C- z. Z
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    6 x3 z4 r% F7 a" l" y& }* c
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);# c9 d+ Y; V" o3 t. D1 J

  34. 3 n0 t7 S/ J' J6 E
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    & o# I: g# w1 M: h3 \
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    1 U& |4 w+ r4 Y+ D* K
  37. & B* B8 L5 ^" ^& c5 t
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错$ Q. B$ E. |( g! z3 ^
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    3 G( Q$ w; Y$ l' B6 e% V
  40. 0 B4 Z2 O  ^* S6 B( y/ o
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ! m$ m9 B7 v" ~* w: P2 h& {
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    * P2 k" ]+ M  Y, f" T+ v7 X

  43. 2 V* L  B$ V2 E) x5 U
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    7 W/ f2 |6 Y+ M% e5 D- J
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);5 ?$ U9 F' ^4 {
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
      W* \5 Y7 ]6 F( v
  47. 4 B9 p" a+ U  D! `
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    1 F- _. W2 N0 N' b, d
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);. I+ K' h, t1 q& ^7 F( H0 E
  50. . o7 [& w/ _" W& q5 L6 L
  51. //$pull:删除数组中所有指定值
    . u! q* i6 P0 ?, Q, [
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);5 Q  l" i6 T9 x

  53. 0 o8 b" \7 D8 i) s
  54. //$pullAll:删除数组中多个元素的所有值1 L; W2 `$ m& n- z0 I
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()9 U$ J7 T3 s; G' r5 ^0 t
  2. //参数1:希望保存的信息数组/ q+ p* q+ H( c7 z' `
  3. //参数2:扩展选项( k9 w% C6 Z' `7 Y% d4 O
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    0 f2 e& R) m2 m& x$ b
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ' j# A% d; ?2 b4 R
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    & `8 Q: N& a! [8 I- Z+ @8 W
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    + m# s- Q/ r' e8 K) U
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    - J9 B& t! u( q  G& t/ \
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。! I( Q* [5 b' F6 o) Q2 g- x4 _  c
  10. //若想更新则应该在参数1中指定_id键的值。$ D0 R- G; i5 f
  11. $mongo = new MongoClient('mongodb://localhost:27017');( T( l. c9 e9 a6 E0 [5 L6 @
  12. $db = $mongo->mf;
    * U% o  @' H0 u9 U) d
  13. $collection = $db->friend;1 U; \9 v) |! D( z, J" B0 N
  14. $doc = [//定义一个文档,即一个数组
    / M2 h2 L- N2 V1 w* a6 s' n. O
  15.     'First Name' => 'Jet',9 q% u& o# F" f" k! ~: H4 o' Q: X
  16.     'Last Name' => 'Wu',% \: [: T  t; S  f- p
  17.     'Age' => 26,
    / E2 B( z, \+ |( ^& [
  18.     'Phone' => '110',
    ! L8 V! n* }4 n4 m" g3 _
  19.     'Address' => [
    1 Z" ?7 x3 h5 d; ?2 N) ^
  20.         'Country' => 'China',( g: l& |0 ^+ U- D
  21.         'City' => 'Shen Zhen'  c- _6 `9 b- S) e- v
  22.     ],
    / q6 \- n) F4 H4 j5 R' p
  23.     'E-Mail' => [
    ( [7 j2 l. U3 u6 P7 L
  24.         '123456@qq.com'," |+ a! F6 ]) y( Y! J6 W0 v
  25.         '666666@sina.com',& K! b4 c' x$ D4 s/ h
  26.         '8888888@qq.com',
    4 T6 a8 Q6 R) w1 D( h- j  M
  27.         '77887788@qq.com'
    1 J6 M. ^  M8 t, Q( b
  28.     ]8 f, }! E- z% m1 L! }( Q. n
  29. ];
    6 Z" b2 F! N8 ?$ {& i$ j% v4 A
  30. $res = $collection->save($doc);
    # F- K6 Z, ?/ }) k% j
  31. echo '<pre>';4 v" T% r8 X% A. X
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    , U+ L7 \; I: \0 p

  33. 4 o0 y1 @  {& h7 `9 N
复制代码
  1. //findAndModify()5 @, o4 e3 i  `) J
  2. //参数1:指定查询条件
    7 K# Z/ z9 q) O/ }+ K7 T
  3. //参数2:指定用于更新文档的信息' j6 E- l8 \* C
  4. //参数3:可选,指定希望返回的字段
    9 c. b+ v1 s" a( ~: n% X! w: j
  5. //参数4:扩展选项* z/ p& H1 F" Y& k
  6. //  sort:以特定顺序对匹配文档进行排序+ E" ~- q, W4 y) {! t3 i
  7. //  remove:若设置为true,第一个匹配文档将被删除
    $ g8 m2 U) U8 i3 P9 w9 K
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    $ X# }" t' K1 y
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档' J( J7 f9 o, o. I
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    : L+ Y0 t$ y- l8 g- Z; |* Q$ M
  11. $mongo = new MongoClient('mongodb://localhost:27017');; G- f3 k) c4 \. E
  12. $db = $mongo->mf;% ?5 z7 a6 f9 E( h, j! i
  13. $collection = $db->friend;
    0 G) o3 o; y- l) V6 g8 @
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    % m1 d# I8 @* ~% e; L, Z- {
  15. echo '<pre>';! l8 Y2 e. q/ G% Q
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()$ ^" y! T# V1 n3 X3 ~
  2. //参数1:查询条件
    9 p+ c3 `% s  w9 v& W' l' n
  3. //参数2:扩展选项
    " h! {/ ]6 N* g
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除" W% n* d& C0 n) }4 Z4 u
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 l. t  a4 m  X3 D8 j
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    6 u" w& _. }$ a. ]6 U& t
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    % M' v; O# _# x+ Q, U
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间( |0 r3 x9 t( p/ o) Y  Z* M
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& L5 p+ W$ K( k/ b7 |' v% Q
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    ; \2 J( g+ h: G9 U
  11. $db = $mongo->mf;/ M( g- R' a. W, H# h% [/ x6 \4 B' {
  12. $collection = $db->friend;
    , o5 R3 A0 Z; U5 ~
  13. $res = $collection->remove(['First Name' => 'jet']);0 X$ u& S( B0 h  s6 v
  14. echo '<pre>';$ K' c" L- L/ j
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
0 t* E4 l% K# y; @
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

! z8 U, Y7 ?7 z3 K0 r
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
6 K) l( ~3 t2 t$ L/ ~* t
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 e( T  M9 L8 a/ V. ~
  2. $bulk = new MongoDB\Driver\BulkWrite;1 H  v/ P! c% X  Z, Q$ W9 i
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);. s& q! T, T+ a' J. u; n
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);# z7 B$ s2 F  m  ]
  5. 6 f1 l1 M- \6 w, S4 a: Y, m: R. _
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认- K$ P+ y* i$ d  O/ n1 K5 {
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 a1 L7 i/ S" e
  8. echo '<pre>';
    ( @- q+ E2 p, L+ J0 B) j& o
  9. print_r($res);
复制代码

. r; ]2 `$ }% o3 [
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ' f2 }% D2 r, a- c' M/ M+ Z: f0 G4 W* T
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);  Z$ S  \2 k5 j/ _( a) M
  3. $cursor = $manager->executeQuery('wjt.friend', $query);4 l. U- m7 O+ h% j  j! d, y' }$ m

  4. 8 B. [( o/ b$ U( i. ?  ^& {
  5. $data = [];# g" Z8 R% l4 T6 F' O6 E
  6. foreach($cursor as $doc) {# Y" x7 S8 t) s1 W
  7.     $data[] = $doc;! M% }* n5 I5 P4 _  }0 o# V* |# `
  8. }; O8 P, p! _4 G2 @# z
  9. echo '<pre>';
    4 }0 v4 \+ H% M" U  E+ T7 R. Y
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    , T+ t4 Y3 [2 E( y5 H
  2. $bulk = new MongoDB\Driver\BulkWrite;
    5 E& J/ l- W  E8 `6 f0 h
  3. $bulk->update(
    & f2 ]* f& N/ v9 \
  4.     ['name' => 'JetWu5'],! ]5 R2 G9 z! x7 d$ o
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    ; I2 |5 l# S6 y6 z" @
  6. );
    1 p8 P8 T+ f  Q8 f" j7 k
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ F$ c# f# w# Q: P3 }2 {2 A' F3 k
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. `5 ~  Q% u0 K" q
  9. echo '<pre>';
    & m2 J/ B2 D9 i& H
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    3 z9 S0 N* I! V5 ^! a4 d* l
  2. $bulk = new MongoDB\Driver\BulkWrite;7 P2 }' C8 l3 v& l* o7 _: e, S% m
  3. $bulk->delete(['name' => 'JetWu3']);( D) `; V( y8 ~
  4. $bulk->delete(['name' => 'JetWu4']);9 x% ]- e* h2 U; D; W8 D( {" C8 P8 a  ]/ c
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    9 [/ e" ]) _' h/ e* Q4 ^( i+ u
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; F! z- G1 ~) }! T
  7. echo '<pre>';# W/ E" N) X1 k6 d" l* U1 X4 B. W! D
  8. print_r($res);
复制代码
# g5 f. _; b' T; `% G7 K, f- N

; \3 `# G+ n8 o/ ^9 U- k% @$ G2 E1 q. h: p5 v% v7 t6 Q

5 \* U; R& `5 q# ~# \' B7 e# V2 Z. J: ?) q6 F$ z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:13 , Processed in 0.051579 second(s), 20 queries .

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