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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8060|回复: 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()6 U+ K8 G4 g7 ~( u; e) ?7 I. F# u
  2. //参数1:一个数组或对象* z4 ?. ^% w) E. S# m! {
  3. //参数2:扩展选项
    9 F& c; E7 M$ ~+ `# M7 v
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    ; }* A0 b5 ~% V# e
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志2 l# ?( D" y1 u" y4 {8 ]# [8 q
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    * h& ^5 f, s8 t; f& ^6 x
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间% [9 U& u% W5 u; ]; J( i
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    " n( E+ e* a" u0 Y7 @% j
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    9 ]& e6 L* i9 ^7 d$ Z3 H
  10. $db = $mongo->mf;//选择数据库
      }: J" v6 T# n% }
  11. $collection = $db->friend;//选择文档集合
      E# k  m* f4 c5 w8 g; j* S4 g
  12. $doc = [//定义一个文档,即一个数组
    + Q$ b' h# Z6 S2 \6 F$ m
  13.     'First Name' => 'Jet',
    " l3 U- Q, p. ]+ Q
  14.     'Last Name' => 'Wu',/ g  k8 d! B3 J: s  @/ w4 ]8 M
  15.     'Age' => 26,
    8 y3 n  i  j+ k2 g/ j0 \
  16.     'Phone' => '110',% E9 g$ t( d3 E  v# X6 t
  17.     'Address' => [
    $ _2 b5 }  W. T2 ?
  18.         'Country' => 'China',
    . m1 o" ~' V6 F6 ]& x! B: H/ C
  19.         'City' => 'Shen Zhen'1 M& f# ]6 K& Y% d1 y" `$ L
  20.     ],3 x' {4 ]2 a7 z9 u3 u6 z
  21.     'E-Mail' => [
    0 M3 ^4 M/ Q3 _  T
  22.         '123456@qq.com',
    ! j, C2 ?$ S0 j1 L) F9 K# ?
  23.         '666666@sina.com',* X4 n  \" ~0 r9 N6 Q7 K
  24.         '8888888@qq.com'," G6 q9 @5 t9 s3 _/ X& t
  25.         '77887788@qq.com'
    / p( L+ A) z; p5 v; u: [7 F; {
  26.     ]5 e- P$ {. }. l  s% d: c
  27. ];( B& b+ |( A- @4 L9 N
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    + M' g$ n: H$ r
  29. echo '<pre>';
    , @/ S$ U) K; _% ~2 K) a; c
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    ' s$ l6 o( L* H) ?& ]$ x: D
  2. //参数1:搜索条件
    $ Z  e2 X: f7 z' y
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    ( O% ]; k  Q; P3 d( y" _+ S$ P
  4. $mongo = new MongoClient('mongodb://localhost:27017');3 o4 ]4 j% z9 H# v6 ~% }. c0 @6 K0 }
  5. $db = $mongo->mf;8 s- x% L& }6 t- A# o/ L3 k2 `( x
  6. $collection = $db->friend;
    - S7 ^6 {! ~- C9 G- l$ x
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    4 ]" a  W5 i5 P# q) O6 x3 Q) n' e
  8. echo '<pre>';
    0 J/ w+ @6 W! g
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    ; ]: o  m( @- D& {+ b2 t& P, G( F
  2. //参数1:搜索条件
    , A' i1 c: o  K. }; |' s9 K* |
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段6 A, ]5 @' N, S  e
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ! ~' d; A# G  K+ c/ p) R
  5. $db = $mongo->mf;
    ( X- s6 L  N9 q9 b% z5 Z8 v1 b
  6. $collection = $db->friend;% J: _; T/ M6 N, g9 t1 n
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    9 h: E' ~: \( X4 R2 `" F
  8. echo '<pre>';
    " K' l* H4 }7 u5 \- I# p8 S% _, s
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档2 }" F5 a  W# r: A1 g( g
  10.     print_r($doc);7 T: [: z7 d6 X
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    ! }- U, V" k3 g2 \) {- n
  2. $mongo = new MongoClient('mongodb://localhost:27017');2 o% I$ M5 E1 C9 `7 O2 K
  3. $db = $mongo->mf;
    2 w' H7 y' v; M& ]+ ?; w
  4. $collection = $db->friend;/ _  k7 x2 O$ k$ G
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    ' z8 f. |2 N( B* v3 _' a* @5 w
  6. echo '<pre>';
      P" l7 k* ]1 H4 u  x+ n
  7. while($doc = $cursor->getNext()) {$ W4 Y' j) B9 v4 m
  8.     print_r($doc);( ?. Y* F; p! y' I0 R/ l# m+ c
  9. }
复制代码
  //查询某个字段的所有不重复的值6 n3 a8 w* z" s( b
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个" r! J1 V- u' ~/ c2 M
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);( C' g; P/ X6 O- i! d: x  `# {

  3. 6 s' g  o- R8 L. X
  4. //$all:匹配多个值中所有值(用于数组字段查询)( \/ V$ a  p; `
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    , o; b0 Y' ^# `, |! T. H

  6. 6 f6 G! }  t; u" Z
  7. //$or:或查询3 c4 q* K; Y6 K4 v7 a
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    . k  I1 k3 h$ J+ D* e

  9. - F% X0 b/ U$ P
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    7 {$ z1 F- L: b4 `7 j. O2 Q
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    ! Y; k, N1 ?! S4 A/ J6 ]1 O
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    4 R4 U8 f" L) u: m
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    & e5 T: g2 d( p5 n
  14. 0 n" m- P  @# f! ~
  15. //$exists:根据某个字段是否有设置值进行查询+ Z/ O9 q5 `$ b! ~
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档: X" n& o% E, h6 Q7 v5 @& Z

  17. 1 M2 g% V5 R3 @/ G! ?
  18. //正则表达式查询2 t8 C; u) a* \7 ?) y% t0 U8 Q# ~
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序) V# ?" H) p, I/ I  u- U
  2. $cursor->sort(['Age' => 1]);
    ! ~8 q+ `# ]5 P3 u+ _. T4 ?

  3.   i3 A- x' W. P  I/ ^- `- p
  4. //忽略前n个匹配的文档1 W, K0 Q* u# F0 v  q$ x8 {6 v$ c. H
  5. $cursor->skip(1);
    ! c2 v$ {; M5 _( H4 V/ K
  6. % }! U& n0 K. t2 b
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能). g9 c! R( R: Z& n- C" E, b
  8. $cursor->limit(1);$ S' P( T4 e& a% r: }
  9. $ ?  E( U, @: e" e
  10. //匹配文档的总数
    : v2 t$ Y1 }  m6 ?" E
  11. $cursor->count();$ q- l0 H- @9 T( _, f% ]; S, q

  12. , k/ Z2 w9 \, V9 W
  13. //指定查询索引
    1 \( _% N7 \! h& z6 ]
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    9 I6 E7 C) p/ d
  2. $mongo = new MongoClient('mongodb://localhost:27017');: e, n5 r; e2 Q0 v3 [$ U: n
  3. $db = $mongo->mf;: Y& s% E. d3 o! Z
  4. $collection = $db->friend;
    9 n: t* O1 s% n- P) }' q
  5. $res = $collection->aggregate([
    0 A5 n7 e3 `$ \; P" N
  6.     '$group' => [4 L8 G+ ]4 B' @8 A( T! a2 X
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组/ E, |$ y7 J9 j5 }
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    9 i* n, J- A( O; |5 m/ G8 Y
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值( V) y  x% E& X. q
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    8 U% ^+ S( t4 U
  11.     ]
    6 d5 I+ d* a  \, z) G3 d  p
  12. ]);& \  h/ X& A! Z8 S  V- I0 y2 R0 T
  13. echo '<pre>';* ~" i% t: S0 s. _. R
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果, H7 |, }( `2 K0 K$ L; W  m& p

  15. + O" s+ Z, H1 t* h( s. T
  16. ! \5 {3 }5 e$ |" K5 ^9 t: [
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序; S7 Y" Q3 _3 A6 v) x# e0 f
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。2 I# t5 ^5 w/ d  f9 o1 l# _# x$ T' u8 o
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    ' K. u& Y& D4 @) g( N6 M
  20. $db = $mongo->mf;
    0 X" b4 Z! o+ W: Z
  21. $collection = $db->friend;+ }! r/ _  s3 E8 \0 O. t, c
  22. $res = $collection->aggregate([
    / J/ e  c& d& h
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 `2 u- L- b! Z" j3 Z5 ~5 r9 B
  24.         '$match' => ['Age' => ['$gt' => 30]]' {9 f; q/ D- c& A5 J# Y1 z
  25.     ],
    7 S4 i7 _) j; |' P2 m( N
  26.     [//指定分组字段、统计字段9 B: {# [- g) ~  }4 Y
  27.         '$group' => [
    , T  h# z. O* N( R
  28.             '_id' => '$Address.Country',9 j/ R# W& S$ v* s$ G+ ?: k% ?% @
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    ( C. O. ~. c" n' U' W: a5 h, C: ?
  30.         ]! x4 j/ [- S' O) g' {: s4 i& ~; i6 n2 G
  31.     ],
    ; ]) \. g. }+ k4 \
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    5 l  G0 K' r8 g( {6 K* ~
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    - \4 h8 e: j' ^; p$ ^: D8 r/ B
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名* P, z/ g# @: Y0 G' x
  35.     ['$skip' => 2],//跳过指定数量的文档
    & a+ C4 e0 l6 K1 O9 ^" V, \& ]
  36.     ['$limit' => 2],//只返回指定数量的文档
    8 `) {* j) J4 h, X0 i( u
  37.     ['$sort' => ['totalAge' => 1]]//排序
    4 {( ~+ \* T9 |# U, s
  38. ]);2 T' d: r: C$ O1 S6 I+ X! |
  39. echo '<pre>';
    1 o* k# Y1 U0 J
  40. print_r($res);
复制代码

$ v+ W( w/ z) r: |0 `# j
三、数据修改
  1. //update()8 ^, y5 Y5 K5 P# ?8 G: k/ o
  2. //参数1:更新条件,指定更新的目标对象。
    7 w6 g9 d6 Y0 J9 {1 @
  3. //参数2:指定用于更新匹配记录的对象。
    8 }: q6 j" C2 X7 I- g1 i
  4. //参数3:扩展选项组。1 Y) q. Y  j  Z) q$ C
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    5 L& h. Q9 O: u9 K* E' y$ B
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。1 n: A: k# ^! g; V9 J
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 ?( M# O0 F" N4 f& _
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 D' z1 f: h4 O, |/ H
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。. h. [! y, E1 V& z( U
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    1 x* t$ }: a6 c! M2 Z
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    4 y( i; I9 C. S6 S  o! h
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。2 J) A/ p3 n. Z1 m, q

  13. 1 f% q* i! o7 {, J/ \+ U' g# d
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值9 z  f; ]/ I5 w% p; A: t
  15. $mongo = new MongoClient('mongodb://localhost:27017');! G1 v: A) C+ ^7 u" C2 t
  16. $db = $mongo->mf;4 B+ e0 i5 p2 E8 b" ^
  17. $collection = $db->friend;
      [! N0 H9 Y4 i5 F" B% k1 W
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);% r; q2 Y- Z6 n3 U- D8 i
  19. echo '<pre>';
    , K, k- k' A& o$ t$ G% ^' b- G, R
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量+ k+ H3 Q' `( {/ Q1 `  n
  21. $ r+ }8 v0 W$ g# j
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    ) `, ^7 ?, G) r" o7 }6 b
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    ! j. G: ?9 B5 i1 w! z% h- m  h4 t
  24. , i& Z# l8 d$ R. @
  25. //$unset:删除字段/ P* W, k5 G' S2 g/ s
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);3 g# k2 L- b7 o5 v9 a, z
  27. " H$ X/ L7 ~0 D5 |" s9 g
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    " w, _8 N6 }( }1 x
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    9 m, _' p- \, e; J
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    3 F2 C0 X) ^0 ?+ f# }, S- x# @
  31. # _( G) \+ M6 \% ]
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * E7 ?" |- H$ ?3 n* J! `
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);( T! ^" }9 `" u5 l% X' Q
  34.   d7 A" ?; y! I. N6 K1 L
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错6 V8 |) h# m+ }( C. i
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    + Y) I6 h* Y7 M! X- B1 p5 S3 L
  37. 9 x- k' h, [  `% q! }0 j' y
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    , Y5 T* d0 D; {, c2 q% U( x7 p
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    5 a/ ^1 I# z* T7 t1 R- I& ]5 o
  40. * l& l7 }' T  ]8 Q
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错+ ?. o6 q* Z& X% T! y' y" k6 C4 _
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    7 Z6 U# b4 s6 F8 I( ?; Y

  43. ( }" H( j  a3 D# C* p/ t3 a; `
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    . s0 ^5 k+ N$ Z
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    ! q( D5 h- V! o, ^4 Q5 g: |6 d- ^
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: w/ X! E5 _$ m# y, y9 T& N

  47. # |1 O/ |/ ~7 V$ N7 v  [/ n
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    2 i8 l4 b( ^& o7 I# _
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);+ ]! W* |$ v1 I" q  v% e0 @; J
  50.   D5 X  O+ Y" _9 `8 h0 E
  51. //$pull:删除数组中所有指定值
    + w$ j" B( }5 j1 ?6 k
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    ! Y& M% O5 P  T+ k' H

  53. 4 [& |+ Z; i  R8 y8 T& ?
  54. //$pullAll:删除数组中多个元素的所有值' n' P9 V( F/ D: |7 J2 ^
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    7 s/ R' r0 @2 `$ V. P4 {4 _# R; o7 e6 s
  2. //参数1:希望保存的信息数组
    2 X: r7 l- |7 h+ Y
  3. //参数2:扩展选项
    ! I5 ?  Q: k, ~
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 i' E$ Z  M: v" @  V+ U" B) W( E
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    $ q' R9 c  Y- T: H( x$ w5 P7 I
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 t' _% R6 U" F1 a9 V7 x5 m& k
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ' D/ H* Q( b" h7 ]6 k
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒). Y: U' l6 Q- m/ B9 R1 T
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    $ g( j5 D1 Q4 U! Z- e% P
  10. //若想更新则应该在参数1中指定_id键的值。
    5 \3 D" b0 m# N
  11. $mongo = new MongoClient('mongodb://localhost:27017');" C  w" K( x# A
  12. $db = $mongo->mf;
    ' e! b7 S& L  T6 v
  13. $collection = $db->friend;4 e7 d: p% N$ H6 S- d
  14. $doc = [//定义一个文档,即一个数组7 a3 e3 l$ K! d9 S
  15.     'First Name' => 'Jet',1 W; W% f# R/ R' p0 Y
  16.     'Last Name' => 'Wu',
    ! y9 L: i& b- w) L
  17.     'Age' => 26,
    4 C3 K; x+ u' `! y  h/ i0 P8 }
  18.     'Phone' => '110',: N3 X# U, Z, x# X& W
  19.     'Address' => [
    " X* E" D# k1 T: d& k) G8 z: m
  20.         'Country' => 'China',' n) T) b: K* Z3 T5 @
  21.         'City' => 'Shen Zhen'$ K  O/ S6 {3 N% `0 t
  22.     ],
    3 |+ u( s; t1 e8 j; M% m+ h# ?
  23.     'E-Mail' => [
    . u& R1 L4 [3 b8 J6 ~
  24.         '123456@qq.com',3 ]9 Q! w: {0 Q: c: X
  25.         '666666@sina.com',
    9 \* H5 s) _) _) f* v
  26.         '8888888@qq.com',
    & \0 w& X' T3 n
  27.         '77887788@qq.com'
    . K! a0 z) T5 n7 o2 A* L
  28.     ]8 }0 T7 p$ r( G2 s! V/ q& |
  29. ];
    1 O' {0 U# C2 s. L7 D
  30. $res = $collection->save($doc);
    $ `: u2 q" }& \# N) j; x9 E
  31. echo '<pre>';
    ! L4 A2 H' Q" e9 n9 G
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入- L& ]  e9 }# s. ~3 p

  33. 0 g3 Q" D1 L8 B5 H  {
复制代码
  1. //findAndModify()
    ; j8 d3 }6 I0 a1 a  s
  2. //参数1:指定查询条件. m7 B8 `' f% @& u2 }
  3. //参数2:指定用于更新文档的信息
    ; Y" B- T# a" [) L8 S7 q
  4. //参数3:可选,指定希望返回的字段
    . Y; q& t- C! n8 Q: f) f
  5. //参数4:扩展选项/ a, P; Q. k5 s: V  m( C' W
  6. //  sort:以特定顺序对匹配文档进行排序( K. E0 G& V/ v. x
  7. //  remove:若设置为true,第一个匹配文档将被删除
    % Q8 C- C( Q5 m6 q) j# I: C( e+ @
  8. //  update:若设置为true,将在被选择的文档上执行更新操作6 h4 f! [$ Q. y  {/ g8 R: j" y
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档# w& p8 F! s$ ?1 K1 |
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档: j: m! J6 u0 F
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    5 Z) |2 s1 `! b9 g- N5 A
  12. $db = $mongo->mf;" N* [/ j6 H0 ?  r4 p$ r$ N
  13. $collection = $db->friend;5 ?( M2 `- M% s  B4 b
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);% _, N) W" r# J; I! o1 [
  15. echo '<pre>';9 m, W( W: ~0 R  n* J
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    1 y& L% Y5 V2 G% ]% L8 r
  2. //参数1:查询条件& @: h3 I) `  v4 r' l$ @
  3. //参数2:扩展选项
    6 W7 p/ b$ N5 h7 T5 a+ U5 _
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    / `/ @) ~- y& l" d- {
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& z+ f! w9 H" Y# {1 e
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    / B( a4 p2 W3 U! C/ \: @
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。# C5 k4 f8 ^( \3 @& X4 w2 B7 _. A. c* f
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ' b& t/ W; U$ a( c. Q7 J0 w
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
      J: n" M4 d3 J$ t! v. l* u- z9 R
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    3 I9 K1 m4 p& H: V' S2 w
  11. $db = $mongo->mf;2 M+ z# V$ b2 c' `  H0 X
  12. $collection = $db->friend;
    # O/ c7 }. W1 {9 ^( R4 q# w
  13. $res = $collection->remove(['First Name' => 'jet']);/ r4 ~- S+ Z- H
  14. echo '<pre>';
    - Q  h- H2 Q; @- `2 V! D
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
# D8 t; q2 m4 [7 A9 G: b
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

9 n& B+ ]$ M; F8 {
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
, V" M' J$ e! O! E6 h
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ n& e' U* U$ Z
  2. $bulk = new MongoDB\Driver\BulkWrite;
    4 F) h' x$ F$ r
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);0 F  z4 e4 X: M3 p) c" x; y  V' D6 F
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);- W' ^6 Z) `0 F1 v1 b

  5. $ h& `2 ?' r+ z+ H4 S4 u
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* X) N) M, X! [% z/ G5 w- g
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    0 Y) v# ?, D! P7 S  N9 }
  8. echo '<pre>';
    ' H0 V( p6 p  n: b. H! R
  9. print_r($res);
复制代码
$ s" l4 c9 n+ W1 E/ N; A: n- z, I
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');7 c! i% u6 H% s. v" p# `
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);" z, T. `. i2 _" V, s
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    ) s& p# Y2 t  H! ^
  4. : N6 S, [2 j  T! I1 l5 W
  5. $data = [];6 E, s) H" Z" w! g7 B
  6. foreach($cursor as $doc) {% n. M. H9 r# }+ g3 _1 b
  7.     $data[] = $doc;
    ) D& u6 ~, d: `$ r1 m0 K
  8. }
    ' j0 J* N5 Z7 c6 k
  9. echo '<pre>';
    7 a* j. Y- A/ a3 D; J: ~+ o
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');' G9 [0 S  @8 u6 ?
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 }0 s& ?2 Z2 d$ l8 N! ]
  3. $bulk->update() }; \4 |- z* O) Q. V) @$ {
  4.     ['name' => 'JetWu5'],
    : J# H: i; d4 z$ E
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    . a; d$ c/ W, X2 v
  6. );* E7 P' o1 k: I) ^$ G: Z3 W
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* o( X% @) l1 S" z! X/ ^' l- z
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);7 o( O( j1 L9 Z% }& }9 q$ r6 e6 P
  9. echo '<pre>';) e3 {2 w: W- I: f- S7 T
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    9 [4 D+ M2 h) q
  2. $bulk = new MongoDB\Driver\BulkWrite;$ ]% ?9 @, G3 y4 ^* w& y' {$ {
  3. $bulk->delete(['name' => 'JetWu3']);
    * C) J8 W; M8 ?7 H
  4. $bulk->delete(['name' => 'JetWu4']);. M+ V+ [* a- s+ }
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认- U- t5 M4 X! f0 D" n
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    9 q/ D& X( C. J: C$ `+ E5 m
  7. echo '<pre>';) t* Q$ P" v% }& D) {0 @% \6 r2 W
  8. print_r($res);
复制代码
0 w3 O! W% k) V8 g1 G& k& r, G
! f* s8 J/ o2 U# }0 a6 Q
  I9 y: b' S  b* I! T: ^2 ^$ ]7 P- D
6 ^; {# s# i- u5 o" T4 \

4 {: G0 X& \0 s6 L; ~* R% g/ Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 00:00 , Processed in 0.172105 second(s), 29 queries .

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