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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9686|回复: 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()1 I8 a4 U5 I) ~- l& c
  2. //参数1:一个数组或对象  ?0 g! N& F( H. n* S
  3. //参数2:扩展选项" q1 s' J4 [# Y: l
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘- c! w, m) O7 {  M: d# e
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    2 K6 K) P  ~; ~* I
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    & C& Y, s4 ?1 D7 D) m" B. Z, g
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' M# l( C# R3 a4 M6 n8 T
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    + y1 S# Q8 k/ l5 ], L
  9. $mongo = new MongoClient('mongodb://localhost:27017');1 \" z  R( B1 }1 W: W. K3 k& R# h
  10. $db = $mongo->mf;//选择数据库
    + i+ _( ^- Z( m$ l) u1 k, Y$ R
  11. $collection = $db->friend;//选择文档集合
    - r1 J- a3 X9 Q( M+ X; ^
  12. $doc = [//定义一个文档,即一个数组0 N& h  P2 p' s3 l( P) ]
  13.     'First Name' => 'Jet',/ V5 ~$ _! T1 ]9 f5 Y
  14.     'Last Name' => 'Wu',& t0 A( |8 m0 _
  15.     'Age' => 26,) T* W& A+ k) Y" ]
  16.     'Phone' => '110',/ K8 p. I3 u% l- M7 p# O- f! m# Z
  17.     'Address' => [" u2 {- s+ D4 y8 P( |$ h
  18.         'Country' => 'China',. _% ]) E4 [8 H; ?& \; G' p2 F
  19.         'City' => 'Shen Zhen'% T) n: ^( v1 G8 a
  20.     ],/ b5 J' ?. t. N/ p. _. D& c3 z
  21.     'E-Mail' => [
    ! T  X5 V/ W: d: B+ y; Y
  22.         '123456@qq.com',
    + F, f8 c' q0 h5 [9 v
  23.         '666666@sina.com',- r. [" [5 \. G3 h; z
  24.         '8888888@qq.com',
    8 U: _3 M! o5 y- l" e& `/ ^& c
  25.         '77887788@qq.com'' o9 G3 U/ [( o. N$ c% b. ~
  26.     ]
    : q- C. R% O& E
  27. ];
    6 W6 P/ _8 ?8 w, B9 J
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    6 [/ i+ ^+ q6 _4 ~# T1 {- q; u5 F
  29. echo '<pre>';$ e5 X) |9 _7 ?2 j% K0 P+ w( S
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne(): e7 l7 f/ W1 T& c& T
  2. //参数1:搜索条件$ ~, O) w6 j* N( B$ O! Y
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
      n3 L% b5 G& u" v* A% Y
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    & r1 P6 ]1 p" E2 V) `5 A
  5. $db = $mongo->mf;
    " u1 I2 F  H3 J" K2 ?2 @1 ]
  6. $collection = $db->friend;
    $ C: d4 R0 p5 t+ a* C/ f
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    : x/ W* Z# c2 b4 M. u
  8. echo '<pre>';8 {' {, H! J. t7 d+ B
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()8 f- f9 F% Z# B5 F% @/ M
  2. //参数1:搜索条件. y; l' R$ d2 @6 y# W5 S7 U. J  d1 D
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段5 M! K2 g( S* \' c" ^& F
  4. $mongo = new MongoClient('mongodb://localhost:27017');9 e& ]+ Y5 q% e4 V" C# h
  5. $db = $mongo->mf;
    2 I& q: Z2 v* f# F2 I
  6. $collection = $db->friend;
    : g$ ], K- q. Z
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素5 G( c0 s+ R" C, T4 ]6 l  n1 L/ y
  8. echo '<pre>';
    2 K' F8 q  v3 G$ `- H$ T
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档7 F  A: ~$ O9 u5 f- E1 o" |  `7 N
  10.     print_r($doc);; X! U. R9 m4 _* T
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' W# }( N, M4 k6 }' ?  R
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    " s0 b( @; i4 X5 F7 ?
  3. $db = $mongo->mf;
    + C' W2 [- [% K; T
  4. $collection = $db->friend;/ B" Z. m; q# {0 _+ A9 s
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);) s5 j# O/ h2 I
  6. echo '<pre>';1 f3 U+ t5 H0 `1 p  z' _; F8 a: v
  7. while($doc = $cursor->getNext()) {  u7 w  w0 }& Z7 o& O, j
  8.     print_r($doc);  f, T; ?9 t8 ?# z
  9. }
复制代码
  //查询某个字段的所有不重复的值
' P# v1 a, G' z0 G- f  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个4 y2 x3 Q( J& Y% f# R' A$ Z9 [
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    4 ?! k! O( \) m8 M: ^" N

  3. 7 }4 D0 l; R/ |6 i. u- y
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    ( {, V, e4 d9 t5 u3 a3 k
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    9 [5 T) E4 s4 D$ Z' r

  6. 4 B0 F, X7 Y2 k5 c  t
  7. //$or:或查询+ k' W4 a+ \0 D. l
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);' D8 y* Y7 z8 ]9 F
  9. / D" ]3 d" ?8 M/ \
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    + ]5 s# ]; H- T0 t: m) }4 {
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- g1 h0 M5 S+ W$ m1 n( ]
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    7 a1 k7 I& L$ o6 D; z1 z
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个9 z% g9 h9 O& m
  14. 4 B2 o' n5 J# |5 s7 L( X7 r0 K+ n
  15. //$exists:根据某个字段是否有设置值进行查询! ]- O5 U/ N" U  g
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档" W* D/ h6 {( L% _, D: z
  17. 4 @& ]* U5 z$ ~7 w
  18. //正则表达式查询
    4 _2 R( q, |, l' P6 T
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    ) s  z  d4 M5 y
  2. $cursor->sort(['Age' => 1]);! j! M4 r* f0 |) O! E: Z+ W* t
  3. ) w+ x4 F, A/ G! X
  4. //忽略前n个匹配的文档
    " D/ c: N( z) R  `
  5. $cursor->skip(1);* V  e7 y3 g, R, W9 e( h( p  F6 j

  6. # l. S6 r1 Q, B; K2 d
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    7 y; S$ K% c$ L. l. y& Q. B2 o  D
  8. $cursor->limit(1);% v. ^/ o/ A' S* k

  9. - a9 E. T7 T6 d* E% B
  10. //匹配文档的总数
    - ?2 E; Y! [$ y: ]( d
  11. $cursor->count();
    ; |1 A( z* g/ L
  12. 3 j! N6 ?: h: r( o# \1 y9 s4 H
  13. //指定查询索引
    7 B+ p8 I4 E% m# p8 S
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计# ?/ v7 U* A. s
  2. $mongo = new MongoClient('mongodb://localhost:27017');4 C6 v$ }* o+ @5 c( e' O
  3. $db = $mongo->mf;
    : q" \3 w- @/ n4 x/ H
  4. $collection = $db->friend;- {1 j1 p; }) |5 E% g6 G6 ]
  5. $res = $collection->aggregate([7 f& K: B  H0 v/ }6 ]' H+ [4 M
  6.     '$group' => [
    4 s! Q2 O" c; ~8 J2 d
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组$ L$ P& j3 M2 I
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    ( E- x% E! ?4 s3 v
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    / Y  d* j$ h/ j" w. q9 I$ A$ [
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    ) q% n% e8 s: I( ~
  11.     ]$ k$ C5 ?" ?" K2 Y1 p) i
  12. ]);* |7 @. Z2 {. {/ _6 W0 [2 A
  13. echo '<pre>';5 a0 w: y# o- w  Y  e6 N2 t
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    " m  e. D* v, h; b7 l1 P
  15. 9 p% H+ y7 S2 E$ R, v0 J

  16. ) K$ |- A5 ^7 h' z9 ^4 w* w8 B: w
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    1 ~9 P4 }0 M9 _% V' ]3 L
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    " T0 v( t' J% B& b9 \8 K+ ?
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    * Y, g: S( }7 I! R5 @
  20. $db = $mongo->mf;' b) \/ L: `: ]- v2 k
  21. $collection = $db->friend;. Y8 p( c* _; [
  22. $res = $collection->aggregate([
    " L0 n; N. E7 c
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    1 A! i' Z1 B& K7 J
  24.         '$match' => ['Age' => ['$gt' => 30]]4 t+ H; P$ I/ `; p! v+ }1 }
  25.     ],
    0 O4 y) }' y" ?- n# j  O; ~
  26.     [//指定分组字段、统计字段' x$ c  Q% q% m% F4 P
  27.         '$group' => [
    # h0 N0 f% w1 w) x1 g) g+ b0 C) A
  28.             '_id' => '$Address.Country',
    ' J# L  K  z7 o' h- ?
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    6 _$ f$ l2 O. k$ V; J
  30.         ]3 j( ~+ x! c  L, T' V8 u' x5 v
  31.     ],* b1 g5 \  ~$ O; H
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    # r3 ]& a' P! w; }- L3 n5 W; _
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    7 y6 F7 f7 V1 H
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    9 A0 ]& G& E: V
  35.     ['$skip' => 2],//跳过指定数量的文档* |- J3 O9 p& @" r$ r6 v8 ]6 U
  36.     ['$limit' => 2],//只返回指定数量的文档
    2 m! H% ^. c# @$ f- ~" F% f5 @
  37.     ['$sort' => ['totalAge' => 1]]//排序+ P  m+ Q" P: e" g6 I
  38. ]);, K7 Z5 q8 ~% w# w
  39. echo '<pre>';8 e* X. j* }* |% W, y+ M
  40. print_r($res);
复制代码

. e/ J& Q% g) K
三、数据修改
  1. //update()" ?& c( `7 f. E& h5 Y
  2. //参数1:更新条件,指定更新的目标对象。
    ; s. ^- _3 |5 r0 l
  3. //参数2:指定用于更新匹配记录的对象。9 `# L' q- {. o7 c) a8 E5 p
  4. //参数3:扩展选项组。
    # `$ A: I- P" p+ a  n1 c5 k$ Z
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    " E' m, `# u4 L8 i5 Q
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ) s) A+ Z  T7 t3 F
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% B7 R& ~. {; J2 T# ^/ u
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' a/ Q8 z' U% E! I$ O/ k: I
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- V) T" c  o; }
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    $ k8 q7 ~2 u, j
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)* v6 o, R! }$ E7 }1 p
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    . ?/ W! h# z+ ~9 I. D5 C  l6 S$ g" u
  13. ) V! D1 r9 B2 Q# M; p; M
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    : U) W& {: o5 j% L( D
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    & n8 q* I8 a* f7 E: E
  16. $db = $mongo->mf;, o* t* \; C4 @# p3 ~: O
  17. $collection = $db->friend;3 ?% D; s8 ]+ X  o
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);) T; }" V2 a, R$ Q* h
  19. echo '<pre>';
    ; k( `$ {; O  D
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量6 }5 t; T# x* D# l
  21.   R9 U* i' n/ ]3 l  J5 w5 U  P* N
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    - p  }1 c6 ?2 q4 I; `6 y4 v
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    0 y3 K2 @' o8 h' U' A
  24. - c$ W6 c+ l9 x$ U8 l- T
  25. //$unset:删除字段
    8 n1 ?" J( [# _& m5 w& o
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);1 V1 K' b$ ^. E  \$ I

  27. / @9 a1 m  X" L4 ?- M0 a
  28. //$rename:重命名字段,若字段不存在则不进行任何操作4 \% P& }- A# l  D
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
      H9 ?" ^" \$ l1 H  E0 r9 @
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。4 X  S- O! ]$ Y7 s# n% c

  31. ; n! k5 }- s* \  w! k4 Z+ O: H
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的: I4 \8 w+ e9 ^' W
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    % V/ |# T" W/ d$ m
  34. 4 p3 }& D7 _: q) P+ Q! J5 `
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错% C$ Z( |# N8 q+ x3 K
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    , |" N5 }1 P$ \* |3 P8 i3 g

  37. 5 K! L8 s$ h9 m6 R: g
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    8 ~% H1 G& H, Q4 G  g0 P  [
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);" [; A" y- [' X$ i- F# A

  40. / \; [' D6 b$ R$ p- M" a: u  L# s1 D% B5 ]
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错1 r; z& L' y; x/ d  A
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);5 k; i* y& z; P
  43. * s' L7 e3 ^' J2 y
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)7 s3 b: W) J" S
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);" I/ l& O& s- w+ v, C. n* [6 M5 [/ M# q) Y
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);4 T5 ]% L) N, r
  47. : f8 h6 |& Y) H$ E
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ V$ n4 {8 r3 m( v
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);$ D& H, z6 v! f( ~
  50. * Y3 r. `8 B8 ?/ I+ N* z
  51. //$pull:删除数组中所有指定值2 W2 X1 X0 [9 t/ h! f
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);3 j5 W+ E+ u/ d' s) w: n6 m
  53. , ~6 _9 o' b7 b7 j/ A
  54. //$pullAll:删除数组中多个元素的所有值+ D9 o% B% V6 ]$ k7 J
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    6 s) d! [, v( q" u' k2 R) u5 F
  2. //参数1:希望保存的信息数组
    ( @. \( }3 E% w1 H' d% H
  3. //参数2:扩展选项- k1 T( f- f9 l0 V
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    - |+ L7 ]5 X; {3 `9 |* n
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    4 P( s- i$ {' E+ o  @9 E; a# W
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    0 ]1 \6 h3 h; d; l: E0 Q# v
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    . B  ~& J, y5 ?9 _4 l% q
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    3 z  T- Z- _# p! H3 M* o0 B3 i
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    $ |4 p. A3 G) y$ E
  10. //若想更新则应该在参数1中指定_id键的值。
    " V  c1 H2 b+ w3 q: V! O
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    3 j. |) p: z- _& @' F
  12. $db = $mongo->mf;
    + k# Q1 {: ?; q1 {! M) [- Z
  13. $collection = $db->friend;% N) M8 J% J. G! I& d' `
  14. $doc = [//定义一个文档,即一个数组
    + x5 d- t' u" b$ I0 @
  15.     'First Name' => 'Jet',& c, u% {) W7 K; O+ v+ [
  16.     'Last Name' => 'Wu',
    ' V! M9 l& c* S5 a+ Z
  17.     'Age' => 26,
    + z4 K) e! M  s! t5 o( ~9 ^
  18.     'Phone' => '110',( S7 a& f2 m, P2 a4 e7 o
  19.     'Address' => [
    4 R, E; R8 O( M* Z) t9 I$ Q8 P& U: p
  20.         'Country' => 'China',
    & ~+ m* j  r" S7 t: V) S
  21.         'City' => 'Shen Zhen'7 b# P( C7 f* |, A% ]
  22.     ],3 ~0 m: _0 y' A0 [# l
  23.     'E-Mail' => [: I" H- Z1 o, O7 G* z
  24.         '123456@qq.com',  I* I7 p/ d6 c: [7 `( L" f4 m
  25.         '666666@sina.com',
    & t* ?/ w: ^* X$ _  q; w
  26.         '8888888@qq.com',
    ( @1 b+ s  K9 n, t: h0 w
  27.         '77887788@qq.com'
    2 V! z6 i" y2 V' q/ f
  28.     ]) F/ ]$ d% v" E; N4 G' I
  29. ];, o2 Z, v, `$ b2 a
  30. $res = $collection->save($doc);
    9 Y) D) k( y! J, S" B
  31. echo '<pre>';& l' U) s7 B6 j
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入5 n( j" Y: g9 |, E: v2 U% Y
  33. 8 {$ m$ P3 V$ v
复制代码
  1. //findAndModify()6 U: Y5 r; u. A2 D! A  f, X
  2. //参数1:指定查询条件. q  w8 x& i5 s$ y
  3. //参数2:指定用于更新文档的信息
    1 t& p8 K# W' n4 A/ d5 J1 W
  4. //参数3:可选,指定希望返回的字段
    0 |$ }, y7 D8 v9 s8 K% w; _
  5. //参数4:扩展选项
    & R! w/ a) X5 [2 V1 l
  6. //  sort:以特定顺序对匹配文档进行排序6 U  ~* J0 p( q8 G$ O
  7. //  remove:若设置为true,第一个匹配文档将被删除
    ( c$ j2 C$ M% {% R, J
  8. //  update:若设置为true,将在被选择的文档上执行更新操作$ ^6 ?5 o% h2 c7 p3 O/ u. O
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    ) F: z* h& i6 W$ ^6 p
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    6 j, c" Q0 z( r, Q- e" t
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    ) D6 `, l! p* C  r( v! a: \2 `4 n
  12. $db = $mongo->mf;
    $ Q5 V, t% {6 ]0 E* k
  13. $collection = $db->friend;$ N" z0 c) H" f2 Z! r  G8 e
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);" {  T; b3 }( j1 i
  15. echo '<pre>';6 |$ o! o5 {/ `7 H* o" s' n4 O
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    9 O1 e! u7 q) O9 G; Z; `! }
  2. //参数1:查询条件  ]' Q9 z& {- \+ R  p
  3. //参数2:扩展选项0 m: H, [$ V' S8 g& y# r/ y6 J" K
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    % W4 }$ K, e1 y! f$ B, Q0 J9 B
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, ^6 B  D, m3 j1 L) Q6 a4 p
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    + D' R) ~6 u4 m, j* d6 Y( Q7 n
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    - h) b/ X; x3 b9 E+ _& I1 y
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 |; g. O( Y5 u( ?6 \/ x8 z& o+ B
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    , J. S' d( g( N
  10. $mongo = new MongoClient('mongodb://localhost:27017');8 v" Z4 z7 N+ I% b5 G5 C- U
  11. $db = $mongo->mf;
    * g& |  d# f+ N1 ^' ]- @% Z# a3 Y. k
  12. $collection = $db->friend;* Z- N4 a! \. t7 ]! I
  13. $res = $collection->remove(['First Name' => 'jet']);
    : d# O- l* U1 Y
  14. echo '<pre>';2 I9 S& S, _2 t9 u8 s1 A. P
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

) Z, H  y) L% ?
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

- c5 @& ^& f2 b% G6 a. I- R
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

2 X4 b: g) _& W/ J: |8 K
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');  D2 j5 G1 [; P# S3 ~* c
  2. $bulk = new MongoDB\Driver\BulkWrite;
    1 P" A2 g* M" R- Z
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    : \5 M$ C; e1 Z, P2 B9 v; N
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);* i$ n, M& f, C0 b( ?  [
  5. 0 t9 `$ o6 u% d
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    & w  n* b% U9 i3 ^2 W6 ^# u
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);) T/ D: S/ y* [% @! n# e
  8. echo '<pre>';1 P. f7 k% {- g0 u" S$ e" E
  9. print_r($res);
复制代码

. i+ C. \# ?4 w  ^" K7 S+ Y
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    % d% D! i$ i: \  z2 [- d2 B
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);% R7 ]4 q& a! b" u6 Y* V, w$ S' p
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    4 ~9 ?* Z- x% H) u5 p

  4. 4 t. t) ]( J% J5 @) Y% Z: ?
  5. $data = [];
    2 j1 B- }9 A! h) y8 N7 Q, a
  6. foreach($cursor as $doc) {+ ^2 g, y+ i- c
  7.     $data[] = $doc;$ |! Y/ Z, ?* S) \9 o# M* O" G. ~8 A6 I
  8. }: H! \+ z' \, i" |5 n, Y9 [' E
  9. echo '<pre>';6 q4 h6 ?( c/ s1 I$ Q
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 z8 {( V3 x  Z% m- h5 w9 v: k2 K
  2. $bulk = new MongoDB\Driver\BulkWrite;0 V" _2 k0 i" X- o% w! c+ f- u
  3. $bulk->update(% r/ F1 C5 ~3 E" }
  4.     ['name' => 'JetWu5'],
    . y  S" M! _; J3 v2 O' J5 r  x
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]* R! C4 s9 J0 J1 q5 }
  6. );
    : |: W3 @' C/ b) G$ r4 |
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认2 ~9 Q) }  s* N. o
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ E! s. s  z6 ]; ~0 D
  9. echo '<pre>';8 b, r  a6 \( ?& F  |; Z0 C
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ( k4 k& A+ e6 s  n6 l
  2. $bulk = new MongoDB\Driver\BulkWrite;
    : M0 i# i& J5 e% E( k  N! \
  3. $bulk->delete(['name' => 'JetWu3']);
    8 N2 V4 z) G! I- \0 I& T
  4. $bulk->delete(['name' => 'JetWu4']);
    ! {. `- ]( Z" {0 O% u% _& g
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    2 M* m7 T$ ]" k2 I
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 ^7 W2 Y+ N1 t5 b  \7 i5 W  B' M
  7. echo '<pre>';% k2 h$ g4 h9 M9 k& ^9 u
  8. print_r($res);
复制代码

: B( k% k* h% }) K! T
. H' E+ T) U7 Z6 p
8 F! w8 a$ `3 t+ N- H+ k$ i
; G0 P2 R! D& p% K* l) O! q

% I  B2 w- @2 l4 l5 |0 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:38 , Processed in 0.123367 second(s), 19 queries .

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