cncml手绘网

标题: PHP操作MongoDB(增删改查)php7.0以下 [打印本页]

作者: admin    时间: 2019-3-5 13:50
标题: PHP操作MongoDB(增删改查)php7.0以下
  MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。
一、数据插入
  1. //insert()
    , o* x  o5 p) t; u5 H# X! W
  2. //参数1:一个数组或对象
    4 `. ~. Z! q$ l9 z8 ~* S) q
  3. //参数2:扩展选项
    6 ~8 m  H: M! m7 e$ }' h
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘( k% I1 \) h+ j' G
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志. O) T# O) _$ q
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认+ {# c1 K4 d( ?. T$ g: b" ?
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间! i  g3 ?8 J5 w: @
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒); J8 t, e- |- S
  9. $mongo = new MongoClient('mongodb://localhost:27017');8 _0 {8 e: c5 k0 F
  10. $db = $mongo->mf;//选择数据库
    % f/ A; Z) Z$ R/ G8 }
  11. $collection = $db->friend;//选择文档集合
    1 c% f! u9 f- c6 q4 o+ B
  12. $doc = [//定义一个文档,即一个数组& R, u0 [1 s7 P3 ?' D
  13.     'First Name' => 'Jet',/ R& |, Q5 i3 \! C8 z
  14.     'Last Name' => 'Wu',4 C4 j& s6 V( O& T) Y+ I8 u) I
  15.     'Age' => 26,
      {$ }$ o: H& C
  16.     'Phone' => '110',
    ' m; e# i* W, o9 [( e( ]
  17.     'Address' => [, J8 W8 o) D0 E/ c
  18.         'Country' => 'China',
    2 L1 Q4 `5 s2 @) Z9 s$ P
  19.         'City' => 'Shen Zhen'4 D2 Y2 j# R- Q: W% i
  20.     ],
    : @* T3 L; J+ T4 }
  21.     'E-Mail' => [5 f: O1 G8 Q  j. b' z
  22.         '123456@qq.com',& n/ \5 A! p. u
  23.         '666666@sina.com',
    3 u6 K' D0 [' u" H) [0 X) {
  24.         '8888888@qq.com',
    ' n: \' ~& @! I3 b8 P  P
  25.         '77887788@qq.com'! R3 A( N% z6 U9 e8 L6 |3 ~7 j" j. n) T
  26.     ]1 E; {2 P. l8 v0 R# B* w9 v' e
  27. ];! L' ]. e$ ]6 {; I. {" e& j
  28. $res = $collection->insert($doc);//向集合中插入一个文档& g5 H* I) }3 o% o% S- ]3 X
  29. echo '<pre>';0 g! c) k9 l; o! J6 I
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()$ K2 Q; H% _, ]0 D
  2. //参数1:搜索条件
    . ?1 f9 Q. F3 Q- s1 W
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段% `5 w- v' N2 c$ j
  4. $mongo = new MongoClient('mongodb://localhost:27017');( y8 S0 v0 p' j2 }, R3 b, w: u9 N
  5. $db = $mongo->mf;( u: w# k$ g0 n
  6. $collection = $db->friend;
    1 R5 |/ D0 r7 f. r5 E8 l
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    $ t" T. y- r! u* Y
  8. echo '<pre>';
    . T1 v6 u+ N, d" m7 t
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    2 t! P- p8 f4 _; O  T1 P
  2. //参数1:搜索条件6 k" v1 c7 }" j3 e+ L
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    + M$ s9 y; |: r( M4 J
  4. $mongo = new MongoClient('mongodb://localhost:27017');% W7 T# N; d' w% \" F) A$ P$ K
  5. $db = $mongo->mf;2 m1 ]7 B! Q( r0 d* c
  6. $collection = $db->friend;
    8 B" F+ d/ e8 B8 n3 ?
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    ; C/ a* Q2 f9 ]' [
  8. echo '<pre>';
    ' P4 K5 L% Y+ j! ?! o4 [
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    + t+ m: U3 T% _6 _) r( A7 f% S, Y2 }
  10.     print_r($doc);
    ( J) T; J- z2 O' d
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    : P7 [6 }0 [+ m9 s2 T
  2. $mongo = new MongoClient('mongodb://localhost:27017');) c9 Y& ]& y& e% D+ {: g
  3. $db = $mongo->mf;
    + G. ~9 D% S5 k9 z% e6 a1 Q7 t
  4. $collection = $db->friend;
    " M! _8 c! l7 |4 H
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);4 h4 H6 Z4 l$ @: i: k8 [
  6. echo '<pre>';1 \' ?' h! [8 f, W' N# ]
  7. while($doc = $cursor->getNext()) {6 r6 ?6 ?/ g& d' f- s
  8.     print_r($doc);
    * u8 @( A" r6 ~
  9. }
复制代码
  //查询某个字段的所有不重复的值
# ?. {- M! H0 ^% {' g9 Y5 J  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个( B! ~& l3 k' f' K- ^, Z6 U
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);- T& a" N# m. W3 \0 H0 M* V
  3. : Z" o# K7 f6 I
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    . e6 G% d7 T" n) O  D( p
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);- {) M/ A+ z4 v; r$ k4 }0 L
  6. % e- F% o, a6 x" L6 N/ u
  7. //$or:或查询/ {% D. M% j$ z- N
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    " f7 E/ p  v  V6 M& t2 [* p
  9. . g; M' K# @" w9 C+ C
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中+ L! W& k$ X- Y( q! O
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- [3 P- E. A) d8 m; E+ L$ `
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    * W( n& a; V4 R4 O; _2 m
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    ! g3 }4 R* I+ i& {/ X
  14. 6 E; r1 }9 d7 O0 ]4 M
  15. //$exists:根据某个字段是否有设置值进行查询
    6 b- y, @7 E+ ]& g- C
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    & j/ ^9 O! R% w4 F
  17.   F% b+ {( ]; w! O% M/ \# ~- u
  18. //正则表达式查询
    5 [7 x: B/ I/ @% I7 x: R- U5 _
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    6 v. C4 j/ R2 n0 K7 i
  2. $cursor->sort(['Age' => 1]);
    1 d8 Z8 t/ c. }  r- z! I

  3. ; d$ o' D' L; q/ e! `
  4. //忽略前n个匹配的文档, N" H4 h% [2 _+ p
  5. $cursor->skip(1);) f( B8 ?0 a4 X& X/ K; Q/ O

  6. 1 j8 H) A) o( S9 N# \
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)5 h/ c4 `% {/ y
  8. $cursor->limit(1);
    - S  V, B2 n/ `7 |( G+ d

  9. 8 w0 k7 e( a3 L3 K9 i8 X( Z
  10. //匹配文档的总数8 p, v$ V1 [8 j
  11. $cursor->count();
    ! J1 I7 v) O% I$ X+ \" u$ p, Y
  12. & }# u0 y9 D; ]/ R$ p: \' Y
  13. //指定查询索引' |+ f" M" F. `& r$ D  i4 f
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计. q* I/ m' ^  y6 I6 v0 a9 C8 q
  2. $mongo = new MongoClient('mongodb://localhost:27017');% [1 X, }; V9 U! a0 E+ u
  3. $db = $mongo->mf;9 V) f# a/ C# ?% X
  4. $collection = $db->friend;
    7 P" r, X6 e% X% N
  5. $res = $collection->aggregate([
    ' d( M2 x& }3 M- `) }8 z
  6.     '$group' => [
    9 q4 F9 j: e0 i
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    ( B% C6 B( M( a+ j9 R
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    " A8 L: W7 U0 L
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    , W) [9 p2 d8 U: I9 B+ I& Y
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    - Q9 E$ Q% |8 _# Q4 y8 }" ^
  11.     ]: j- b& v+ q& t0 A
  12. ]);1 u9 t2 x2 n2 k
  13. echo '<pre>';
    ( G% |3 r, o; N" V
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果5 E% m' @8 |0 @

  15. $ {2 }& a+ S2 _: i' p" E7 ?

  16. & p& g1 `4 d, j7 G! }- u) Y
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序; f, A6 d  b) O+ u
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    * |, R+ Y6 e- v. l1 Z1 X- ?9 F4 y
  19. $mongo = new MongoClient('mongodb://localhost:27017');3 H% N& f# j4 b* T% K9 B; j
  20. $db = $mongo->mf;3 M7 g4 w, v. x+ ^
  21. $collection = $db->friend;
    7 g2 e7 G6 X' R, s4 o, F6 j
  22. $res = $collection->aggregate([% [8 p( o. n0 P4 h4 `, b
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档2 i0 {, o  ]6 p5 k+ T; e7 \
  24.         '$match' => ['Age' => ['$gt' => 30]]
    ! i' p( T/ c3 R$ W- j8 V
  25.     ],& y$ e+ Q& O% n) G2 V3 L
  26.     [//指定分组字段、统计字段
    ' m. h/ H5 n5 h: A( \) J5 D- ^' [
  27.         '$group' => [
    * X6 n6 b6 f" y/ p; e3 E3 a% S% \
  28.             '_id' => '$Address.Country',
    ' Z" m  P& n, H8 G
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和) v; N0 ~$ j, s
  30.         ]
    ( m$ J# H% q7 [3 ~+ _" Q
  31.     ],
    ; N. e& f8 L% R- k) ^0 P0 V
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    ( F# e) B' v% A1 a( ^6 L+ Y7 Z: `
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。4 L) n3 C6 W* i' y4 {
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名) z5 S+ t, k: a" ]7 o4 C
  35.     ['$skip' => 2],//跳过指定数量的文档
    ) @& U  o4 X; d# j, s
  36.     ['$limit' => 2],//只返回指定数量的文档$ F# @/ Y7 j" ?1 z  v8 R
  37.     ['$sort' => ['totalAge' => 1]]//排序* X) M6 t4 L9 O. x% m) u
  38. ]);
    . X  B, m3 V: B
  39. echo '<pre>';- {" v* q/ Y& j5 p
  40. print_r($res);
复制代码

! @4 K" s& z; c7 ^( J/ Q5 |; l7 L
三、数据修改
  1. //update()
    " l4 Y' d: z. Q/ G) F
  2. //参数1:更新条件,指定更新的目标对象。6 T/ U1 q+ P. K3 R7 p& v" ^2 J6 w
  3. //参数2:指定用于更新匹配记录的对象。
    / _1 w7 p3 D2 i$ {
  4. //参数3:扩展选项组。/ [8 n0 [3 }/ @9 @5 ]; o
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    1 B8 |+ |4 u" U# h' I
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    6 I! K) c3 s8 O
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 ?/ C- L6 b5 i# [1 `7 \" `
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ' W$ t3 W8 c8 b4 K
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- f" w) _( i% X7 S  [8 x
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; A0 B6 ]" |; {/ d8 H9 z2 V: S
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    8 {. U8 H) [% \6 j; r$ a4 I
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    4 c7 m+ f' j; |1 i5 x5 D
  13. % a9 W8 }$ L% r0 z, A. G( B0 {, i: X
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值( _) f/ D3 S' L9 _
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    3 D  g, t  r2 A& o* P+ K# V& G
  16. $db = $mongo->mf;
    4 i1 c. Z- I( l* I
  17. $collection = $db->friend;/ z/ a. f& x+ j; c6 w
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);7 ~, T, V' K% Z) P4 F2 r4 X
  19. echo '<pre>';
    4 {. X9 G1 }* x% S# t& e+ F* f
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量5 X6 t- N( S' H- r
  21. " b+ F( u( r. m6 o) O" z
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值) k- z0 W' M0 `5 i
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);2 e8 {: ]& G+ R( n3 f8 \* }

  24. " N9 x: O8 ^9 f) {! S$ d# P- j
  25. //$unset:删除字段
    # B7 I8 {( J, s& J: J6 O4 S) Y2 A
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    $ |( d+ G9 y2 k- S! d
  27. : ^* D. |1 l5 z( F* h- w
  28. //$rename:重命名字段,若字段不存在则不进行任何操作+ X- {  J* c* u# J6 l5 `1 U
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);, V3 b8 p$ `7 _- d5 X) h+ P! D
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    ) v& f. E  w5 s; h- N: q8 @

  31. 4 q. x9 ?. h3 B+ J- Z8 m1 N  l
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    0 P0 @* r' P9 D
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    6 e3 F  e+ f- A
  34. . G( a! ~: m1 [. U
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: J# E- n# F; l. R! |
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    - F& N, s& `' x. E" j. F9 W
  37. 6 M% }- q% Y8 }# v0 @7 Z7 v3 h
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错- N  E- k  `# ]8 }  y  [
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);: p$ f; G8 y6 N4 h7 i. r

  40. 9 k! T' @/ @$ K5 |) k$ K$ J8 u
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错3 {' u/ P) a: R0 h9 h
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);+ N7 V2 ]$ \% ^* o
  43. 3 R! k! Q* Z  e) X% Y
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)' Q4 j) h' z7 d- O, F
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    9 E8 Y; @5 O4 k8 U
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);6 J( p2 T- P8 r# ~5 w5 J' `1 |# S
  47. & d" M& `( n9 `/ q  k1 V0 {
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    ( H' n$ S- d6 K" C  f, R0 j8 h
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    ( h1 Z+ n8 U# ]4 c! e2 s
  50. , y/ Z/ ~4 H# x0 D% K" n1 ^, C* E
  51. //$pull:删除数组中所有指定值
    # r, k+ A5 M. C2 r0 O' k7 ?
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
      T- o: y, b- E9 F
  53. $ A3 j- y) h$ `/ T2 y$ n
  54. //$pullAll:删除数组中多个元素的所有值6 n# @5 N6 o/ n' Z1 D: A
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    5 S# ~; T: o! a# K
  2. //参数1:希望保存的信息数组1 H& o9 w; W, D8 I! |) n
  3. //参数2:扩展选项
    ; S7 t1 }. ~+ z$ K
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ! e; ]! ?" e- z+ s- x2 ?& J! H8 C
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    + S, l' k+ G' ~  N6 o: R
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。5 P! L: b! N- i! [2 C
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    , p2 o6 A! h  ~( ]1 S- P7 X
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)7 k: @5 w* _0 `
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    1 t# M2 V/ A0 c& P  V& d
  10. //若想更新则应该在参数1中指定_id键的值。2 P' s6 V" @8 X/ M; q+ o% J
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    6 s" M" Y" v- q" A0 N
  12. $db = $mongo->mf;
    0 f9 Q5 v! w; |- Y) |
  13. $collection = $db->friend;
    8 x% K( p0 o8 Z# U& Y. p
  14. $doc = [//定义一个文档,即一个数组
    ; J/ U: ~6 Z' R  O* A& {
  15.     'First Name' => 'Jet',- D# T4 j$ J3 r8 u3 E
  16.     'Last Name' => 'Wu',
    8 K: \4 F$ C7 X( I' C0 x; w
  17.     'Age' => 26,
    / \* p! {% c% s) _. u
  18.     'Phone' => '110',
      y6 C5 o  [! m& Z- s( ]: p0 k
  19.     'Address' => [* r; l3 M+ d" [8 |& r; v7 ^
  20.         'Country' => 'China',9 m4 h; Y) `0 `* O3 z, X
  21.         'City' => 'Shen Zhen'
    ( f, ]0 o9 L8 h9 A4 `
  22.     ],4 O% L$ {- b8 ]/ ^  T: f8 c- K
  23.     'E-Mail' => [
      T" M' Z2 n- j; y" ]
  24.         '123456@qq.com',) `+ L9 }9 `$ |& h1 e
  25.         '666666@sina.com',& q, R& h) S3 i* V% N
  26.         '8888888@qq.com',
    1 `% O/ [! D& ?  v) j$ ]* x0 P" s
  27.         '77887788@qq.com'' j3 }+ E1 B+ p' ?1 e1 S
  28.     ]
    4 G* z$ s3 a0 h
  29. ];8 _3 H4 M# G  d' P' d0 a1 r
  30. $res = $collection->save($doc);. {' m6 e( a. T' Z
  31. echo '<pre>';+ B& |: ?) x$ w* ^* O  b
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入$ L. N  @3 ^; I& ~% j  b% ^

  33. 5 x& S4 H' l* p" j
