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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13071|回复: 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(); c, j* }5 T8 g8 ]$ d2 F
  2. //参数1:一个数组或对象( Z+ |3 C) i& Z4 R- F0 ?) o6 |# `; Z
  3. //参数2:扩展选项
    ! Z0 _8 Q9 M. d6 |% V  q, ?
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    3 i' m" L: K0 B1 ?
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志/ t9 j) X# O' R$ C! {( W% Y
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认  E( |% D  G- B. Z0 x6 S. C1 Z
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    3 n) ~3 t3 U& y  ]: p$ _$ _) e" ?4 l
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ( H2 U# R5 [$ v9 J7 G) w; |6 J% ?7 }
  9. $mongo = new MongoClient('mongodb://localhost:27017');, ~' c2 B- ?* G9 @8 n
  10. $db = $mongo->mf;//选择数据库
    $ X2 ~* O% t0 E# H2 V+ Y
  11. $collection = $db->friend;//选择文档集合
    + Z8 X1 w7 ]1 Q+ ~6 K- {. b
  12. $doc = [//定义一个文档,即一个数组
    2 D/ f' `' z5 q- y1 V# D
  13.     'First Name' => 'Jet',
    7 a/ ]. Z- t3 C5 d; O2 O# J
  14.     'Last Name' => 'Wu',
    0 ]5 G, P) F- |$ ]: c2 [% d; E
  15.     'Age' => 26,
    / w, u1 I3 w! D* D8 {$ y' H+ O
  16.     'Phone' => '110',
    # a4 n& P* k; C1 i
  17.     'Address' => [
    . l; Z' p, t& J7 p( H$ `8 q
  18.         'Country' => 'China',
    8 G+ u1 B" t7 V
  19.         'City' => 'Shen Zhen'
      }7 g$ A: K: B0 A% T" p- }
  20.     ],* @2 U( V" x+ c& {
  21.     'E-Mail' => [
    % J4 n# }  i3 w0 W" j  e
  22.         '123456@qq.com',3 s  o% \! y5 s. h$ ?
  23.         '666666@sina.com',$ Q$ Y% S, v; k, M) X( n& T" v
  24.         '8888888@qq.com',
    ; S6 o. `( R- Q$ }, |! D9 Y0 k
  25.         '77887788@qq.com'6 t; y1 }, z( a+ c! L3 c
  26.     ]
    ( U* C2 j, j/ t
  27. ];
    . O' j  u( I% M) v) y
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    8 a- M: E- O! t0 ?
  29. echo '<pre>';2 x3 V  o$ e& Y5 @6 w
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    9 D& y' L6 k# s; R+ g# E
  2. //参数1:搜索条件
    1 }  _# `% l. S; h8 Y
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    0 P- C% H! d; Q
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    : g+ @, X- w4 t; s0 Q/ y7 \
  5. $db = $mongo->mf;1 x+ g, q) ~! a1 k6 X* F! N
  6. $collection = $db->friend;% g" O9 u' ]$ E3 K# b
  7. $one = $collection->findOne(['First Name' => 'Jet']);0 {6 K" b( w+ A
  8. echo '<pre>';! n) W* k; q- n4 h& A
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    ; l( v4 g) _: ]0 E4 K. d% f
  2. //参数1:搜索条件& o& E" s; H; J" j  }
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    $ N  M. N; q6 D/ `/ M& p  \7 w2 O
  4. $mongo = new MongoClient('mongodb://localhost:27017');: Y# k" h/ D. e+ m4 Q
  5. $db = $mongo->mf;2 q0 t4 i, ^8 o# g$ w
  6. $collection = $db->friend;
    ' f- `- z0 ]! t6 F) _
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    7 s( r" F" w5 _4 x5 k
  8. echo '<pre>';" w1 v# e. E  V$ O. ~* D8 f4 j
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    1 v8 c8 V% g9 f" W+ O
  10.     print_r($doc);
    * E* L* ]) J' ?: K- h$ U$ T, a
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    / }  P4 Y6 k* g0 [
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    / s% c  O9 j! E; E+ D# r2 h0 M
  3. $db = $mongo->mf;1 a& k, q. S2 E2 a: Q6 h& S, w
  4. $collection = $db->friend;
    & C) N/ k, B; E+ J
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    6 m. f6 d! P" \! f' o
  6. echo '<pre>';+ ~7 L1 c9 L% g
  7. while($doc = $cursor->getNext()) {6 y; w  @/ m6 r3 g. ]
  8.     print_r($doc);
    + f1 X0 l  @5 v  x5 F
  9. }
