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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12861|回复: 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()
    3 k; G  J4 X! H% {
  2. //参数1:一个数组或对象
      m1 p  W' P( U3 q: N& N
  3. //参数2:扩展选项& D. f4 w' D" N! w% _
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘4 |# ~; k7 ~+ L  \9 ^/ I
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    & y/ ?& Z/ v$ C7 c1 n$ P
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    8 _5 p# n& @+ x! w! H
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    & E/ y, i0 p+ U
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)  K/ ?6 }; H: H0 ^  u
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    . e$ S% D( {% m* o$ K* w" o2 v
  10. $db = $mongo->mf;//选择数据库  o  T% Y+ K( M2 F  a* R
  11. $collection = $db->friend;//选择文档集合
    1 u  A( S- n* v; Z# b  m9 m+ M' s
  12. $doc = [//定义一个文档,即一个数组
    : R! j0 K4 W9 _' d- k
  13.     'First Name' => 'Jet',
    . ^, p! j, I0 H: s4 T
  14.     'Last Name' => 'Wu',6 A, F8 L" ?, \
  15.     'Age' => 26,0 m2 g* ]+ k  ~1 E( s5 C- ~
  16.     'Phone' => '110',
    # v+ j: e2 {4 M
  17.     'Address' => [
    0 z) S" C2 g/ y7 g, t1 W
  18.         'Country' => 'China',$ g0 r$ l/ _" y* Y! D2 H
  19.         'City' => 'Shen Zhen'% O7 h. E/ @: l  U
  20.     ],
    " ~$ S3 K7 f7 p2 l7 ~% i
  21.     'E-Mail' => [. v* T9 x$ ^' o- {
  22.         '123456@qq.com',; Q3 w% ]( j! z" j. {" M9 g
  23.         '666666@sina.com',
    % B0 k8 Z# v, e
  24.         '8888888@qq.com',2 w! X, [8 g0 M7 X' v/ P  ?
  25.         '77887788@qq.com'" F; M4 |6 f- t; ~4 ]
  26.     ]" F# A& k* ^8 Y7 M  \2 t
  27. ];
    + Q  e9 E6 Y! x. c8 N
  28. $res = $collection->insert($doc);//向集合中插入一个文档8 U, Q4 K# V3 _7 u/ C
  29. echo '<pre>';
    ' s9 ^" L4 l( r$ ]$ p9 E
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    ; Z& U0 G6 X- R2 r  w6 b
  2. //参数1:搜索条件5 ~; Q) Q. s9 q; p1 J! a
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    ' X- \# c; W+ G4 v# X. B
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    0 ~6 `, O7 B  s" n) H' k
  5. $db = $mongo->mf;: S9 Q/ o5 s* ^$ G: ^
  6. $collection = $db->friend;/ N' e3 Y( ?- n- h8 I7 C+ I
  7. $one = $collection->findOne(['First Name' => 'Jet']);3 C, R; G, h/ A7 P
  8. echo '<pre>';
    + V; ?* k0 S) ^$ |0 Y8 ~
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()' x4 q  O$ C! i! y( [! M
  2. //参数1:搜索条件
    ' N1 a9 V6 M& f
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段7 V; U$ n& {6 N5 o6 j3 o
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ( |; z# }6 `3 ~
  5. $db = $mongo->mf;# M. }8 X* D# h3 m# `
  6. $collection = $db->friend;, A' X, V2 P$ ]% n$ n1 G# E$ m) H
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    3 y2 l2 t$ U$ J* _+ m$ P
  8. echo '<pre>';
    , H3 g! Z4 L6 J! o
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档) p) j( q' G, i  m) l  u
  10.     print_r($doc);
    " a0 X3 S  H/ b5 J
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询" W# s, p0 R7 ?1 F$ ?' g  f. u
  2. $mongo = new MongoClient('mongodb://localhost:27017');2 O: ~* e/ J* x& O$ e
  3. $db = $mongo->mf;
    4 v* a. ]2 g& R- U3 u4 l' i- W
  4. $collection = $db->friend;
    2 F8 G" \+ r  b9 T% x
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    * s8 `* B3 A( K  s; b* s
  6. echo '<pre>';2 |6 }( z/ h7 X1 H
  7. while($doc = $cursor->getNext()) {
    5 |$ q  I$ o% J3 r
  8.     print_r($doc);
    " e- |* U6 G$ y2 i: {
  9. }
复制代码
  //查询某个字段的所有不重复的值
# `* @- |4 |7 m$ `8 w. m* B. W; k  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    ; G* F- b- |( ?6 g6 P
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);1 A" w. ^! _$ Y
  3. . s6 `; D4 S2 ?' [
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    / E& Q# d% y" y$ d! v. n
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    . d! |5 ?# Z. U% y# _7 e8 F

  6. , |5 [% x$ d# [; e$ H2 h
  7. //$or:或查询- G& v% S5 s* }& n
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    7 w5 V& N, |" K
  9. , ]2 W! ~2 D( c& M$ U1 H  w1 o
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中: S# g+ Q' ^- w5 e, r+ [
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email2 j0 c; ?7 L: r0 R0 v
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    1 j3 F+ s! m  F* e% N1 k, I1 @5 E
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    ' t7 f; E' C+ Z- k- @- R
  14. 4 E$ t( ]' i$ Q! ?
  15. //$exists:根据某个字段是否有设置值进行查询
    % U9 I3 _, |: p0 E. X" w
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: H, T; ?; j/ ^
  17. % l1 L  i( z+ f% B, b5 Z; T
  18. //正则表达式查询
    - q0 ^; a3 r; _* M3 k9 _
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    5 i7 [1 {; O0 r8 s* {8 \; E
  2. $cursor->sort(['Age' => 1]);
    / |+ J) d( Q& X: o: W# O
  3. 5 S. \3 j! a! G8 q' m7 q$ D  L
  4. //忽略前n个匹配的文档& e4 g* H- |. P- \+ _7 ]. _" @
  5. $cursor->skip(1);
    ) w- b3 o7 Z" c. L% u! g/ z
  6. ; P& s# u/ l" p
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    $ M( `, b, _! ^: S' _* T5 E" g
  8. $cursor->limit(1);
    8 b3 S8 L( e( a  n8 L: R
  9. " p# l  R0 k, F) p! i* r% f
  10. //匹配文档的总数
    & x! Y1 j6 U9 O, u$ A
  11. $cursor->count();
    ! F8 J$ Y8 y2 i% J: v+ d
  12. ! h2 g5 T* r( a$ g( f
  13. //指定查询索引/ C9 q4 W% L2 O
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    % x. b* k& d3 I
  2. $mongo = new MongoClient('mongodb://localhost:27017');* K9 q- I( f6 J6 }  n# U
  3. $db = $mongo->mf;
    / [9 y2 _, Y) }, N! C. d5 V
  4. $collection = $db->friend;$ a" _$ }8 O5 b, J3 R) G
  5. $res = $collection->aggregate([4 q9 C" A- \! M3 w8 n; ]3 `
  6.     '$group' => [
    , Q" y; z( P8 H$ n; n3 Y' p4 [" z' f
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    , }$ O1 m/ ^* R: @' _; k
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    4 ~8 z5 j( h7 H. g& E3 ?# w
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值. d% }5 B+ ^) V+ N- z/ P! R0 B
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    / Z8 x; r1 O/ x  A9 o5 ]2 z& x
  11.     ]( ?; Z& |% n' y# V& S( w
  12. ]);
    # g# T5 ~; O' i: |# b4 O4 V
  13. echo '<pre>';) a9 C: |7 p6 J; X4 X6 O/ ?
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果- r( _1 Z& B- D7 E) v6 G
  15. ) M+ Z& V5 w1 D# }/ C
  16. 4 Y5 N- y, P- ~
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序* g* ~) d5 ^& p/ W% k, ~
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。1 X3 J% t- N' @' ~( ~# T+ m
  19. $mongo = new MongoClient('mongodb://localhost:27017');+ G+ z' p+ u9 v+ x' d
  20. $db = $mongo->mf;8 r  {  K  }" \9 O
  21. $collection = $db->friend;
    & l: `+ [# e* i1 ^6 ?
  22. $res = $collection->aggregate([
    / V/ Q& ]( r9 u3 ~  }7 j
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    . Z$ }/ C. p/ e$ ?7 a6 m0 X/ @
  24.         '$match' => ['Age' => ['$gt' => 30]]2 I' y& x- _1 {& m  _
  25.     ],
    $ x/ w, R( y0 T  P! y& I- K
  26.     [//指定分组字段、统计字段
    + Z% g' P5 Z0 ?) a# o  F" T7 I
  27.         '$group' => [
    & }- y$ s6 ~3 ?& H  N$ S
  28.             '_id' => '$Address.Country',
      D& j! A( {. i1 ]1 Q9 `
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和9 A; X, T: M# E6 {; i
  30.         ]2 U+ Q( _) S8 ^/ M: G* n
  31.     ],
    8 E, W! r! A2 Z( m  C( l; h
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档+ Z0 g. D, `+ \4 n. {
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    8 u& P$ y% M# z5 E, N( Z4 w( {5 P" }. p
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    / B6 e) C; [: X! y
  35.     ['$skip' => 2],//跳过指定数量的文档* i5 a% h6 i7 H4 M
  36.     ['$limit' => 2],//只返回指定数量的文档. U2 D3 n* A0 h- m0 k2 i
  37.     ['$sort' => ['totalAge' => 1]]//排序: P, ?( A6 ~$ M5 i
  38. ]);. j+ Y/ F! _# Z, ^6 n+ X
  39. echo '<pre>';) G: q1 S+ t0 s+ ]3 K
  40. print_r($res);
复制代码

. h' y/ \5 V7 E9 \. v2 S5 s7 t
三、数据修改
  1. //update()8 ?7 R5 n7 \3 T3 Z0 w1 w
  2. //参数1:更新条件,指定更新的目标对象。
    % T$ a4 c9 V3 ~( v
  3. //参数2:指定用于更新匹配记录的对象。
    & P% L1 e" L% a$ y- j0 f
  4. //参数3:扩展选项组。
    ' F  d6 E- y# @0 ], S! `3 ]
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。5 n) q3 M4 I7 T5 o5 G5 V
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ! x  U5 w5 N, h: L0 c0 a4 \
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) d  l# u0 Z" _$ I' R- A# a
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作1 @- v+ Q  i( ?, E4 f4 Z+ J
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) P3 y4 }' [+ B
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    1 e! K2 x8 f1 J* P+ R
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒): x% R8 P$ {6 x) u2 [. k3 A
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    , O2 c7 F$ w7 M9 t
  13. - x  O  {, Y% u* w' {8 Q
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值) ~5 ]( S4 ~5 |# ~& N+ C/ w
  15. $mongo = new MongoClient('mongodb://localhost:27017');# b  Z; [# U% N4 M% S
  16. $db = $mongo->mf;; O. B5 v  Q& P& l2 `! p
  17. $collection = $db->friend;
    # I% b1 ~& O! F4 w: r
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);$ U2 y! T# ~6 k  W( R3 D2 d! r- L
  19. echo '<pre>';. w/ H/ ]% R5 V" n0 s
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    4 ]- r) F& U8 m% k
  21. / S! {# P) B* Z  \4 V8 I
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    3 F" Y+ o$ D8 y2 ^
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    2 q3 s# b# k7 ]7 M$ |% R& U

  24. 7 n0 U- R5 l# Q- R* y+ ]
  25. //$unset:删除字段2 Q: O* j% j8 b% d1 p
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    0 r* J* E4 O+ _9 j: b3 {

  27. # p; Y  g6 k( B3 Y% u1 G+ E
  28. //$rename:重命名字段,若字段不存在则不进行任何操作/ z# l* w' v- b. C
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);! p2 c: a6 J% E) g$ j7 C! }
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。  b( Q2 K/ l' ^8 `- O

  31. ( i8 |) I( B* q  I0 m" F- g1 I
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的2 A4 w2 [2 T" |8 C' d
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    0 T# ?" D* C- ?0 ]( O

  34. ) r; P: G4 x' u* ?# w0 r
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错" T& C+ ?, K$ W1 _1 a0 p
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);/ N1 l# b2 z: x6 C, U4 s9 @7 `

  37. - M) L& V. h6 x+ N
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错& l" p( x8 u7 f4 a0 `# I& O
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);% l6 `1 V  S6 d+ L- f

  40. , l3 ]4 a4 S7 w0 h( k- ?- h( M; U
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错* D. j4 g8 i9 b
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
      \% l5 W2 N9 y' t; v$ T* X( n
  43. * I& C/ d& s% ?9 r
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中); e* O0 m- R! g& w; s8 A3 }+ s- C
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    * t0 K1 l7 p8 }/ b1 e* n- p
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    : g+ Z' \7 k1 C5 k

  47. % n9 Y) e$ a( B8 J$ }
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    - a( ^, o1 w% w5 e3 e
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    6 }1 O3 c4 @1 A$ ]" l4 m( M/ y! |  v8 y

  50. " T" J9 {* a, n/ ~( ~
  51. //$pull:删除数组中所有指定值
    3 p" H9 V4 Q, Q6 l; J
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);, x: Y' V6 R+ }/ P
  53. , s8 `2 _" l- u8 t, c# u4 X. Q
  54. //$pullAll:删除数组中多个元素的所有值5 L5 M% w8 y, L; I5 e9 A
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save(); {  l: d4 V; g- Y* D! q  U
  2. //参数1:希望保存的信息数组
    7 u& Z/ q* p% M+ c( Q$ d
  3. //参数2:扩展选项
    , q( `+ \' U5 [
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ( W% c" C6 U4 m) I
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    1 Q* ?' i+ T8 J
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) T% Q2 ?( |. q% M
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    2 ?1 A; c& t5 J. i; d2 I
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)( D4 I9 q# E, u0 J7 R
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    . ~0 J" w" B7 v' b' E6 }
  10. //若想更新则应该在参数1中指定_id键的值。% {1 o# s$ F$ H# J) w9 g
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    + X3 U, k/ X1 U1 k3 r$ Z5 ?8 ]$ W
  12. $db = $mongo->mf;$ r) k) u, n. x) R
  13. $collection = $db->friend;* L, L/ A5 O  h) U7 y- `
  14. $doc = [//定义一个文档,即一个数组7 ]( M/ \5 J( j$ B1 T" A: q7 }
  15.     'First Name' => 'Jet',
    $ P  |# C: d$ R8 o& [' X
  16.     'Last Name' => 'Wu',4 r  V" O7 w$ M9 n
  17.     'Age' => 26,
    5 i- A: M3 n  L  _7 H: H, J
  18.     'Phone' => '110',. v5 W9 I- O3 j0 D6 a3 H
  19.     'Address' => [
    + z' b/ E; u/ a
  20.         'Country' => 'China',. x0 V) h6 e/ u5 _8 y4 v+ P
  21.         'City' => 'Shen Zhen'
    3 v( i$ @; P5 t, F) `! l
  22.     ],
    . x2 `1 s: F: ]4 F- ]
  23.     'E-Mail' => [! z/ h& q  s" c# S8 y/ @
  24.         '123456@qq.com',+ d8 J! t, R  H8 M
  25.         '666666@sina.com',! p% ?6 P' P) h- h
  26.         '8888888@qq.com',2 O' k5 Z+ u, O* v  a) G
  27.         '77887788@qq.com'
    7 S: u$ B! C* b  C, Y% t
  28.     ]
    5 ?$ p$ }9 A1 q: c. p2 {
  29. ];! ]" t! G8 f( m
  30. $res = $collection->save($doc);
    2 V# A3 l% Y) U( R! [6 q2 ]. \
  31. echo '<pre>';
    0 C( x/ \/ b& Z
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    ; g% X  j3 B" q3 p

  33. ' U0 f4 x5 z8 @1 l0 }  P- B, t2 m6 ?+ d
复制代码
  1. //findAndModify()
    " M; C5 H/ \+ N4 p* P% \
  2. //参数1:指定查询条件/ y6 r" O* B+ Z; _3 }  j
  3. //参数2:指定用于更新文档的信息
    8 ~& a6 j0 z. ?+ p3 d7 E
  4. //参数3:可选,指定希望返回的字段5 A: h# b0 }" M- K( a
  5. //参数4:扩展选项% n) J9 t. W: ?6 \- g' j
  6. //  sort:以特定顺序对匹配文档进行排序
    % ^4 c; @3 _! a$ t2 u; M
  7. //  remove:若设置为true,第一个匹配文档将被删除( T* W& `' V) l: O% ^! Z) a' c
  8. //  update:若设置为true,将在被选择的文档上执行更新操作0 K: _: {* e! f; ^% s. L9 M
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档8 j* W7 Z6 V; A$ h
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档' o) i( _9 K- d6 \2 ]6 ?
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    5 E9 x! _; |% a6 J' ^2 w6 Z5 L/ [
  12. $db = $mongo->mf;0 A& D4 r; J- f# j: T/ f
  13. $collection = $db->friend;
    1 `0 M, k/ U* W2 w2 \6 D2 v4 X
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    7 P& H* T* @, T2 U: I
  15. echo '<pre>';
    + V: \% B2 ~3 K: n7 {( v# ?( ~
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()  L. d. Q. \; w$ t7 F' e
  2. //参数1:查询条件
    , g) Q! _/ x( T# \$ Z8 P1 m
  3. //参数2:扩展选项: x; b4 ~+ q1 ]' a" ~- m& }2 w
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除' t/ z; ]# p( a: U
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ R+ u7 d9 s, R& b0 b8 `
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ! F1 E( h' U0 X! @6 H! a
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    # r2 U  {; \+ s, u( M+ T
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& E# m; j( P! _4 n: a
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ q1 ~; U" Q9 D  d" D* X4 r% C5 v: N7 X
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    4 {$ b# r: w, u" J3 v1 c( e% A  B
  11. $db = $mongo->mf;
    0 E3 s& d. A! x
  12. $collection = $db->friend;4 ~, w+ I) l( F9 `. G
  13. $res = $collection->remove(['First Name' => 'jet']);
    0 O; u9 Q( O; o- Z
  14. echo '<pre>';
    ! u7 F$ g$ X& c
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

2 ]) ~& d0 C- @0 q) l0 J
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
0 F0 v3 p) v+ d+ V5 g
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
$ ^$ v& f5 ^# D) y
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');5 e; _; Y$ R7 k( v+ g
  2. $bulk = new MongoDB\Driver\BulkWrite;
    / q% y4 V1 @' F4 U
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    + b& g% Z$ A3 w$ p+ G6 W( Z
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    - o8 X6 P+ z1 T1 g

  5. ( r, W0 N- x' T% \
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ! ^0 C) i; U- i! m7 r2 L% ]  F
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ w; q& n% k1 Y" I, k* }
  8. echo '<pre>';
    % r3 D$ S4 G. `
  9. print_r($res);
复制代码
9 h- i+ b3 @: U; x$ j
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');. @( Q- |; T( D. a2 f
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    : J7 p& \/ \) o9 p+ b$ `: C
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    ' a: `. q! W- Y

  4. $ G$ f: B7 Q! k' `9 ~: D
  5. $data = [];0 \4 K2 N: o9 i$ a
  6. foreach($cursor as $doc) {5 Z; {9 J- |  U' I- A
  7.     $data[] = $doc;& o' ^8 O2 A3 F" N
  8. }
    ; m5 Y  `& ?, C
  9. echo '<pre>';
    ) s: K, n7 F, e4 a- I7 l8 K
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ( W1 {- X' y$ ]0 y
  2. $bulk = new MongoDB\Driver\BulkWrite;! ^4 }; N7 Z. q
  3. $bulk->update(3 W9 g3 {$ e- V& b8 W
  4.     ['name' => 'JetWu5'],* _3 b; O( A2 A) c0 }
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]8 P! m5 w( j, c- p+ k. w
  6. );
    ' }# `* k& p# C, q' q9 E/ T
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认6 E7 r* L2 X7 \: m2 a0 l& O0 D
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    9 c& E) F2 s  U# v, i' [! l
  9. echo '<pre>';  z3 L7 k% z9 J) ^7 V. M. v
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( S! K. ?$ i# a5 _. i8 g
  2. $bulk = new MongoDB\Driver\BulkWrite;' f2 X# i: P' z- k5 T* O4 U
  3. $bulk->delete(['name' => 'JetWu3']);
    1 q$ z5 L; i: H" F+ B7 ?. f
  4. $bulk->delete(['name' => 'JetWu4']);+ x2 ^8 ]5 t3 J8 Q; g1 Z
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认" ^8 m9 b; k( g4 f/ Y1 K* z; a' `
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" W, c! c2 f/ Q4 R  W
  7. echo '<pre>';
    * K( P  m, j, z4 ~( d; ]/ H& X& _
  8. print_r($res);
复制代码

" t% q" k  i* z/ z- ~0 v
( q$ w2 F# B9 t8 F4 w- K7 [* R) `" [" i' M3 S+ Y

- B  ?# Z5 B4 s0 N
$ h  Q& U3 B. k: v( a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 21:44 , Processed in 0.072466 second(s), 21 queries .

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