复制代码
  1. //findAndModify()! Z# v2 M5 W; m; g$ }, X* j
  2. //参数1:指定查询条件
    + h! z/ l+ `' g+ ^0 |* |
  3. //参数2:指定用于更新文档的信息
    / V' d5 H5 V$ f7 _2 B
  4. //参数3:可选,指定希望返回的字段
    + @  y  M  N9 V; }4 \2 n
  5. //参数4:扩展选项
    % F3 a+ Z" T1 s- r" Z& m
  6. //  sort:以特定顺序对匹配文档进行排序
      S0 }( X; L0 T3 m( I- N
  7. //  remove:若设置为true,第一个匹配文档将被删除* _, u$ ]  M- e: E' a" ?
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    ; v- K5 D/ c! _% N! d9 v( c
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档7 L9 ?  P0 C1 Q4 j& D6 Q
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档. p0 m, b1 u; l) g; U1 c( Q
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    / j( \* Y' H2 u2 Z) K* g
  12. $db = $mongo->mf;3 \' q  w" l5 b  \7 w$ Q5 V
  13. $collection = $db->friend;6 I0 K; j) M+ R' s( \* [
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);" Q0 N" \. ~/ r+ m* y9 i. _
  15. echo '<pre>';- x9 o# j' J5 t
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()* y# r2 A. z3 i9 Y6 f& `: v
  2. //参数1:查询条件
    - K1 p" R6 I% L  F
  3. //参数2:扩展选项
    " Z6 _) ?, N+ a) }0 C
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    ( z& F$ N5 y0 C7 ]4 t( c$ M
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。8 _! x2 d5 ^' j7 m+ j8 R3 W
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作) n! t6 l9 Q! ?: Z# F
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ; u1 s; h8 g7 b6 `8 B- n; n( i
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' H# y) x# d% {, e- c" @9 y3 ]
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)9 E1 \* R& \. s% {/ A, l9 v
  10. $mongo = new MongoClient('mongodb://localhost:27017');+ r( Z5 U% ^- Q" Y/ P9 P2 |
  11. $db = $mongo->mf;& X/ T! R* T& {: r$ D. B
  12. $collection = $db->friend;* n( u3 c4 c( V* [' z
  13. $res = $collection->remove(['First Name' => 'jet']);) ]# G& u7 X! O) N8 [( q; U1 F
  14. echo '<pre>';
    4 T! R% ~3 S9 D4 p# H
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

; c/ k$ I( W+ Q) T8 ^% r
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
6 n7 s; ~$ ^3 B! Q4 Q
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

; a0 |3 l2 T% \1 T& M7 j  Q
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 b' T; N0 d. L  p5 F
  2. $bulk = new MongoDB\Driver\BulkWrite;0 ]2 X- U1 w; v; X4 h- @6 s4 a
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);6 o7 `+ m/ k* m  f+ r
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    2 X1 r0 H" o# ?( z; s; l, ]
  5. - L0 ~9 X5 Y( f3 T% m
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认* T* U- h4 T% C; p  U- q
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);$ o" h6 ]8 d) c' P0 b
  8. echo '<pre>';
    ! c! e8 ]% \& o4 K% x$ w+ }9 X- I; \
  9. print_r($res);