复制代码
  //查询某个字段的所有不重复的值
# l( V6 j# ?9 _! ?# o  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    9 y1 ~# C: j5 o1 X  A
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    " N/ i* o# W! y, H9 B6 V) Z- j/ _

  3. 8 a# e  u0 }& W) w" T8 D" E' E
  4. //$all:匹配多个值中所有值(用于数组字段查询). Q# x4 M, S  i7 p' K
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    * P/ f, ?9 ^$ p; @

  6. % y/ O7 w" A  y  X- A5 J" S1 b
  7. //$or:或查询, G0 O6 g# t; [' R$ L  d2 f2 ~9 Q
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    & w, m( ^7 c3 h* k1 N
  9. % m5 ]) F7 U3 K' S0 v0 \, L( s
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* W: Q/ y& V/ l
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email3 t/ w% [& C: c2 |, X2 `
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email3 n3 [& z4 y: b
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个" Q# q9 `2 G) F$ O" y- O9 T* F

  14. " Z) D% ]4 f8 ]0 Z3 k: R. i
  15. //$exists:根据某个字段是否有设置值进行查询
    ; i& j4 u3 b9 A, Q, v) h5 S# Y0 v  [3 i
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档4 W; ?% `+ u3 Z  H+ O3 ?
  17. + s% [% ?/ u# l
  18. //正则表达式查询0 B; M& c$ G) ?% }  \9 K& ?% ^
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序+ I. I0 T. Q; S# y7 ^' j: a- I
  2. $cursor->sort(['Age' => 1]);
    0 z4 |% e! }5 S$ y
  3. 5 N' }% i' m8 x) T7 f/ o( {
  4. //忽略前n个匹配的文档. t5 c) ^1 u+ d8 l3 X7 |. {3 Z
  5. $cursor->skip(1);
    9 }' v1 u( \  l$ S' M3 ]

  6.   a4 `1 ^# {2 r2 t: m; y
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 ~$ [- e# i+ C( k. q& Y9 U% W
  8. $cursor->limit(1);: u. N  C: @6 U/ x- d0 @
  9. ) s+ i. {: s* e! \! ~  j' _
  10. //匹配文档的总数5 z# N2 `9 I: Q6 m
  11. $cursor->count();
    4 U: G% S. Y3 O4 \
  12. $ `8 K, L6 d8 w4 }. G) n
  13. //指定查询索引. S. Y1 O9 c' E- L' {
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计: l* i. @+ P% ]) k( s# S3 b6 C* H
  2. $mongo = new MongoClient('mongodb://localhost:27017');* V$ m  M8 u9 }' o# D
  3. $db = $mongo->mf;/ y& k% T- ~( Y" [
  4. $collection = $db->friend;* T/ C# O4 M% w- I6 s+ b7 v
  5. $res = $collection->aggregate([8 g8 B; b( |- `2 o) A1 J8 s! I
  6.     '$group' => [
    6 N( }- Z3 y: i  o  r
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组( z3 \7 T. `( _! H
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    7 u+ e6 t( E  t: L. g; @
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    4 u# D# C" g, ]' n
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
      u, ~( {  c3 U: ?2 E7 \: D  |
  11.     ]+ q* c% b5 S5 a
  12. ]);8 m# u, ]; W, B& i% V
  13. echo '<pre>';
    , n) K% F9 E$ h4 y; U7 H
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    0 I. o. f8 d( k% w. L

  15. / x! N3 `5 `% r: I

  16. ! a- t; X/ _- B: {2 O1 `  V& J8 W) Y) _6 A
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序/ L# p/ [% ~* z2 i
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    $ i) f. J" W( E* K
  19. $mongo = new MongoClient('mongodb://localhost:27017');* H! B5 Q4 Y5 [' t+ Z
  20. $db = $mongo->mf;
    1 q+ D! X/ _2 q5 n* D4 X$ k
  21. $collection = $db->friend;
    8 x. d3 Y1 V4 E* {5 `" c
  22. $res = $collection->aggregate([1 a$ q( z4 E! z/ T, l9 ]1 Q: ~
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档, M0 m$ W6 F% w7 q7 y+ g* @
  24.         '$match' => ['Age' => ['$gt' => 30]]- C$ ~) p" R9 w/ g& I( R
  25.     ],. q0 d, T. F. W& _
  26.     [//指定分组字段、统计字段! n, h: m8 N6 C$ B' Z, I) {: y
  27.         '$group' => [
      R+ A. t6 {" q
  28.             '_id' => '$Address.Country',3 ]; n& J0 J  v8 q
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和3 w! a' V) q- a! v0 P
  30.         ]
    : m1 R5 q% R7 N4 Y9 `
  31.     ],
    ) a# V+ {1 g% x& A0 O- k
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档6 x1 C6 x8 i0 x
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。+ q2 a. z: z) ]9 \; v' j2 s/ t
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名$ _5 D; q% `, ?& _3 J- B' Z0 }* H
  35.     ['$skip' => 2],//跳过指定数量的文档
    6 K: U) H- z; p2 k4 m  R
  36.     ['$limit' => 2],//只返回指定数量的文档  w  `/ t& J, Y
  37.     ['$sort' => ['totalAge' => 1]]//排序, \3 g4 ?+ O; _- i7 @
  38. ]);
    5 H5 L) j$ E/ h# x5 A3 ~, M
  39. echo '<pre>';
    / z4 j0 Q8 g* l% G' t
  40. print_r($res);
