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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13551|回复: 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()
    5 Y' J, k* T+ A. M' Z( o$ ~) K
  2. //参数1:一个数组或对象  K( _' L% l) v* E) I5 u
  3. //参数2:扩展选项
    3 C: z  q, Z  Y; ~
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    ! Y2 V* u3 r4 _+ s6 W, B- s& a5 |. ~
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    2 D/ G  ^) w, N) {0 I) E
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    * r$ ~: Q2 T7 h' o
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    6 H$ `- N: X9 y9 [+ Q3 y5 U* B
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)' O, K) d% `6 K8 [) r7 Y
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    1 w" M* w& g' Y1 l2 C; \1 X
  10. $db = $mongo->mf;//选择数据库5 \# h$ ~# T( O6 Y* _
  11. $collection = $db->friend;//选择文档集合
      Q0 M( f4 Y3 w$ F/ P
  12. $doc = [//定义一个文档,即一个数组
    , m. R5 j6 ^) u7 Y8 U* S9 t
  13.     'First Name' => 'Jet',
    : L$ Y; x. L) C% Q4 D/ T
  14.     'Last Name' => 'Wu',
    . |. y! h) M0 P2 e
  15.     'Age' => 26,
      b: K' s; `! s
  16.     'Phone' => '110',* \7 r( e) r  d7 B$ j! E7 [" A
  17.     'Address' => [
    # U% b( c" L$ v# ?: L
  18.         'Country' => 'China',4 U% ]0 w# N+ L# w, V8 u8 m0 N$ c
  19.         'City' => 'Shen Zhen'
    . _% b; G- h- N+ C6 A
  20.     ],1 L% W9 k% H6 l4 r% u4 t3 D, G
  21.     'E-Mail' => [
    ; d4 X0 f, U1 F. t- A, D
  22.         '123456@qq.com',
    + s" C+ U' q7 M) \3 g, @
  23.         '666666@sina.com',, f3 J4 O& V  X) s
  24.         '8888888@qq.com',9 z  ^( g  g) Y) l
  25.         '77887788@qq.com'
    " n' S& J# U' h/ Z/ q2 q& a
  26.     ]$ u3 s$ |+ e+ F5 Q
  27. ];
    : h  c6 w+ r9 u3 ]+ H
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    8 q/ w* S1 H. e7 z) [( ?
  29. echo '<pre>';
    4 \4 \, T4 b6 j" ^3 `6 Q
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    " B! I# o8 N- ^  R/ h
  2. //参数1:搜索条件* D  W* m. \; O
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段# ?+ f$ P0 B  `5 l* l' \
  4. $mongo = new MongoClient('mongodb://localhost:27017');, S# D2 Z8 v: s" [/ \5 R) l
  5. $db = $mongo->mf;
    % J" m% p' X) {+ _. W  R  i
  6. $collection = $db->friend;, Q4 \8 X" C1 o. b' n
  7. $one = $collection->findOne(['First Name' => 'Jet']);& \. Z4 `. C6 ~9 p# s
  8. echo '<pre>';* I6 {) p# D. l0 ]
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()$ S! t- Y1 Q: Z" T, E/ r0 i
  2. //参数1:搜索条件
    4 H& x% Y- @% k; S* c
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    2 }0 t  w  w  I, o
  4. $mongo = new MongoClient('mongodb://localhost:27017');$ t4 a& w4 e% V. b2 R! R1 @, |
  5. $db = $mongo->mf;3 H) m2 J8 \( f/ O6 q
  6. $collection = $db->friend;8 L" d/ f$ b; b8 g) [
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素! j  E! h2 x5 W6 |4 b* d: X
  8. echo '<pre>';
      ^+ K& z0 i4 L
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档! t, s5 a5 r! f1 O0 j1 U, c/ V
  10.     print_r($doc);. k6 v& H) f. B
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    0 m- ~4 B) c5 Q; a
  2. $mongo = new MongoClient('mongodb://localhost:27017');2 q5 f! ?* m  s
  3. $db = $mongo->mf;
    , F3 F. W) ]0 P# D0 A
  4. $collection = $db->friend;8 E# G' P: ~# L
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
      V& i/ F/ M# F. D" a6 ~2 x! N
  6. echo '<pre>';
    9 P& a, ?$ x8 F9 h
  7. while($doc = $cursor->getNext()) {) s4 H% D4 [( B& l- g) l7 L
  8.     print_r($doc);- T) `# i7 q  T7 b% c
  9. }
复制代码
  //查询某个字段的所有不重复的值# C+ U! J% O2 R4 X
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个4 r1 o1 Y3 j* K" {( p5 \
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    4 q% C" V9 u1 p! U$ t9 |6 C
  3. + o! O, D8 N  P
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    6 H& E) E& V# M5 q' T- s% |2 ~
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);) K$ J+ i% _/ b
  6.   M+ I) w# S$ @3 Z* S7 A! B7 L
  7. //$or:或查询
    6 K* K" V  v3 A0 u. f7 f1 L9 |
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);$ y; C' Z: L8 \/ m
  9. . ]0 N2 N1 }% S* s$ O
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* C, A& [; v9 {* m4 S8 ^
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    - ]+ ], p8 n& e/ i  |& d. f
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    # G/ q! _1 I0 }3 P. ~
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    & j% Z9 i3 a8 u) g% [

  14. + c6 I9 x) l$ ~$ n, e  d1 c
  15. //$exists:根据某个字段是否有设置值进行查询
    0 y$ a/ e6 }% c6 [, v) }
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档! H1 `* q. y; g: o- o; {

  17. 7 X/ o6 I! A2 J$ U' d0 ?0 n; l
  18. //正则表达式查询$ W. s: ^6 s* I9 ~( x8 \
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序$ ~/ k* j! m4 S) V3 [: S
  2. $cursor->sort(['Age' => 1]);
    # y) x% k  Z* l, h1 J

  3. 7 Q+ X0 I. S% v) l) C" j
  4. //忽略前n个匹配的文档
    & @$ W# w3 o3 j1 ]) `& z3 v4 u
  5. $cursor->skip(1);$ g4 {, V0 v/ k5 k, x6 Z

  6. % \: i( H9 c$ W8 n
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    2 @6 h) B: R) N3 N0 e
  8. $cursor->limit(1);7 B+ ~+ K0 b0 ~. ~  E1 b
  9. : S8 A# B: X  m: f8 F" {! L
  10. //匹配文档的总数
    8 \- G' b: p$ Z2 ^& s( R
  11. $cursor->count();
    , K" W4 @# p( h: v/ O* j8 g: ~
  12. - C. E3 X& ]: |" ?3 |
  13. //指定查询索引6 G; f3 z/ e) n5 A" m
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计2 F. C# s: \) z( y2 A
  2. $mongo = new MongoClient('mongodb://localhost:27017');" o* Z( C% @$ t8 a! j
  3. $db = $mongo->mf;
    ) b7 l( q0 r9 y) f
  4. $collection = $db->friend;
    6 ?* `; [, Q8 C# u. f8 {) [
  5. $res = $collection->aggregate([. T; X% y' K: j; u5 o$ r
  6.     '$group' => [; s* j" [( }, n9 f
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    # c2 I& s) q1 j; z
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加13 Y9 r: a9 L1 f9 q
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值- A  B+ y3 j3 l  |" N4 G' c
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值9 O$ U% F5 I/ N) V* }# s9 W
  11.     ]
    : l+ F4 ?% U9 J) }1 d: k4 g
  12. ]);: t3 K0 M3 U0 f
  13. echo '<pre>';& g4 i5 o9 f5 w% ?- t& H; T# K  R( }- u
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    ) N( e( l5 J! S$ Q5 O
  15. 8 a1 C9 D2 [& ^, z5 V% A

  16. % A+ K& \* I) n, X  Z2 P% q/ ?# ^
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    9 Z; q/ s0 C* D; j/ d2 T$ G
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。- G' ~0 r( V" h2 k% O) Y
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    9 t4 K6 Z3 X7 l' K) w: h
  20. $db = $mongo->mf;( T' ?7 V- D) E
  21. $collection = $db->friend;0 m1 d9 }6 t) b% b: z+ ]
  22. $res = $collection->aggregate([1 w% W9 b, Q+ `0 g% ^8 o  g! J
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    , T  N( E6 x7 H
  24.         '$match' => ['Age' => ['$gt' => 30]]% v! S/ i# C8 k
  25.     ],
    6 ?7 |0 A# S5 q$ T
  26.     [//指定分组字段、统计字段
    # F3 ]6 a) I; Z, t8 W: j
  27.         '$group' => [
    / g. m1 N+ a, F5 M1 \
  28.             '_id' => '$Address.Country',
    % }5 d9 K* W" E$ Q5 l
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    : Q; _& T5 O4 |- T0 C# w$ ?& }! x
  30.         ]
    ' z3 D# {- Y  u4 w3 Q7 s
  31.     ],( [) H$ ]6 z( R6 t- e% }' C
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档6 S' f6 J" Y" u8 k1 q7 w
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    & k/ M0 O4 F  B4 L  Q- o: `
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名; n+ N$ [) `7 O
  35.     ['$skip' => 2],//跳过指定数量的文档& U( D% k, P' ?7 [  n
  36.     ['$limit' => 2],//只返回指定数量的文档
    9 f2 A9 {' t! E! D
  37.     ['$sort' => ['totalAge' => 1]]//排序/ J8 }$ }" L  L* o
  38. ]);& E7 u$ V* c8 b
  39. echo '<pre>';
    6 b( K* J! p% f* n" X% z5 i
  40. print_r($res);
复制代码
3 D: {4 Q( S: A$ r1 M
三、数据修改
  1. //update()0 \# M4 F% h0 S$ e2 k
  2. //参数1:更新条件,指定更新的目标对象。# ]9 K2 k, R( ~8 x$ C+ \: K
  3. //参数2:指定用于更新匹配记录的对象。0 M4 ]. T% u1 e* t' p
  4. //参数3:扩展选项组。; c1 r8 j9 V, y0 s7 _
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。) _# b' L5 [0 n& j
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ! p# t' q# R  t0 H
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ' }9 f" I, r0 s& {
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    7 p( }2 L) l& o
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, G* w; ?  R6 e, I& h6 _, x
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ' S2 d6 e2 q" d0 b# w' I
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    + D( W1 l: N  ]+ S
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: Z2 a6 h% S" M- T0 I, [

  13. 7 I- b+ R: A4 n9 Q
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值8 K" f' p# }/ ^. I
  15. $mongo = new MongoClient('mongodb://localhost:27017');
      Y& U9 G0 ~% }( g2 Y
  16. $db = $mongo->mf;. M" a2 S1 K+ ~, t/ U
  17. $collection = $db->friend;
    , n! x7 v/ O7 @5 ^- L9 b; [/ G) W
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);6 ~. j9 [  ~1 A$ u+ k& I
  19. echo '<pre>';5 |6 k5 U- b6 v3 W
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量( h9 e1 w- ]% m) \$ M- d: `$ D$ H

  21. 2 G+ q/ l" O8 O! F) ~& ^
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值' {( @1 ?/ n$ n, \) Y& z: j
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);- D: R' u0 V3 |
  24. ) E+ X( t; Z4 W4 I
  25. //$unset:删除字段& W7 ?% d- a0 t% w% K
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);) a  `0 B& x' i& g* `7 {. M
  27. & C: G0 c8 n- j" d+ A' A
  28. //$rename:重命名字段,若字段不存在则不进行任何操作3 _4 `! v1 y5 p0 w  c! Y
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);, w( @( T$ a- s( o' h0 ~) V$ N
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    - }" c, I8 [- I

  31. : h- r4 `  ?3 ~, ]# y& t4 X
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * p( Y7 C, T% C6 y8 V
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);  @$ R' ]* Z# K5 [  Q4 `
  34. ( W$ G7 ], k2 q
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    8 g* O$ A/ o" X0 m# A0 Q
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);- c" }2 G# d# t. f' Q
  37. $ X( s9 A- I5 O; Y: o
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    $ q1 m# n* A: y9 y
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);& P6 U( Y% _6 C" a& N5 N
  40. $ U0 }, l6 t5 [! h
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! ^  A$ J8 u( z3 w
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' X" ?1 N7 ~/ }* ]% I

  43. : o. ~+ @/ d  Z
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 ~! f- k1 x- ]* M7 \/ K
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);/ n5 y' O' C# B* Y5 D
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    % n: h9 x/ V5 `" d% o

  47. 4 v  d4 V! X' n: k% o; J
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    2 E4 a$ r$ J% ~* U1 [
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);* g3 q. x" s! W$ s3 X; Q) Y

  50. 7 r) k6 h8 J! F9 {
  51. //$pull:删除数组中所有指定值
    - |9 A" a& x# c6 T% w9 ^* B
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    / M! x0 ]! E7 j

  53. 8 _/ v1 W. I! s9 U
  54. //$pullAll:删除数组中多个元素的所有值
    : M+ Z) S. }9 R+ n
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()" ?4 D6 Q2 u) S, ?# l
  2. //参数1:希望保存的信息数组
    . p4 U$ z0 y% D; z9 Z7 j1 P6 U
  3. //参数2:扩展选项
    8 d( a& B$ q! n
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    5 ~. e+ j' c5 c
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% W% Y, ^' ?; |* X# P2 K. b8 H' @
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    7 m, [" C8 d0 _
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ) j' {7 r  p' X# X* p$ ^/ ?
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    7 E3 ~/ ]$ i, c+ M) l) ]
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    0 E( k( u2 V, \; S
  10. //若想更新则应该在参数1中指定_id键的值。
    / l; U$ G7 L$ J0 V8 n
  11. $mongo = new MongoClient('mongodb://localhost:27017');+ e2 r( ^& C/ r0 a5 h
  12. $db = $mongo->mf;8 Z2 @6 J- A' a2 \
  13. $collection = $db->friend;3 z" e& Z; S* Y! X8 x  [- d
  14. $doc = [//定义一个文档,即一个数组/ s8 b2 d  Y3 f" t
  15.     'First Name' => 'Jet',
    . J# a! @3 K1 c
  16.     'Last Name' => 'Wu',+ _3 B: V  `, v9 L& t2 ]
  17.     'Age' => 26,
    ( a6 ~: }! U3 D) w
  18.     'Phone' => '110',# \- Y6 g0 i' E  d* g/ ]# b
  19.     'Address' => [# z$ A2 t" J) g) N
  20.         'Country' => 'China',
    ; g2 V' B4 A; i$ q' {+ M) G* F$ F% R
  21.         'City' => 'Shen Zhen'
    4 A; z. s& X7 u& ^# ^4 h; x3 ^3 m
  22.     ],
    ) u! h/ z7 `6 j/ {5 Q
  23.     'E-Mail' => [9 }, h& M8 _- B1 G# V
  24.         '123456@qq.com',
    " L) Z; c8 \2 m" w& {+ @4 j3 T
  25.         '666666@sina.com',  ?- \! x7 Y, ]
  26.         '8888888@qq.com',
    # X+ S( G1 c0 t' t( H
  27.         '77887788@qq.com'
    : ~  L+ x+ u2 r  H
  28.     ]
    8 ^2 B# O% C: p/ @. T' e7 l/ ]
  29. ];% }4 ?) Y4 u5 [& c* ~$ R
  30. $res = $collection->save($doc);2 ?: C' P% U8 M- g& L* _
  31. echo '<pre>';7 Q  B, o8 K0 n  S% Y- @' ~3 u
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    # ~* ^0 f' b8 ]) [3 D; w

  33.   N6 z9 p7 T+ ~  j2 g, A
复制代码
  1. //findAndModify()
    : Z! ^; W9 x6 \. X
  2. //参数1:指定查询条件( e( d% D% h# @! M
  3. //参数2:指定用于更新文档的信息
    # k) Y- j/ V+ G) }9 F+ Y% c
  4. //参数3:可选,指定希望返回的字段
    " v$ X. y- l- g1 }1 N$ Y0 [
  5. //参数4:扩展选项
      k% h$ n5 d8 S6 d" [
  6. //  sort:以特定顺序对匹配文档进行排序4 Y! p8 v. U5 Q! x  T, G
  7. //  remove:若设置为true,第一个匹配文档将被删除' ~  S. r0 I! O- b5 _/ @, h5 r2 j
  8. //  update:若设置为true,将在被选择的文档上执行更新操作# [/ [: S6 c& \5 ^9 w( a, E% n
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    : j8 Z. j) p9 N/ |+ w
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档* V- e! [# {8 t0 K
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    ! F& N- X+ Y) B. j9 b
  12. $db = $mongo->mf;
    : o) B, }5 d  q/ G* H% o
  13. $collection = $db->friend;
    & O! g) _+ P2 Y6 g8 O8 P, m
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);$ t5 D- X* V' [! B, u
  15. echo '<pre>';" G& D3 }- V+ m2 @
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()! f! {; x% m9 e4 ^' ~3 l* @
  2. //参数1:查询条件8 P6 o# o. q9 L) C) _2 J' ^
  3. //参数2:扩展选项$ E+ N- z% U( G% F: q5 p! k
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除- H; g; s2 H$ o4 G( c/ l& l/ y
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% u( C" `5 j) Q1 ~6 h3 x9 ^# f
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ) ^: r/ B5 \1 ~* l8 R
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    + s: q  Y: Y* N  B# R* t7 a/ n
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    + K0 ]' L8 D$ j+ h! q. `. o
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    : Z) a; g# o% x5 C
  10. $mongo = new MongoClient('mongodb://localhost:27017');6 D" f' D: [  E; z) h
  11. $db = $mongo->mf;
    ; O5 n7 K' _8 F
  12. $collection = $db->friend;
    ' k% P# ]7 D2 s. {& N4 q% w
  13. $res = $collection->remove(['First Name' => 'jet']);+ U% p* ]+ H% N1 z, Z
  14. echo '<pre>';: l5 j9 [% m9 ?+ p; M! }! a
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