复制代码
) n$ L8 @$ E- N$ Y! q+ q
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" m# w0 j( o6 ^( U0 c% I
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    6 |  e; H$ P4 s. H8 J1 c
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    7 n" T4 m. }& g  u/ g% o! \, ^' e
  4. " V2 `7 V3 r: ~0 I% v7 S
  5. $data = [];  j; ~( G- y% `" `1 g
  6. foreach($cursor as $doc) {3 N% J. V4 A. s9 s: N: ]2 `$ O
  7.     $data[] = $doc;5 B8 }7 W4 A2 n* q, A6 v
  8. }7 f, L$ y) M: |; l2 ~
  9. echo '<pre>';' ~2 g. s/ ^4 W& _3 o" k, X  l
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    8 K! S0 [6 y; @  ~0 ^* c
  2. $bulk = new MongoDB\Driver\BulkWrite;: }6 s( N' U. Q% v
  3. $bulk->update(* A: Y$ [  {' R  P+ b1 p& q- @
  4.     ['name' => 'JetWu5'],9 D1 P1 }$ W# {* m0 a3 h: Q- B9 D
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    % U7 H9 W3 J/ O
  6. );2 o6 ]) Z( o: a' ^( g# D
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 k  c2 ?* F( U6 G
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    4 H" o7 M4 Y1 x2 q( l$ K
  9. echo '<pre>';& a) n5 n. u! I; p5 s7 z
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');  z8 Z( T4 @: B. h; I
  2. $bulk = new MongoDB\Driver\BulkWrite;3 a  ~& r( o. s% L% d: x
  3. $bulk->delete(['name' => 'JetWu3']);+ L: L- f  D  e, w  t" U$ c
  4. $bulk->delete(['name' => 'JetWu4']);
    . W3 d2 T; Q8 c6 i
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    , S1 z& P7 p8 M  \, {% H
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% K8 X6 b* ~8 @
  7. echo '<pre>';
    4 i$ y) V1 n* J' y& X
  8. print_r($res);
复制代码

; G3 v  V/ w3 _
% r* d0 c. ^7 s) \
1 M9 p% {# t9 {% ]

( \8 y5 b  |& @. o! w
1 o. p0 k! C( o




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2