复制代码

, o0 s' p4 D+ M  ]  h' B1 g, P+ M
三、数据修改
  1. //update()
    / U& y) ]1 u0 e& q" B8 B
  2. //参数1:更新条件,指定更新的目标对象。% q+ [% q( M4 Z# }' `- S9 P
  3. //参数2:指定用于更新匹配记录的对象。. U+ l" Q- Y3 [3 d2 [/ H5 |
  4. //参数3:扩展选项组。
    " r2 b4 k: \5 g
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。6 M0 ?* C9 O2 R2 f6 q
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。* U4 r$ [* e6 D; d# w
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    5 Y* k( j) C, {6 d5 H+ w- K* p6 F5 D
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作" H6 I+ |( S* O/ _
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。4 `# l+ y1 X+ b5 p) i* P
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间  v" _1 @% o9 {; ^$ {8 E
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒), r  A9 ]( W( g4 d0 q+ _
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。% u% ^' z3 }( ^
  13. 1 I/ {" t0 i6 _6 d$ h! L; n2 h# L
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    * o& }6 e( W( u
  15. $mongo = new MongoClient('mongodb://localhost:27017');, x  I* A6 X: Z
  16. $db = $mongo->mf;# |1 J+ ~3 Z- y( d5 v1 I
  17. $collection = $db->friend;
    # H7 Q$ M$ @2 p4 ?9 ?7 w% k' y
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);. @+ k+ `6 F9 \1 G9 _' [3 r
  19. echo '<pre>';
    7 k. M/ p7 R# ?, ]- Z. [$ t
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    4 j" `# C( ]3 |( B8 p; b$ N* l
  21. 0 ?2 c  C5 Y7 Z
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值: v4 S, n" K  |; e! Q6 N1 S
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    " r# k9 X1 a" L

  24. ) r: {- u6 C, q
  25. //$unset:删除字段/ f7 [9 \  n$ Y3 V) B
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);2 s+ P. \8 c# F& D1 k
  27. & C5 A2 S7 {+ }. M
  28. //$rename:重命名字段,若字段不存在则不进行任何操作' i& N' ]: V0 o, |
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 ?0 M# {0 n5 ~: u% y+ F# W$ q
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    & l& S+ _  }7 E* m+ s. h& h
  31. 0 U0 e# m7 b/ z4 \
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的0 d4 s. ]" H( s0 i
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);, D5 `& S! `' B$ k: N( B
  34. ( V) v5 B7 [& A$ `: c6 M/ r; Z
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! E% [6 v: }! s+ W/ p
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    1 H* U8 L1 a# `) a

  37. 3 F# |0 y  u  Y6 ^, ]" k, p/ c
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, d$ H& K( t" Y
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    8 h/ N! W$ b5 b2 L, e
  40. . L! {( p/ D9 I$ V0 L! T- l
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错7 J& Q, V* C! a4 c/ j+ c
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    7 B2 r+ F  _! Z, O1 f/ r

  43. / y! r. {1 s% S# D
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
      c0 |( ?+ Y5 M& t0 y; M
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);, Y4 W/ \" W1 g0 p
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' M' y1 ^; x6 ?  u3 B0 ~" P/ J9 _8 r
  47. 8 A2 f- I' i/ a* @& M! ~
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)% N) O+ s2 V; _/ Y; U5 _# j1 U% ^" K
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ ?# V$ c% o. e0 W
  50.   X& N& I5 a' Q/ R. s- p$ f2 b
  51. //$pull:删除数组中所有指定值5 h' A0 A; p- `8 \9 B
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    3 M# b6 Z. e* s' d4 y/ K, ~4 q
  53. # x  M0 w( G1 s4 M# b8 V$ d( d
  54. //$pullAll:删除数组中多个元素的所有值. X4 A  }4 L2 J
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()2 B6 ?8 u% h- [9 F
  2. //参数1:希望保存的信息数组! C* [7 Q* o" P: Q. {2 S7 J
  3. //参数2:扩展选项+ k, q8 b. m. w/ D' r
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ! {5 t' E$ C1 L* p# M/ L- H' e1 G
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    1 e% s' `  }, ~; ]
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。: x; {$ `% u6 J) H9 W5 U7 M- d! E) W
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间4 P- T/ [; u2 X9 C5 W
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    9 P4 j$ X/ O7 l& W! p
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    . A6 E* e# Y/ @3 l/ g' T: [' ]9 ?
  10. //若想更新则应该在参数1中指定_id键的值。0 U8 J% ^( z! M4 {6 R9 E# C, H; g
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    1 s, \% z& G+ T
  12. $db = $mongo->mf;
    " F6 r9 g9 K2 P9 p( g" p
  13. $collection = $db->friend;
    + w  k" s# X" [( H) L( \, g
  14. $doc = [//定义一个文档,即一个数组
    , b* n( o1 D& h0 l
  15.     'First Name' => 'Jet',
    9 [$ D! n7 C1 r: T2 Y
  16.     'Last Name' => 'Wu',
    ( a5 x  f% `" H; c
  17.     'Age' => 26,8 O: t  M) A! w* D9 Y& Q( Z6 K
  18.     'Phone' => '110',
    : x$ {2 ^" S  d* f& k. T- K
  19.     'Address' => [
    * d: y! z$ |4 ]# v7 g9 z
  20.         'Country' => 'China',. r9 s9 o" n5 V& }9 C
  21.         'City' => 'Shen Zhen'. L, i5 V: ^2 B; ?$ s5 E
  22.     ],
    % C, F3 W, l  `( ^5 }
  23.     'E-Mail' => [
    0 s3 G8 n& _. P; J- a
  24.         '123456@qq.com',
    $ \$ a2 Y& o# D8 B' v  b: }8 H
  25.         '666666@sina.com',8 x7 L/ T/ f/ i& r# |4 G' R- W
  26.         '8888888@qq.com',
    * r) M  `+ }. X/ f$ X
  27.         '77887788@qq.com'% k8 ?" c1 L. ~) C/ F/ l( ~7 N+ L! X
  28.     ]
    1 h5 k4 k7 m/ I' O+ E& L1 z1 }( W
  29. ];
    - y- x4 n' U/ z& W1 K7 W) ^$ Q
  30. $res = $collection->save($doc);" t; C5 m+ m; R5 M9 N8 N' C7 ?
  31. echo '<pre>';
    " }# P  U+ m+ y( P5 w8 v' x
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入! v: B% m& i/ ^
  33. * Q& C3 S2 O% S" L* G: p4 n
复制代码
  1. //findAndModify()
    ! s: w- @6 r' K4 ^
  2. //参数1:指定查询条件/ l. w1 B* H! o* P4 \( W4 H
  3. //参数2:指定用于更新文档的信息
    " A" a& O+ s# \1 @0 x  @. ^
  4. //参数3:可选,指定希望返回的字段
    : @& ], e" p; y7 n0 A2 k. c+ X" U
  5. //参数4:扩展选项
    , g! b  B5 Y0 G7 ]+ \% t
  6. //  sort:以特定顺序对匹配文档进行排序
    , C( _0 j! V0 p. X
  7. //  remove:若设置为true,第一个匹配文档将被删除
    ' q! f  V$ ^, o  n) B9 x
  8. //  update:若设置为true,将在被选择的文档上执行更新操作$ m9 {+ ^- g0 Q: L0 u
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档$ y  t3 `; ]! ]
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    1 m8 J; v0 i1 _7 ~$ S7 X% M
  11. $mongo = new MongoClient('mongodb://localhost:27017');  q, _+ t1 J* S1 Z% O6 b8 T) C. G1 Y
  12. $db = $mongo->mf;
      j: R" k, O  b) [
  13. $collection = $db->friend;
    2 @5 u: e% n# t4 J/ |& q1 o5 a
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    6 f4 y7 S3 Z: h! Q0 g
  15. echo '<pre>';
    ; a% E1 }3 l3 b1 @9 D/ h5 v, N
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()+ a9 M# ], n$ h& h- d; f4 H- W/ E
  2. //参数1:查询条件
    ! ^4 @: Q: {+ t- g7 u
  3. //参数2:扩展选项
      D9 S1 y, p$ a0 l( S& g
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除) w0 A5 [5 k) _  l
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    : o% R" m7 P$ S+ ?5 u- a# `; E- ~' x  Z
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作2 O& N/ n0 h& I2 \+ k' t
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    / E. c; J7 r4 Y( T) V, F
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ) m1 E7 S3 ~& s; n8 J5 O
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! |) ~& D: E, ?: P; P. S
  10. $mongo = new MongoClient('mongodb://localhost:27017');
      v& t6 V2 A1 D/ y6 g& X
  11. $db = $mongo->mf;9 @) I2 D1 D& h" I0 O
  12. $collection = $db->friend;
    . h2 m+ ?, e4 _, E* e+ y# P* G* w
  13. $res = $collection->remove(['First Name' => 'jet']);
    9 {* |( N1 v1 b+ D0 T1 L9 n
  14. echo '<pre>';
    2 ~" v7 d% M' y8 G" c0 W
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

' k, m8 Y0 b* [* n4 k$ [" v
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
! q7 H' N1 f, N) s; n$ w
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
  y6 Y) y% s) |' h" N
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 [8 W! H% H6 N( S1 i
  2. $bulk = new MongoDB\Driver\BulkWrite;) f7 H( W3 C! w9 ^! X! F
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    ( E  o2 l% s4 I1 q
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);* \" Q9 @# u" k' I( w
  5. 0 |2 \. _5 b% E- t/ M# s
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ S  b* L/ k, y+ d
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    " ]( m2 N7 K& p* M: A
  8. echo '<pre>';
    ) H  C1 _, O& |  e3 ]. F+ y
  9. print_r($res);
