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(). b9 E; l( u' b" H) n9 Z+ T7 l
  2. //参数1:一个数组或对象, f/ \6 t# T9 z2 l5 T. u, z9 H
  3. //参数2:扩展选项
    " _+ I" W6 f: k
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘# D3 n/ J7 A3 @9 z( b6 J
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志' S3 |, [- P  b' Y: ~( B- {
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认( }! [% \7 d; _8 B
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    7 S4 V9 C% ]7 D; S) j* L
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    * `7 Z0 u. Z3 w" {. E
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    6 O( O8 [$ c' }! x+ T
  10. $db = $mongo->mf;//选择数据库
    ) A3 |/ J8 O+ }- Z# p
  11. $collection = $db->friend;//选择文档集合9 Z2 i5 M: ?( d! E
  12. $doc = [//定义一个文档,即一个数组
    7 q+ f! b% D8 F# V, }  `, r4 E' S
  13.     'First Name' => 'Jet',9 z4 \9 U! ?, ?: b. K- Y
  14.     'Last Name' => 'Wu',& ]2 s$ w( w7 M
  15.     'Age' => 26,/ q0 q2 x. k- Y1 \6 F5 K* q
  16.     'Phone' => '110',
    ( c" T$ g: A* r: N) t
  17.     'Address' => [
    ' S* x' M. I3 }& |5 J& P5 y' _
  18.         'Country' => 'China',0 h% H" t8 h" I  j1 R7 b
  19.         'City' => 'Shen Zhen'1 t/ i/ B5 R- N. N  P
  20.     ],& Z  M" a* J$ M! I
  21.     'E-Mail' => [- H* Y' p& I- Y; c3 O. w+ w+ ]/ T
  22.         '123456@qq.com',8 T% g+ q! ~3 g6 r; ?
  23.         '666666@sina.com',
    0 z+ W( c3 X+ Z5 J. d% b
  24.         '8888888@qq.com',4 ^+ R* ?' ^* a, b( d
  25.         '77887788@qq.com'+ [& o' D  R/ Z' w. v
  26.     ]; {' H$ t) y  h# T7 [" B
  27. ];( b+ e  S1 x3 U
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    - G$ }7 c! a/ W$ C% t9 d9 }
  29. echo '<pre>';
    : }& [) p8 m0 d. _% P
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    9 C6 ?, A9 ]; `+ ~" D
  2. //参数1:搜索条件
    ) y- Q4 \& Y7 ^+ @2 m5 U
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    , W  B- h; h. u' U
  4. $mongo = new MongoClient('mongodb://localhost:27017');% F0 ], P( o" m( L
  5. $db = $mongo->mf;
    ' U* }" g( w8 o
  6. $collection = $db->friend;4 W$ F7 d! u# q$ v/ R( ~+ q2 R
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    ; U' W) A& t9 r+ a2 w+ D0 h/ |5 R
  8. echo '<pre>';
    - y* u: s% l, _5 ?+ z' ^
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    . u" h! E* |3 F1 [9 F1 x; R. Q" ]6 C
  2. //参数1:搜索条件8 r  c9 \8 W9 |5 k! g' n" [8 E+ W% A
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
      g9 r5 {% E; e, @" }. a8 I, o
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    0 s4 E8 A3 E9 G3 U5 o5 e- R
  5. $db = $mongo->mf;
    8 j) H8 H& t0 m8 ?+ V$ @3 E
  6. $collection = $db->friend;/ t* Z' I% H, _
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    * K% O% }% h$ T
  8. echo '<pre>';- N' j; n. `1 d7 Z! r( U1 l6 B3 A; m
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档- E' z/ s# o' B! Z  w
  10.     print_r($doc);
    0 W' M0 M1 d: Q& U/ O
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    * ~. }, q4 X" p, I/ s( N* @
  2. $mongo = new MongoClient('mongodb://localhost:27017');9 c' b7 q4 d: ^. Y
  3. $db = $mongo->mf;: \) l$ M9 B( ]5 L
  4. $collection = $db->friend;8 q/ V) t6 F) F- j3 i
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    0 V, G- T8 R# Q% [% h7 f6 k- A& v% I/ ?
  6. echo '<pre>';
    : P( z; j# Z; c
  7. while($doc = $cursor->getNext()) {9 p9 H( d, I7 q$ o( Z
  8.     print_r($doc);* q. s& k" Z8 {/ Y  K8 l$ `  X" Y4 I
  9. }
复制代码
  //查询某个字段的所有不重复的值$ I: b; K+ {/ V9 x' w: |
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个3 K9 O8 ?- \3 e" _" a( T
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    9 Z( _. V* i# @1 p, b5 x
  3. $ f3 L- S: l4 F, Y  f
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    8 F  W% R+ P0 m* I1 H. p
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    " z: A5 [6 R' O
  6. . b! _% P0 \& N4 c4 i5 |/ H
  7. //$or:或查询8 q! ^6 M; J& o$ ]8 C
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    " u0 P5 I5 E: C& d9 d& ]& y% m0 o
  9. 3 }1 t. P' i+ o( ^" a8 W' I
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    9 f7 m" r- h; w; w* g  m/ x4 F, Z
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email, r# M# O1 w3 j9 y. e1 r
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email* Q9 b3 s4 t; z+ r
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个% A5 U/ P5 X0 {( _7 ~

  14. " c0 @2 Z" S8 K6 w6 n, Y$ P. u
  15. //$exists:根据某个字段是否有设置值进行查询
    % v- `9 N4 ?! G9 _
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档! M! ~4 a& _+ e5 C- p- B: O

  17. - j- n# B9 }' }" x/ ?" p8 D4 N3 |
  18. //正则表达式查询
    & A2 A& K5 a* T3 |+ U0 I) h& p2 T- x! x. G
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序8 W( w7 @. N" O. Y+ `
  2. $cursor->sort(['Age' => 1]);1 T3 L+ K0 V/ h, w: @2 V* H- D% u6 J
  3. 8 [  _. S0 W0 d) N( c
  4. //忽略前n个匹配的文档
    5 c  Q. q9 t4 h+ b+ d
  5. $cursor->skip(1);: ~. r) e) A; Y6 w2 z
  6. 5 e+ D! n% ^' W
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    1 i& J& t, X2 [' _" }; L# k
  8. $cursor->limit(1);
    $ D2 c9 u5 D( `5 S6 A, v% U% M0 d* U- U
  9. 5 J, H: `; p" u* z3 k( f
  10. //匹配文档的总数
    ( ~9 |) _# z) u$ F; p& {
  11. $cursor->count();; F# {/ B6 t% }9 `

  12. 0 B/ J# G3 m  O/ b
  13. //指定查询索引: `* |* _$ v: p  ]2 n! b9 y& L
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    , e) z: K, K  V6 c! u
  2. $mongo = new MongoClient('mongodb://localhost:27017');: J8 }; F' k* D# g7 ]% }2 {
  3. $db = $mongo->mf;
    * d4 E2 |: l7 b) E
  4. $collection = $db->friend;
    & y. e. y# o+ D+ F0 c% I
  5. $res = $collection->aggregate([# y6 g! ~0 i" N' b1 t  k) J+ M
  6.     '$group' => [5 f, G3 D; s8 \6 i" u* ?, l/ G/ Q
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    ) @% X8 G: d! k0 I9 T
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加16 X8 k* E# r  b: X  K! i4 x+ j2 Z0 }
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    4 Z# F9 x* c1 J0 }. P; {+ a) B
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    2 i9 z; A& m4 e% T% T$ _
  11.     ]
    ( W7 J  u; G& w  u& V( k4 q2 s/ L
  12. ]);6 F: F# s% N' Q+ y
  13. echo '<pre>';  ~! Z' A" N7 C7 F, U5 f( f2 g: v
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果: B/ f7 f0 ~! f4 M
  15. 3 g5 k" q2 k; D: Z$ X4 D
  16. # [  ?( F4 R4 S8 b" W
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序. e. D4 i" P1 b/ d' V; N& r+ F
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。  i! U3 p4 ~% U
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    7 N" v' d7 m/ C. e5 v' X# J% M
  20. $db = $mongo->mf;1 j0 g8 L7 K; C( l" ]3 c8 p* O( U( S
  21. $collection = $db->friend;, J) e, e2 }9 \& \9 t
  22. $res = $collection->aggregate([; G! _9 T* t* _: y' m
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档, y) p. T- a$ w# X: b
  24.         '$match' => ['Age' => ['$gt' => 30]]
    : L( ?4 E# Y$ S, D# s
  25.     ],4 k2 a6 J( _% j7 g
  26.     [//指定分组字段、统计字段
    - m7 @3 ^) p' L1 _2 K. Q3 a5 J
  27.         '$group' => [
    1 E0 i1 S4 Q' b1 V( g" L" C
  28.             '_id' => '$Address.Country',
    & M2 f- N6 N) f/ K
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和& T; E: G% |5 [2 w- y7 h) M) |- `
  30.         ]
    - t9 L/ e5 {$ P  E  M
  31.     ],
    5 D- O6 J4 U5 X% B$ A. f* w: d
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    6 R, n7 P% F3 d1 Z3 _' G
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。! N, D) p( Q/ K
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名  f$ C! A8 c# J' w; h
  35.     ['$skip' => 2],//跳过指定数量的文档
    # R" {- Q8 @4 Q5 l' H9 r9 ~
  36.     ['$limit' => 2],//只返回指定数量的文档
    / J1 d9 {& O2 Z; d  P
  37.     ['$sort' => ['totalAge' => 1]]//排序
    4 y4 K2 v6 h" ~. J2 `
  38. ]);
    8 Q+ Q4 B. _2 x  _$ S
  39. echo '<pre>';
    # @9 n- D( U2 i' d% y( O# l# ?9 Z- M
  40. print_r($res);
复制代码
; c" \7 C! g$ V8 ^, h/ y
三、数据修改
  1. //update()
    5 ~# i# b0 i+ Y5 O4 O7 ~, x8 I  V  f
  2. //参数1:更新条件,指定更新的目标对象。
    2 ?3 F2 p5 Q1 k  P
  3. //参数2:指定用于更新匹配记录的对象。
    . c+ f( z9 M% S2 J3 X% J( M+ j$ R
  4. //参数3:扩展选项组。8 j, K8 ~: v  V' |2 n. j; ]6 W/ r
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。. S& m4 T, E1 [+ a" i- \6 O8 [
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。0 o& v4 Q9 C# A2 @2 ~0 D0 ~
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) [) O8 C2 m1 o
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    " I3 u/ J4 Q& C  P% A
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    & e$ a  K' P6 X- ]2 c9 g: y+ g5 B/ H
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间& I& c$ k: i  u( x& \: l# l
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒), B+ M# `: x' b4 |
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。5 o- R5 h) l6 D: ~5 d

  13. : n, D5 ]; H- u8 H  e
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值5 z& L+ H: o3 g, v8 Q
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    2 ~1 j1 y3 a7 {7 f
  16. $db = $mongo->mf;
    9 \8 g5 e  u3 v+ W4 `, y# A
  17. $collection = $db->friend;7 R- `* {+ S4 y2 i0 A- s& m4 W
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    ' T9 P& u; P# i0 K" a/ T- u$ k' _( d) R
  19. echo '<pre>';
    . p! ]4 A0 z* B
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量/ }, d8 [( M% d4 [) Z; s

  21. % t! r2 P. J- {* u9 |2 o
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值& Q5 o" w6 ~, }  W# ^
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);% r3 W/ N/ K- z- {. P% w" D% |

  24. ; o/ P/ A' _$ Q8 O8 Y; K$ w$ q
  25. //$unset:删除字段
    8 Z) s2 t7 y* `8 t
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    7 i- O0 h0 f  r2 ?0 A

  27. ' u: @  w! |" X, I/ C) O; k, _* F
  28. //$rename:重命名字段,若字段不存在则不进行任何操作$ R  t( h# k' a' d. ]! g1 N* \
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);8 i& i$ a' W3 s' `9 ~8 K' l4 f
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    ; @9 g) o: b) R- ]

  31. # u* C0 [. P' w6 {, `1 [3 s2 h
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    ( r- }8 {/ X" r! k
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' A- G$ d# E$ N- S2 q
  34. $ q8 X) e, w/ |! k2 y: {
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    # Y3 x1 H1 r8 _" c8 b2 W' R5 F4 E
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    ) T# a( s- r* a; h+ j& C

  37. $ o1 d) f, Z; a0 Q2 o9 g
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错. ?3 h% n$ m* b1 z. f
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);  K. b  H) T2 [, Z  z5 Y* _5 _. Q
  40. 0 a  K/ p# {, M- F& P- S1 o& t
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    5 c+ g( {2 Q2 m: y, h" o0 }2 m
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);: ?5 n' `5 M' h3 T% J

  43. : _, G8 A" k8 e% _7 u
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    , K3 h, c% ?" w8 ^0 a, d2 i
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    # W9 |; M1 I& r- \6 i7 B6 Y
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ; t3 Z( C; N) ]- [9 I+ d7 C9 @& H
  47. 6 R9 k# W) s) @# f) |! h: @- d6 `% k
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素): W2 i  c% {8 ]7 k1 |3 S
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
      C4 J( J$ ~! p, o

  50. 7 r, j% k4 y9 {: `7 ^1 b
  51. //$pull:删除数组中所有指定值
    . C0 R7 t) N& o5 {* D3 \$ ?
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);4 v$ ~2 ^2 j/ C6 B! _" U4 x6 H
  53. 3 C8 V0 I, L$ r, M9 {+ Q$ {
  54. //$pullAll:删除数组中多个元素的所有值" ~' g0 b9 g+ b$ @1 V" |
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()% n" A/ D+ T2 {; `2 w1 e
  2. //参数1:希望保存的信息数组  j8 m4 M( E3 q( x8 j8 \- ?
  3. //参数2:扩展选项
    5 H4 b* O9 s( ~, N9 M# H' l7 v
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    2 P& \) y# Y7 `
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    * i9 W: E" v4 R, l* d" m
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。3 T$ `3 W/ n' Z! t
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' Z7 U- T+ B5 w3 m! h; h
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    / V1 l) F! q, J$ G
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。/ h, K+ W8 e; ~0 h# ~
  10. //若想更新则应该在参数1中指定_id键的值。
    . Y$ K0 \5 a6 F; N
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    * C- p4 V; F/ j
  12. $db = $mongo->mf;; `* l- p/ E- K* |# [- ^
  13. $collection = $db->friend;
    ; C. q3 X/ d# V4 [6 k% x- f. h! s
  14. $doc = [//定义一个文档,即一个数组) E9 b4 J& `7 G$ ~4 z& o
  15.     'First Name' => 'Jet',
    & ~* a" q2 s# T% N: k, \& q  |
  16.     'Last Name' => 'Wu',% D7 W0 X" @2 t5 `
  17.     'Age' => 26,' [  `$ @  [% |
  18.     'Phone' => '110',
    " V3 t+ G# k8 c
  19.     'Address' => [; T5 B3 Z. w5 C3 Y8 A  B
  20.         'Country' => 'China',9 H5 L9 Z  S4 h1 }
  21.         'City' => 'Shen Zhen'
    8 r- t! e7 V3 e) n8 z0 o' h' b* F
  22.     ],
    / _# v; d# t3 n
  23.     'E-Mail' => [4 x! C) ], b2 Y" p! A
  24.         '123456@qq.com',
    3 b- g( [. ?, v8 z
  25.         '666666@sina.com',
    / }# g/ E# b% b2 q
  26.         '8888888@qq.com',
      L# [% R& V* m1 s0 t; B
  27.         '77887788@qq.com': `0 L/ g& w  y: r6 A5 T1 K
  28.     ]
    ) b8 Z7 ^2 \5 w, T& I: W. [$ b
  29. ];" z8 e( D1 z1 s! b% `3 L' y* z  K
  30. $res = $collection->save($doc);  Z9 N1 A" A! |) [
  31. echo '<pre>';( ], G0 C7 Z* B% Z
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    7 J1 A, ]/ [4 @. D- ^
  33. & N. u) [. }2 C8 O
复制代码
  1. //findAndModify()
    # |1 {9 L+ X3 ]2 [% H7 W
  2. //参数1:指定查询条件
    1 B/ ^) v/ K1 L, l7 K. y/ R! K9 P& R
  3. //参数2:指定用于更新文档的信息
    3 V+ Z' D: l2 `
  4. //参数3:可选,指定希望返回的字段
    1 @8 c. X0 u# t1 |
  5. //参数4:扩展选项( g" s. m6 a; z' Y
  6. //  sort:以特定顺序对匹配文档进行排序  [3 J6 d) W- v" N7 R
  7. //  remove:若设置为true,第一个匹配文档将被删除" [: \$ {+ i9 o# e3 K% f
  8. //  update:若设置为true,将在被选择的文档上执行更新操作. s  M2 s' P9 C- }$ G  y& h6 e! j
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档/ ~6 Z  y; V3 }5 H3 x: b* s
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    1 F0 i6 I" G$ o5 ~2 p: Z
  11. $mongo = new MongoClient('mongodb://localhost:27017');5 K  U9 S- z1 s9 m4 |
  12. $db = $mongo->mf;  s7 N8 z, p+ X  h- T5 O& U
  13. $collection = $db->friend;( G. K. y* L7 s/ e3 k$ e! q. k
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);7 l& K0 q7 p& K. R% x* ^! p8 @+ c
  15. echo '<pre>';
    $ x( _3 h' m( a0 @+ H
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove(), `4 V6 }7 c! M; o( ^8 u" I
  2. //参数1:查询条件
    ; w0 R/ A& D7 Z- s2 w2 [& j1 T" G
  3. //参数2:扩展选项
    2 I- Q* X! h& ]+ f
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除  ~% _5 u% A- o5 e1 z
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。- C5 \+ T) m5 s2 b
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    / J; H; g2 H9 V1 S
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 q" p7 I4 h2 J% C2 o7 a
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; y8 o6 G1 @6 n4 _/ {
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    & _( N) c( a& {+ H/ _) D
  10. $mongo = new MongoClient('mongodb://localhost:27017');$ y) z/ T" m, C+ R$ B
  11. $db = $mongo->mf;  W6 _3 {% v1 `/ K% W7 z  _4 S8 W
  12. $collection = $db->friend;
    $ P" P0 H0 Q6 L2 `+ ^7 b
  13. $res = $collection->remove(['First Name' => 'jet']);
    4 O- Y0 I, o$ O1 D2 y$ [
  14. echo '<pre>';
    $ A3 I% X9 ?: ~$ `
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

7 \0 V$ c0 y: h" b" N' \
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
8 V: E( w* C( K! E
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
% N# {/ i- A0 c( i* U$ l- P- j7 p
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    # k  i. A* o+ k( T# K5 V" I- I7 V
  2. $bulk = new MongoDB\Driver\BulkWrite;
    : R; X  o' D1 h. [) {" e6 _
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);. b6 ]  Q. |4 y7 F
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    ; @7 t, h5 n: k' E
  5. ; f4 h" n) y! ?6 A& H% X
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    # C" O8 f% P  C: C
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ( }: b7 y' X5 o/ q$ M0 V
  8. echo '<pre>';
    - M: f6 d/ n+ S. b  J
  9. print_r($res);
复制代码
% V/ |$ S: S! A7 `
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# d' a( Q% t6 ~2 e1 k+ S
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);, i, e& G( {) W! L7 \/ T
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    0 t. ~) {, ]# m0 x7 X+ h  E. x& [

  4. - W+ l( n; s7 c
  5. $data = [];
    2 }: u6 B3 G1 B# S! s& x
  6. foreach($cursor as $doc) {
    . G/ w. A3 Y% y$ G
  7.     $data[] = $doc;
    % A# c2 H* N/ a7 g- f* Q
  8. }# c' F, E2 Y  U
  9. echo '<pre>';
    5 C3 f4 R8 B( y7 n9 z; a
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');9 s1 U/ ?0 Z* ~: L
  2. $bulk = new MongoDB\Driver\BulkWrite;1 ~  B6 ~& N2 s( h3 h4 O
  3. $bulk->update(' [$ r/ ~+ x2 W; A& ?  m
  4.     ['name' => 'JetWu5'],# x" U6 E9 U8 A
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    : E- y2 R( b  M
  6. );8 H9 c% y0 f) p0 z( Q
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认; F' M! e) |6 i" t2 e1 x
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    5 K# v2 Y- K4 C5 w
  9. echo '<pre>';& B7 m' V8 P( B. j2 k8 e+ n# k. N
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    - [" |8 [$ \5 H0 o; N% |
  2. $bulk = new MongoDB\Driver\BulkWrite;
    " W- Q7 c$ R  y$ m5 `& v! k  Z
  3. $bulk->delete(['name' => 'JetWu3']);  l( D2 B7 Y; p
  4. $bulk->delete(['name' => 'JetWu4']);* ^1 K$ G1 D7 s, N2 N% y
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认/ d$ _7 ^  z, e0 |
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);8 `1 c% F+ _+ ~6 D
  7. echo '<pre>';
    3 ~! c, D. [' E
  8. print_r($res);
复制代码
" |8 ^) p3 t2 s, ]4 `! l

3 `( O* ?' s* W$ F, y* a4 N
, d+ _: Y6 ^9 n
6 w6 S; j; z# w7 Y
& E2 ]' Q6 {8 m( E9 d+ a





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