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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13074|回复: 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()8 ?$ r! {/ D* s! R  U
  2. //参数1:一个数组或对象
    * W7 `/ x$ r: V* E9 D2 c
  3. //参数2:扩展选项
    % M- w3 [' ]+ r3 }) C
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    % x, i$ W" X' u+ J+ p6 w
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志; Z# p$ {9 G/ x4 D; X1 n
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认, J% `+ y. i8 |* c1 g
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ; J) `9 J7 q% H
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    $ j/ X. X0 z5 R: r/ H9 q
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    0 e3 e* y2 ^, n2 I
  10. $db = $mongo->mf;//选择数据库7 `/ Z; r- J( k- h% W0 X% z5 G
  11. $collection = $db->friend;//选择文档集合
    ! {) E. {0 ~# g) e* P# q4 |
  12. $doc = [//定义一个文档,即一个数组/ N. X2 i* X2 `2 m3 J
  13.     'First Name' => 'Jet',
    3 A) Z% @: H9 }
  14.     'Last Name' => 'Wu',
      D+ m, \. K/ d* \/ m! `
  15.     'Age' => 26,0 F3 s+ j! |5 Y9 ~+ \
  16.     'Phone' => '110',
    1 K' p3 O6 E* q0 b1 d
  17.     'Address' => [0 `% l% I7 Q$ ]  X
  18.         'Country' => 'China',+ d1 |1 N. H+ f" _
  19.         'City' => 'Shen Zhen'
    2 E+ T0 _% k( b: v5 c" ]6 ^
  20.     ],8 v; t( _1 n  {0 j% F. l
  21.     'E-Mail' => [: N: ~3 Y) U6 j! ^
  22.         '123456@qq.com',
    3 y  ^' l5 S) G! h3 A3 H/ K6 i! ~
  23.         '666666@sina.com',
    0 O6 x0 K. Y8 `3 X. H
  24.         '8888888@qq.com',
    , o% g& V6 I, h& a6 p# A2 o
  25.         '77887788@qq.com'2 c: ?5 N$ F  h2 C, Y. V+ V
  26.     ]1 j; D* o' ]- r1 c8 a4 u: ^# [1 @; [
  27. ];* O1 q$ A1 k( O0 E
  28. $res = $collection->insert($doc);//向集合中插入一个文档, w- d% S& S& R6 p8 P
  29. echo '<pre>';* j0 [$ @9 U! d7 O; f5 b% q
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    8 p7 S: Y: v6 f- o: d' U3 Y- W
  2. //参数1:搜索条件* e* V$ M& t/ L8 L8 n7 o7 N
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    4 z( a1 ~7 P4 ?
  4. $mongo = new MongoClient('mongodb://localhost:27017');1 [- n% h+ H) H& _9 p5 c
  5. $db = $mongo->mf;2 _6 m, g$ C' f: R
  6. $collection = $db->friend;( M7 u$ n' G% o* C8 w  l
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    , j8 X- f+ M) N
  8. echo '<pre>';
    8 ?# l7 X6 u: I0 i
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    % q- j" W) d' U$ [% c
  2. //参数1:搜索条件
    ! Z' {, Y/ Z4 _* m$ n7 l/ q
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    5 C# a* m; }+ j' `  B4 `
  4. $mongo = new MongoClient('mongodb://localhost:27017');7 J# B& o' q, T6 Q- _( u
  5. $db = $mongo->mf;
    : ]8 P$ u$ X7 F1 C/ i# X
  6. $collection = $db->friend;
    8 D3 g& i' s% i, x
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    " A( T( E$ c# G8 E; j
  8. echo '<pre>';$ X5 A" b3 ]2 {- J% @/ V
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档, {6 [% h+ R. P' K
  10.     print_r($doc);
    0 c3 D/ k: g* m) Z8 w4 M2 H
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询/ X- E7 ~2 R8 U/ ^6 X9 u+ u6 E- E
  2. $mongo = new MongoClient('mongodb://localhost:27017');2 t5 _5 R/ X; \: p# _/ F+ m) s
  3. $db = $mongo->mf;/ l8 R! o5 G: E2 {3 ^# v1 E
  4. $collection = $db->friend;
    & V0 p7 I  a4 a
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    1 t* s7 t2 l9 _- M
  6. echo '<pre>';
    1 E2 `9 m5 S1 B4 j6 i
  7. while($doc = $cursor->getNext()) {$ _+ O7 H  B4 e3 D! _2 b# j
  8.     print_r($doc);3 o3 d0 z) a& @6 B" t
  9. }
复制代码
  //查询某个字段的所有不重复的值
9 f: U, Q1 Q9 g7 l: M. P5 Y* B- r  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    ! z4 t; {* {, F' |2 S) o
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    2 g7 B/ [% z! E
  3. 3 {7 s( l& f4 e% d& z% d/ F7 M- G* ]" v
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    + U' U2 l) Y. Z6 \3 q
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    ( M1 _1 g7 k& w$ E( _! S- Y& y
  6. . ~7 k, q& @6 _- J! I( S
  7. //$or:或查询" `0 N7 S: y# s- c" _
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);& T" w# e4 ?. E, v1 T5 ^, M
  9. ; g! F0 i1 x8 _0 J7 p
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    2 b. s0 E7 K. U) d, Q
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    ( @3 O$ r" K* m
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    & U' l7 D. L2 k$ n3 k( I7 A. _% }
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    4 {. C! z+ a$ d5 n" D. F

  14. 1 Q4 |# z6 U* _, r7 A% u6 r
  15. //$exists:根据某个字段是否有设置值进行查询
    " k# n# P5 U% {5 _
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: x1 U2 Z: e- g: K' w& t
  17. 4 b7 v; V+ S: @# o& N! J
  18. //正则表达式查询8 m4 {2 {. ^9 A; O
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序, C% ]$ r) k' f) m
  2. $cursor->sort(['Age' => 1]);/ g5 M' Z& V9 u* U3 `- _& _

  3. 1 r: V1 B, x; G; a, f
  4. //忽略前n个匹配的文档
    ! T" i& e: o6 o/ W  M6 n9 w1 {
  5. $cursor->skip(1);8 P( ]  l1 _/ S9 n; y0 p

  6. ; c: p  e0 ~# Q
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 j( t" O: u0 M- L! q
  8. $cursor->limit(1);
    9 Z$ F3 ~* L8 n% z: d4 B4 b9 C

  9. + m2 L+ i) m" k2 ]7 @
  10. //匹配文档的总数$ Q0 ^0 G5 n, T# X, C6 m" @: l
  11. $cursor->count();+ P+ A, x$ I; W. N! X
  12. % h; y+ M) H- T% t9 c  b
  13. //指定查询索引
    ' L  n5 P. J& L) Z. ]3 ?) h
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    # _& O7 @2 [8 o- o4 s* \4 p
  2. $mongo = new MongoClient('mongodb://localhost:27017');, e* J5 P8 x) f3 ?1 S
  3. $db = $mongo->mf;
    % b5 q8 S) G* M1 a3 v8 K
  4. $collection = $db->friend;2 S/ x: Z: A* [. c& e
  5. $res = $collection->aggregate([
    # ^* |0 t% A9 V( P' J* ?% I
  6.     '$group' => [
    * B# X" _: ^8 R7 ?
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组: ]* @5 h: \, G5 a  h, {
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1: o" A  |+ J! ?1 E+ z7 y, Y
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    $ d7 F0 D' s6 ?" e& E' j5 h
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    " `& W+ u( J6 t) u2 [4 `- U
  11.     ]
    + F2 w, q0 F& b7 c6 s8 z% R
  12. ]);( a5 s, t2 E$ ^& O9 e! Q1 @$ ~
  13. echo '<pre>';
    , E# L0 n8 ^8 U' I; f& P( l
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    7 f; [# a1 [, k) m# \) E! ^+ r8 R+ [
  15. & I" K: S5 H# \# L1 ~6 w& F2 m
  16. ( w$ l  ?4 D. f/ h2 j. B
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序" m  @& ]9 q) |: b4 x; Z6 m$ S* B
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。1 r' Q) z4 ?0 W3 k1 J1 U4 }
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    ! a4 w; ]1 I3 n; U1 {, N5 v
  20. $db = $mongo->mf;* }. g* ^3 W* L9 K
  21. $collection = $db->friend;
    / I/ Z  n3 S4 I+ V( M  o
  22. $res = $collection->aggregate([( p' H5 K- N+ k
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    - {3 V; B8 e% j2 n3 A! L
  24.         '$match' => ['Age' => ['$gt' => 30]]
    & h9 Y; O1 s8 P" N) g& m
  25.     ],
    $ v$ I$ j* b& v6 [. K' [
  26.     [//指定分组字段、统计字段4 u- X( Z& `* x. Y$ g& ?9 i
  27.         '$group' => [4 N) Z! q- B" e$ E; M# V
  28.             '_id' => '$Address.Country',
    , Q1 z1 C) J: D9 Q3 M8 R
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和6 g6 B  ?" }8 e/ H7 V7 w
  30.         ]0 ~/ e& r6 P- B3 k1 z
  31.     ],, ]$ n3 X( x6 E
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    ; p0 Q; k# a% Z( U2 o
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。/ d) B. U9 I; j0 k) s( _
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名2 d" M9 a$ [& S. T
  35.     ['$skip' => 2],//跳过指定数量的文档/ c/ Y: ^3 w% e1 W7 g9 x" D- k
  36.     ['$limit' => 2],//只返回指定数量的文档
    0 i! g! }' M  L# }, F- C5 ~$ B* O
  37.     ['$sort' => ['totalAge' => 1]]//排序  r& ~0 H" u, Q0 X7 J
  38. ]);; P. t; k  Y% P! y. p
  39. echo '<pre>';
    6 U3 f  f% o( K: y/ _. h0 B! `  t
  40. print_r($res);
复制代码

& _/ n" N8 S5 |( Z" g
三、数据修改
  1. //update()0 H1 F+ B( m6 M! }3 r' _3 T! ]( t; n1 h
  2. //参数1:更新条件,指定更新的目标对象。7 ^: Q2 ~. `; l" b
  3. //参数2:指定用于更新匹配记录的对象。
    ! m/ h% l  }4 l! h, ~; i
  4. //参数3:扩展选项组。0 B+ \2 n1 N9 S# K+ z" o
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    9 b8 X1 Z- Y2 h# S, r9 y% A
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。# ?" c8 n+ b7 W- V
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    & g% N4 L$ L; [3 f; A; n
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ) a: M' y) b7 v# e2 d$ L
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    2 X) a5 M- B3 {& J; b1 o
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    8 ?3 w# P" ?* [- e
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒). P" e1 D- R& @8 E
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    * @; p0 I6 {, |7 a

  13. 2 w. |( p" |# T) g0 |1 s
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值' u" Q- [) q0 Z. m' {  {# `: H
  15. $mongo = new MongoClient('mongodb://localhost:27017');2 K- ^: e1 M% z
  16. $db = $mongo->mf;+ b0 t0 x' [# k1 n7 @
  17. $collection = $db->friend;; K# |! i; r* J- S+ C) j/ J1 I
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);( t1 R; S5 j) K1 C/ o
  19. echo '<pre>';
    , e4 Y0 y1 s2 j! ?
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    3 _) A+ {: d! T* s( k+ R; _

  21. 8 A$ v6 c* N% L! v  y/ ~2 I
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值# z6 i9 ?2 \6 t! R
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    ' n# I. U/ Z: Y' ~+ \2 w1 j

  24. - q# U" \: Q# ]( Y! v5 ^! G
  25. //$unset:删除字段
    ) x; v0 P8 e6 x& ^) M; Q
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    + {$ U' O/ y  E4 x
  27. 9 Q+ c! P0 w2 r+ K( t0 m
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    / m6 P+ {  [3 x: {5 r0 P9 W
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 J; Y1 r4 P0 f* X6 C2 B* x
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    ; C. D5 ], \5 R3 _; U$ T2 ~

  31. 5 y1 L* A3 m- u. H9 d3 p) u
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    4 b! v3 {# {3 M3 [& l
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    ! c+ Z, E' G. X8 q! _: s, S

  34. 6 X7 x8 {* z0 Q' s5 P3 a
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ; l9 Z; c" [; s) |/ l# H$ B8 W* x% w
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);0 M3 i# W: r7 T' {+ |
  37. 1 e5 N1 [! s6 u  B8 g
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错0 r: l5 o6 D% j% T
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# a! R! y0 n, \/ A1 {# R
  40. 5 Q+ R! f1 l/ Z* l" o; Z3 f) @
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    , B+ }' u8 q7 ?$ f
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);# Y! [( ?# B* o; K" W

  43. ) o7 Y& Q+ ?) ?/ H1 Z+ C6 r
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    6 w) Q/ a4 q, W' `4 o
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);- K& u0 _$ K, m, F* z
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);7 E/ n6 U$ J- O7 c  F- Q; L

  47. # l# f5 ~: C8 C
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). n2 s2 }& Z) |
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);8 L8 @  L/ }$ H+ q
  50. 4 R$ t9 `$ \4 s  U4 F" b
  51. //$pull:删除数组中所有指定值
    ' M! ?4 p) W" V) X/ G2 b2 q
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    " ?" S/ x: i7 w- P. @
  53. " @! n2 V  \) H! R, s
  54. //$pullAll:删除数组中多个元素的所有值
    8 K3 d+ _: S7 a% a) E0 v
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    2 _; s# g; y; n/ R4 p8 m) J& ?0 T% l
  2. //参数1:希望保存的信息数组
    & _& i6 E. y4 f$ l
  3. //参数2:扩展选项
    % f9 R+ T* P' ?
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ g8 t/ w8 X( \" m& }
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作# \- j3 q1 S6 P; W! _. m1 Z
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。' t$ O3 L7 {: V: v# M% k
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    * }% a% K' j7 z" \  \  ]
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)1 n- r7 s8 Y, V! M- k6 [, }& F8 t; ]
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。& V9 n( ^3 O; M4 Q0 c  K
  10. //若想更新则应该在参数1中指定_id键的值。( u. P6 V: ?! ]) f  I
  11. $mongo = new MongoClient('mongodb://localhost:27017');$ A6 `& y: t9 y- y& A/ @* |, T
  12. $db = $mongo->mf;0 k6 y! c+ C6 `1 S. b
  13. $collection = $db->friend;
    + n& x8 I1 z/ {0 l4 \
  14. $doc = [//定义一个文档,即一个数组
    % w- o4 m6 R2 w9 O
  15.     'First Name' => 'Jet',  |% }: q8 }' e( c. `
  16.     'Last Name' => 'Wu',
    2 U& ?+ l4 B, B0 N
  17.     'Age' => 26,
    9 E7 M3 @8 {9 k' E0 m: `2 d
  18.     'Phone' => '110',
    # T6 ^% x- }# M  E
  19.     'Address' => [
    ' e- x) f  J2 i4 ^6 ~9 i8 c
  20.         'Country' => 'China',. s4 F" P8 S) \( `) W# i
  21.         'City' => 'Shen Zhen'! Z# ^; [% s6 Q( ]5 d+ w
  22.     ],
    1 x/ R( l8 q! r3 ^( ^/ ^' R! Z
  23.     'E-Mail' => [
    ! P8 @" X2 `/ V3 ]( }* K8 P6 {
  24.         '123456@qq.com'," ]+ E/ z4 m  e! X) X  k; _4 q, Y! e
  25.         '666666@sina.com',
    ( T7 ~4 t' @! P# ^. }5 T/ S. y
  26.         '8888888@qq.com',
    * J  p5 N5 N9 [" p
  27.         '77887788@qq.com'& G7 K% ^" {# c7 H$ O5 F$ K  h
  28.     ]
    + Z# j! F) w0 f* R) w7 W
  29. ];. h" Q4 {% y/ S( C0 b# _/ b  M/ ^
  30. $res = $collection->save($doc);3 K8 B0 Y6 Q: K: r  @% \
  31. echo '<pre>';
    : C" t" R/ F' V
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    : P$ T$ |; L. O0 i; j  b7 N
  33. 5 S: J! B: E* M  j4 _/ k
复制代码
  1. //findAndModify()
    1 o  l# y  U1 U- q- z2 f9 h7 E- B
  2. //参数1:指定查询条件
    0 n  v8 u4 Y& i1 ~. y. ?, ?- l% r
  3. //参数2:指定用于更新文档的信息
    % N; ?1 h( |  N( W
  4. //参数3:可选,指定希望返回的字段
    ( y5 L0 F3 D1 B
  5. //参数4:扩展选项  M7 R( O7 e, z3 c
  6. //  sort:以特定顺序对匹配文档进行排序# Y! s; m" v- g6 R$ A4 q. }
  7. //  remove:若设置为true,第一个匹配文档将被删除2 K. G( ~. \! n' t0 L
  8. //  update:若设置为true,将在被选择的文档上执行更新操作, [. p* j7 C$ F1 w
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档* r% x$ G7 ]2 @0 |
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档8 w1 J7 t: M+ _2 \
  11. $mongo = new MongoClient('mongodb://localhost:27017');0 B" F6 p' h  a" E6 u  q# j' d/ i
  12. $db = $mongo->mf;
    # K, C) H& l/ w' F) k! `  g
  13. $collection = $db->friend;3 {# q) K5 B. [: Q$ L" y
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    . D8 r4 o& o. h0 x
  15. echo '<pre>';
    . e! a% `9 T& S. E, w2 `7 T
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()7 y2 Q  _0 `) s) g4 V* f
  2. //参数1:查询条件7 @% C) r2 W0 \" @! T( ^; g
  3. //参数2:扩展选项
    / s- ]  i* x5 r9 ^* U9 x
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除; @) U" E% Q  g3 X0 ]3 A
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    2 x1 k0 l" n& X/ P! W- d- V
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    3 W9 {9 R4 B! B- L  W9 Y
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。( D' X1 K8 H& Y' N* e
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ( O5 {3 I: l4 S; O3 k% w* V
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    + U8 I1 \2 V  e; C
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    / Y, E, k0 u" r/ l% g/ I2 j
  11. $db = $mongo->mf;( w5 `% J: y6 J! V/ A6 j& s
  12. $collection = $db->friend;, O- I' y: T$ v$ M( X
  13. $res = $collection->remove(['First Name' => 'jet']);
    ( ~9 G4 x: h, i6 O9 d0 `  z( a
  14. echo '<pre>';
    & L+ T& Z: L* q. l% ^& Y( ~
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

+ m4 t7 R$ B; L8 }7 o$ Q$ S9 H- c9 o
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

& Z, t+ z; {3 z/ y
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

0 i( U4 N) H0 n
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    , V; W. Z9 v! s* Q
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ' Z( C/ t& I* ^3 o- E# A
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    0 X6 M0 A% a" f
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    $ [* i: c3 v$ L# _" |
  5. / L" _* Z& U" H5 U. p  t! P
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    4 d) L/ u8 P/ ]* l# l
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ) @5 m, W& I0 `# W, I
  8. echo '<pre>';/ X7 G) z& c7 w
  9. print_r($res);
复制代码

1 r! w9 S( @5 _  C$ D
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    0 e! u1 R$ E0 y, V
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);  K! R* }+ ^3 Z* j# X
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    1 n# @+ P5 T2 C+ @  Q1 j

  4. ; l$ p$ v8 {' J, N# f
  5. $data = [];. W, n& ^& @$ E- v4 O3 v0 t
  6. foreach($cursor as $doc) {
    : `! G% x7 k- _0 L
  7.     $data[] = $doc;
    4 }5 L! G, h" D) L8 v( N# a
  8. }3 h; O. O0 q- `! t/ P1 i2 [$ ^
  9. echo '<pre>';
    0 f  E1 m  E% B" x
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');, _4 x5 F5 m  x7 u: |5 p
  2. $bulk = new MongoDB\Driver\BulkWrite;
    + r1 B* M' Z* K9 P# j- _
  3. $bulk->update(9 D* E  Q% @% w; y8 |  @
  4.     ['name' => 'JetWu5'],
    " Z3 M5 f: z* R1 [
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]" C% [  O( t$ W
  6. );
      b& \# k; K, C- j7 i5 F7 @/ ]8 Z2 y" K8 |# E
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    3 {; V! q5 G- t
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% H) f! Z0 ^5 w
  9. echo '<pre>';
      H- @% h' A# w. W9 v2 v
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    + h+ i5 o5 m+ l! E- P( _% k! _
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 c5 u' ?$ O* X1 t8 I
  3. $bulk->delete(['name' => 'JetWu3']);7 {- E# c7 }9 |0 v4 t/ G
  4. $bulk->delete(['name' => 'JetWu4']);
    1 w$ x' R8 z' e% \: B5 E" W( Q
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认6 Q* m+ |5 _* I, [
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);" R% L/ I+ `8 b' j( Q/ C) l8 X
  7. echo '<pre>';
    . ~! z/ ?3 }) d' Z$ a
  8. print_r($res);
复制代码

% z. `5 P. u9 i3 q
) C4 S- x  M$ m  O, K& d  q8 X4 ^7 T
/ l' G% w# p, Y
# g6 e" }" O/ G( _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 02:56 , Processed in 0.061850 second(s), 22 queries .

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