复制代码
6 r' z; I- A3 z/ Q
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');) e/ s6 I$ m( e$ }4 j. x
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* j) ?% U2 }$ k: {( c$ t' Z- ^
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    & N' E. |6 G) P2 D& P7 f* `

  4. 9 v& j8 ]5 C1 |" X; C( A. C
  5. $data = [];* v* b2 ?# A" B  d  x+ H
  6. foreach($cursor as $doc) {4 N$ V) {1 \1 M3 s& Y$ Q; Z
  7.     $data[] = $doc;
    $ q0 Q. H( C. a, f2 O
  8. }9 R' F4 Z: X/ \2 r1 c0 p4 k( n1 o
  9. echo '<pre>';9 ?( L  U0 Z  k6 U4 ~/ X* |  p4 J
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    - L  {; |2 Q" e* |+ Z4 b* ]! u, p
  2. $bulk = new MongoDB\Driver\BulkWrite;
    5 X$ ~# H0 h2 t" V8 ^
  3. $bulk->update(' h! }1 |" l* Q( M: g
  4.     ['name' => 'JetWu5'],
    & M" {, L; A- l4 h
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    6 l/ X* j, @* V$ G$ q2 i9 J" S
  6. );
    ! T7 s9 ~: {6 v, `; @4 f
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    2 b7 P2 Z6 C0 q6 Q
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    + U3 s. A) |, x2 b1 v
  9. echo '<pre>';# z0 t& w& B# V9 ~" K
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');9 J& k3 A% @+ t9 }4 k2 j
  2. $bulk = new MongoDB\Driver\BulkWrite;
    / ~- u6 S  E7 Z% n  O% P9 K9 B
  3. $bulk->delete(['name' => 'JetWu3']);
    , h& t( b) Z+ o* {% u# z
  4. $bulk->delete(['name' => 'JetWu4']);
    ! V! ~$ ^6 h* }" f9 }& ?& t' a
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认, g! c- w- M" N: a% {  n0 c
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" Z3 c* B  ^, ]2 E$ h
  7. echo '<pre>';; J8 u+ D$ w' ]3 J" `: k- x9 T# M+ J
  8. print_r($res);
复制代码
1 @3 e" Y3 p, e& {: ~8 l

( S% c' P8 ?4 j
6 W% ]9 X2 w; U! z

$ d4 _/ f& b+ h3 R
8 B9 N4 s, m- T1 C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:50 , Processed in 0.058267 second(s), 19 queries .

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