6 f9 W6 M0 F2 v; C
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

2 R* a5 @# {% t
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
+ M  X6 e3 W+ D3 v
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 t5 M4 r5 l: ~3 |* C; v* C4 h
  2. $bulk = new MongoDB\Driver\BulkWrite;, R( H3 ]8 C6 j6 @  j" n
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);0 j: J  r: m1 a& p6 S( q
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);' x* H5 I# o  E% j3 P! K0 R, p

  5. 6 G- U, M9 D) X" x# y" u. o
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    * r/ e) W. P. l& v, _
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ( [, u9 L" u. K' q7 `/ o4 I, T& {
  8. echo '<pre>';
    ! k' S* P7 Y8 K- S$ l
  9. print_r($res);
复制代码

1 e. k8 B1 q) F. d  d7 z4 `' _
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    + f- s& T) l- J( X) ^+ c  K
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* f6 v+ N0 n, H& c; ^
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    1 }4 J- [, f: ^9 }+ x

  4. 5 S, _% I; L3 ?, g0 i  [# G
  5. $data = [];( }# X: j. i, p% L7 a; |
  6. foreach($cursor as $doc) {
    - w; ?$ s0 u4 l: V; o# D
  7.     $data[] = $doc;
    + H8 n& u+ c9 J+ _- J9 [* J
  8. }% {, F6 T+ f; i% k5 I
  9. echo '<pre>';- ?1 J6 p7 Z! V% w9 l: f( W
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');  l5 Y4 k$ j1 F$ J' y/ D
  2. $bulk = new MongoDB\Driver\BulkWrite;* q# T) w0 S0 D. V0 J$ T6 s  k
  3. $bulk->update(5 S6 @5 a! @  J: _$ y6 s3 ^5 V
  4.     ['name' => 'JetWu5'],
    ! C: R6 G* A# [- ]+ }: F9 o
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]% M+ i( W3 |+ g/ }3 ?. e( L
  6. );+ x2 n" A0 q& X: M5 X
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认# S) i1 z* A. q% B4 _( H
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ! J5 `) F& b3 A/ W5 M0 o" n: H0 ^
  9. echo '<pre>';
    ; H) _  ~' A" G: |  X' r0 l
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ( Y( s! x1 T3 ~  d5 S8 |1 B
  2. $bulk = new MongoDB\Driver\BulkWrite;
    - {1 r( _  i% q4 x( d4 j
  3. $bulk->delete(['name' => 'JetWu3']);
    # [7 M9 ?. j) ~/ G
  4. $bulk->delete(['name' => 'JetWu4']);1 A+ t9 ^- p# f) u0 I3 D6 H
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 L: m5 ?2 }% q
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    : R" O( g3 W1 _9 {5 Q5 |
  7. echo '<pre>';
    ' J. Z7 B& U2 ~; o  ]
  8. print_r($res);
复制代码
" y0 ?% q' j& d8 O+ Z$ {1 N6 ?! [
& f8 u  P3 I" c& [; k' X7 {

# z) r( t9 |) |+ H- c

: O7 g% _, g- n' m; s
# h8 Q  U& w$ x- X1 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 23:59 , Processed in 0.054672 second(s), 19 queries .

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