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()
    & A/ ?$ P$ K) G& ^" y/ y1 g8 i
  2. //参数1:一个数组或对象$ D2 }, o- e0 C( I! P" K1 m+ f1 O
  3. //参数2:扩展选项
    & ~; }2 @6 x' ?% {; E
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    ! O. L, u# M2 B9 ^9 g% I! w
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    9 E( s0 S. i2 ~/ R) V
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认6 u. D3 ^3 i  _* E
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间4 W$ S: M; j5 _+ l- z2 J' Y
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)+ }6 X3 p6 G% n
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    8 e% d9 Y2 e( R( D1 D7 U+ d; b* m
  10. $db = $mongo->mf;//选择数据库
    3 O" K4 I* h3 n1 e( B% a2 c
  11. $collection = $db->friend;//选择文档集合
    5 }- Q6 h7 F* |2 F: }7 |* ~
  12. $doc = [//定义一个文档,即一个数组
    5 E+ {6 j4 R4 a9 @
  13.     'First Name' => 'Jet',
    + Y( W# x. I6 O
  14.     'Last Name' => 'Wu',( [7 D0 ?; i! j6 b& i
  15.     'Age' => 26,
    9 w6 H; {& G7 |( W
  16.     'Phone' => '110',! u5 u  g& m/ Q- q
  17.     'Address' => [* q; s3 y4 P9 C- e# c& O- ~
  18.         'Country' => 'China',$ {" U7 j9 R- q6 S0 `
  19.         'City' => 'Shen Zhen'7 h' Z5 Q7 G; q) }& S
  20.     ],
    % ~  i. a# p; b  Z2 h
  21.     'E-Mail' => [; v7 b* \9 I$ X
  22.         '123456@qq.com',& X+ V4 @+ b4 G5 L1 @- l+ l" b
  23.         '666666@sina.com',# h/ G9 l, e( q9 h4 Q
  24.         '8888888@qq.com',2 c  {0 a  {% w5 V( d$ i" Q, B
  25.         '77887788@qq.com'+ u* B1 |4 u1 R
  26.     ]
    ! G( \4 U! }# N$ b' r- r
  27. ];
    1 T1 [$ g: B' y. T* Y3 G
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    " U2 f: N0 t% Y. v& l. }& B
  29. echo '<pre>';
    9 V6 ^/ @! _) Z! {
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()* [' n' R0 n+ M, m+ P, H
  2. //参数1:搜索条件, Z; d! j9 k* H  J! x2 ^1 T& \0 D
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    " O& w! [# Z4 e5 c3 \% j
  4. $mongo = new MongoClient('mongodb://localhost:27017');* c6 c. i+ t  k( A
  5. $db = $mongo->mf;
    4 F. w  e$ j" @2 @+ ?, u; H7 j
  6. $collection = $db->friend;
    & C) E$ Z. n4 Y
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    % X  e6 U; P* Y7 A
  8. echo '<pre>';
    6 a7 {8 x; _. k* M2 j8 I: {" i  p
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    3 \6 y6 O( {; v: l3 d! ~% v5 o
  2. //参数1:搜索条件
    3 T# Z) L6 S5 ^3 F( M- ~7 V
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段- g# I1 q  `3 N% i
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ' V0 p  p* ]$ j8 ~4 E
  5. $db = $mongo->mf;
    $ [" c4 B3 a7 Y* v) V4 t- B+ x
  6. $collection = $db->friend;4 l; Y/ O" n* E# I% x
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素* v, t( P1 U8 ]9 t+ G. N8 g& Q7 ?
  8. echo '<pre>';
    $ q9 u+ X( P: J/ {
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档- S0 Y& j- z% G3 _8 g" a* }
  10.     print_r($doc);, g. B( u- y  U! [" Q- V- @2 M# y
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    : V3 G. K- N" C7 X  T
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ' |) q  u' k5 q8 j; ^
  3. $db = $mongo->mf;
    ' {& J0 D; \! |/ S3 [6 t, X  h6 K& s
  4. $collection = $db->friend;
    * r, H0 p' n! _
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);0 B% m% B, |. m0 r$ ~
  6. echo '<pre>';$ E/ g  t2 i( B( o
  7. while($doc = $cursor->getNext()) {
    " h7 a. l. {% X) Q' x- J
  8.     print_r($doc);
    9 ]4 B+ Z+ t1 W/ q  q+ c: h5 I
  9. }
复制代码
  //查询某个字段的所有不重复的值
9 e' M* H- i$ I) s3 V! h  [, G* p% Y  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个4 f7 A0 N, Z1 O  _+ m
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    ) E( z- o3 Y/ a; j) ]
  3. - c/ U: ~/ G% }0 [: S; l1 k+ s7 C
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    4 O& F; y' T* D5 p; w+ H/ P2 T  l
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);/ J5 t1 x/ D2 ~. Q% Z9 b3 T2 i

  6. + B8 t8 L! C' o
  7. //$or:或查询
    * p' H/ e! ?) x3 W
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    7 C5 t$ E; e' e( `& v7 C' w+ k
  9. 1 u' l) m8 R. H* b
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中% E/ X7 {: ^1 v$ b% y
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    + v$ A, {7 |0 t7 L7 d' t! W& {
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    0 Q2 {3 a4 A6 X( S
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    & e' F0 ~# f* M; a$ W

  14. ) j4 _% D2 K8 ~
  15. //$exists:根据某个字段是否有设置值进行查询! {  D0 i5 s/ B+ I+ S( ]& m, [: h7 e
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    $ o# M7 C4 S) m6 ?7 A& B
  17. 2 i# w4 ~3 P  `+ W
  18. //正则表达式查询
    ) y2 V% |+ x( r4 D
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    + {* a5 o' i9 P) Y2 l* a  d
  2. $cursor->sort(['Age' => 1]);
    ; l3 D2 R6 f5 Z# l' N3 L* [0 V- P
  3. 8 R6 c7 G, k' @9 A) I# I0 n
  4. //忽略前n个匹配的文档: {" C0 W: R6 k
  5. $cursor->skip(1);3 F, G( d$ Y( }3 N
  6. 3 E% K0 w7 n1 A7 h) W
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)0 C- S4 j, s# Z+ g- S2 x! ?) c2 C
  8. $cursor->limit(1);6 d% z9 {) d3 `3 F. w8 J* W1 W
  9. / k, z0 A! X) E* G" L
  10. //匹配文档的总数4 g2 u7 v  V; P& k& \! D( W
  11. $cursor->count();5 X$ g( {8 R1 U( @% `4 l3 k
  12. 4 M/ e+ l/ X  g0 Q6 u- i
  13. //指定查询索引- N7 o' h7 q) P, r/ C
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    1 G8 v% y$ }2 s
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    & D% W8 k( F; v; H- n+ j! j
  3. $db = $mongo->mf;
      v# w7 U6 w5 c$ S% A5 p# p6 t
  4. $collection = $db->friend;
    # I/ x* ~- D, U& l' E
  5. $res = $collection->aggregate([' n6 b; m4 s( U' z8 P2 S8 L* X
  6.     '$group' => [# b+ ]- {8 T+ M3 F' v$ L
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    - Q& {8 j7 O( Z6 K6 y+ P
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1. H$ T9 @- M9 V
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    # d8 t+ A: `9 {# H
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值3 S; Z; k( \/ x0 g, M9 A' j9 Z* d
  11.     ]
    . Z( g; B* A# A2 Y. h
  12. ]);
    / ~8 v" Y! o$ X5 {; Q2 n' z
  13. echo '<pre>';+ j& ^. W9 _/ a0 H& [( C
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    1 r% G" X, u& S8 ^
  15. 3 z4 l2 |- R: v( D

  16. 2 _" V) m4 W2 f2 X; [3 {
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序4 a: j/ m8 i3 }8 ?, W" c- p' k
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    % f4 c* ^! h3 o5 j7 d
  19. $mongo = new MongoClient('mongodb://localhost:27017');( h) i' F' w3 L, W# {0 w
  20. $db = $mongo->mf;
    0 C2 M* p  J; t, ~( [
  21. $collection = $db->friend;9 _( P# d, x9 h: Q9 q
  22. $res = $collection->aggregate([$ L1 i. T4 c: |9 T7 Z3 ?& V
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档1 e4 `6 ^" t4 y! m# n8 L
  24.         '$match' => ['Age' => ['$gt' => 30]]  C) O" d! h/ G1 r, E  r$ L, r9 K
  25.     ],
    - S& [; C3 R& |7 @) q
  26.     [//指定分组字段、统计字段) D9 ^8 [! M! t0 H
  27.         '$group' => [) [2 o8 e; c: x% j- o
  28.             '_id' => '$Address.Country',6 C5 R* {$ Y1 z$ G% L" n" Z
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和5 ?3 M* v8 Z% u& b4 t8 w
  30.         ]5 p) X, l1 t* E
  31.     ],
    9 U9 U5 P8 Z) r8 Y: K
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    : U9 m5 h: U- D. \
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。* d5 v9 e7 s0 \( x' O
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名6 T: j1 T5 G) ?
  35.     ['$skip' => 2],//跳过指定数量的文档
    ( S% g) n4 e3 ^4 N" Q* j3 _
  36.     ['$limit' => 2],//只返回指定数量的文档  V- D8 j0 u' `. D1 y) _
  37.     ['$sort' => ['totalAge' => 1]]//排序. m8 I% d# X- W
  38. ]);: H! x7 X. Z4 T6 P
  39. echo '<pre>';% w1 Y* L6 x/ A/ q6 Y( B& E
  40. print_r($res);
复制代码
; s2 y! l/ Q$ D8 l# {
三、数据修改
  1. //update(); B) I$ c  T( w
  2. //参数1:更新条件,指定更新的目标对象。+ I- Z/ l: a, A- w' {
  3. //参数2:指定用于更新匹配记录的对象。
    + d- w% K6 l( Q% w8 H
  4. //参数3:扩展选项组。
    / I; {7 s/ d) ^% F+ M/ n) Y+ b
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。: Y" d2 h8 L- A' R
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ! R2 o+ x; G/ f
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    : W& E3 r$ x" L
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ; e3 f4 O0 H& B2 a4 X$ g+ Z
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- _7 ?7 @, }( H& Q0 g
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ z3 @8 B0 w5 i0 Y% {
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    . ^8 Y4 A9 s, F% Z% ~
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    8 v6 V  m9 u: Q! H4 i% K( ]3 P

  13. 9 Q# R+ q7 ^, ]$ T8 A/ W
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值7 f. Y  Q$ X; ]$ u6 N' \2 g2 C- }
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    1 L! W6 t& H3 X/ ]' l
  16. $db = $mongo->mf;
    / R! J( K# g3 d- T, R
  17. $collection = $db->friend;
    ) ]" p2 [- T% u) |) ]' ^
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    : k/ ^0 t  B2 w$ _5 G
  19. echo '<pre>';
    6 \: C. w7 a: X3 x! i  C% z- i
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    3 n& G& L: ~; v
  21. 9 l- ?3 @+ N* |
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值1 w8 d8 r9 ^3 R5 ~5 v6 _! ]
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    4 v8 H4 i& P" r7 R+ Q/ o4 X

  24. $ v9 t- F. D! K
  25. //$unset:删除字段
    4 r( a* Y  _3 p0 s' s1 r2 ?+ S
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);/ {# |+ L) w  G8 g

  27. 6 ~1 c6 K, K1 D- }3 Y- g  j
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    : |+ p/ i  \& h- H" `
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);& v8 w* ?# e) R
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    5 {) _* Z, e8 T1 Q& l" L2 R
  31. - f) @2 P1 {/ w
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的$ }9 K2 j+ X; ?: ?7 {. T8 ^
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' M9 y/ k3 J; v2 G

  34. : i7 U/ O0 Y( x5 r6 Y: Q9 ^( F" |
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# e/ k4 g. c: q' Z+ i0 p
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    4 A3 X. c# b5 n* r) _  ]

  37. $ s; @- P& c/ ^3 j4 x5 i: r0 M  F  k
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    " k- J% J1 e5 m( p% z
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);" z% E0 M" E6 H; {1 l

  40. 7 W6 ^# ?+ [9 y1 l7 R9 q. z. i& I1 g
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错; E) r# L8 h- A5 t3 I3 ]
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);  P, `) @6 z/ Q

  43. 9 S. I% X  o2 ]1 U/ j( ^( i/ H3 K
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)& D! t4 E: `6 T- l5 G- ~% v4 I
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    1 U$ }% |+ N* ]
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);' M5 ~2 U* K- S& A8 Y' a+ Q
  47. - H3 m+ m8 |! }0 t1 Z
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). P/ G! X% s. I4 D3 H) f! |
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 X. A7 E) C( a% |6 x& a& |0 M
  50. . N# Q) b4 b9 K, C$ p6 `3 [
  51. //$pull:删除数组中所有指定值
    6 _5 l5 q; ?8 W8 ^
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    ( R$ D$ ^5 {6 n- y6 Y9 i. J
  53. * q: }$ K% j" E9 `' s* {+ r! L) B
  54. //$pullAll:删除数组中多个元素的所有值) R% Q8 @- m$ x. k! L
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()6 v! F& i8 O* X, u. u# Y" v
  2. //参数1:希望保存的信息数组  ~5 @3 D2 s9 A. Q6 P* ^* R
  3. //参数2:扩展选项4 v2 ?# s$ R1 Z& M( U
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。7 i1 P6 ]/ c# D% @1 \2 H
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作( I; c# f8 P; @
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ! y7 C% N; p5 k
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    / C1 U7 N6 d) w6 l* R; Y+ ]
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ J' T6 R4 p9 n) H) {$ H
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。7 T! L  o. T6 C
  10. //若想更新则应该在参数1中指定_id键的值。3 s3 w- N# j& T
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    , ~* |+ W3 W  x8 P
  12. $db = $mongo->mf;' k& b6 ~2 ^: n/ V$ ^5 Z
  13. $collection = $db->friend;6 X" l& h, E0 W
  14. $doc = [//定义一个文档,即一个数组
    0 g( r# k! m; ^! t: k# P8 N) K9 }
  15.     'First Name' => 'Jet',6 ^  g/ p8 s% t6 k0 y: u& [9 j# }
  16.     'Last Name' => 'Wu',
    ! R0 t* Q3 P8 z' _; i* O
  17.     'Age' => 26,+ R' m( @9 ^, v' b
  18.     'Phone' => '110',
    6 |% C. I! |; R/ b
  19.     'Address' => [
    ( Q9 H1 u% Y8 c& ]' a
  20.         'Country' => 'China',
    & B+ R+ W4 Z8 c- I- i% e
  21.         'City' => 'Shen Zhen'& v) |% U+ z3 z/ x/ P: h5 b
  22.     ],( ?# ^; l2 m3 |7 i" c  A: e
  23.     'E-Mail' => [  D2 t9 s2 M/ Z6 }' F4 A
  24.         '123456@qq.com',
    2 t* m0 s8 r2 x* L8 F. J2 f% [
  25.         '666666@sina.com',
    1 \# J" F$ V) x! D7 c
  26.         '8888888@qq.com',
    , V. i- l8 ?- O, M: v( y  r3 ?
  27.         '77887788@qq.com'
    2 B4 W- d' _9 ~5 O9 T% b$ m0 y' h  u5 b
  28.     ]
    . I( \9 J3 l# I" U( m. ~7 Q- X
  29. ];( M3 b2 A1 ~& i! c, H/ S$ n
  30. $res = $collection->save($doc);% @7 w# l7 P: ]( ]* [: `) K5 D
  31. echo '<pre>';
    ! X" j2 K/ b+ a8 |3 Y7 t) ]1 u
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    7 j" @: \. Q* V) k% H  l
  33.   ~  e! D5 n& e
复制代码
  1. //findAndModify()
      g7 j% Q5 {4 n- c7 p0 j+ W" ~5 Q% y
  2. //参数1:指定查询条件' R0 U+ {, ?5 G: G! _' I
  3. //参数2:指定用于更新文档的信息
    & a- Z. F3 a' k% f8 ?/ R( F( a  X8 v
  4. //参数3:可选,指定希望返回的字段- [4 s# e) W* }
  5. //参数4:扩展选项
    , s3 ~; l! m% Y
  6. //  sort:以特定顺序对匹配文档进行排序8 B4 |/ K( |* K& y; E  j
  7. //  remove:若设置为true,第一个匹配文档将被删除0 v1 G  g+ S; U- L6 G/ F  T
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
      N3 f: E* x, R
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
      T% C, x: d, q% ?' ?* y6 l
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档" F# j% f$ A- b$ Q  I: ]: B
  11. $mongo = new MongoClient('mongodb://localhost:27017');' m7 K% M+ V6 ^% n9 N! e+ k/ \! l6 [
  12. $db = $mongo->mf;/ L4 o1 {* T& N+ }0 \) F
  13. $collection = $db->friend;1 z5 _; x1 |( q% f
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);8 a7 d! J, }; [/ z. r" e
  15. echo '<pre>';" {1 W) z7 @' L$ @$ t- |
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    2 k$ X$ }# V2 |! n4 z& V. l) r
  2. //参数1:查询条件9 `( `! G, }$ Z! N5 w
  3. //参数2:扩展选项" O# M) d$ k. x! K: \+ L+ r/ e
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    5 U: B) y- Z! [* e* b; T
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    " p  q/ X! i% d- T
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
      I; g- i% [9 C- E
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ M  O$ P9 o; [2 r# F: X1 S
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间: ^* I0 ?( Q! m3 `
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    # {$ j- d) C% E2 U
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    3 J/ |8 p& j, B4 C8 n4 k" B) B
  11. $db = $mongo->mf;
    7 M' O; O- K& @
  12. $collection = $db->friend;# P  W8 E. Z* l  L1 T  t0 p( ]* T# l
  13. $res = $collection->remove(['First Name' => 'jet']);; g- W' X; p" ~2 p* b  V% p  x% {8 r
  14. echo '<pre>';7 K4 C+ l) e  i4 B
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
6 w& E2 I" E# c% |- V
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

/ o$ j. [+ U* `
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
& m" [, e) x3 H5 M' x
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ f2 I" s, {9 [5 M# l3 {6 [5 c
  2. $bulk = new MongoDB\Driver\BulkWrite;
    % a, }* i3 y5 G9 J/ G3 B
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    " k/ `, D* B# v* k
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);$ q$ Y* `. Q* N7 K
  5. 2 W3 k. w! W7 h9 ~5 P3 S$ `
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认% q+ P5 X, {3 n! C( B
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ! ]  P: ]3 h2 J; Y
  8. echo '<pre>';: w  a! j; M8 v3 m* s" ?
  9. print_r($res);
复制代码
% t1 E" n0 X. r4 a$ q
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    3 r) \0 N( f$ w
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    5 H* w6 a$ u* ?" [0 w
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    & M7 o9 Q) E1 X7 ~. F6 y& m0 K8 n. k( C
  4. 9 c! T- Y! K3 t2 Y9 K
  5. $data = [];# z8 r- |) @* T- S8 Q; {  n! h4 B
  6. foreach($cursor as $doc) {4 M+ b% D5 l/ g  j: r2 V! l
  7.     $data[] = $doc;
    ' X' g8 W& p. j% N9 M* ^% m
  8. }2 j) x: x$ K% F4 d) N7 \7 G1 }
  9. echo '<pre>';8 e. R# ^" t# K7 V3 U5 u' i6 @# m
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');* ?# R0 a' U* ?7 {
  2. $bulk = new MongoDB\Driver\BulkWrite;$ K* L# h1 d' u4 g* B
  3. $bulk->update(
    ; h6 H( [& e; S
  4.     ['name' => 'JetWu5'],0 ~- h2 Y3 x/ Y7 R- F6 d
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    : p9 h+ S9 t! C7 @$ F) g
  6. );+ ~' U/ ]6 F- y% {( O$ O5 F7 e/ z
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    # D8 L9 y5 ?& {; v& L
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);* C7 ^. C& e  \# x6 Z- D) r
  9. echo '<pre>';
    , {5 E, C/ i- J! p5 b( n
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');( b% v/ {) ]) T' X
  2. $bulk = new MongoDB\Driver\BulkWrite;
    + m7 ?% ~# f; U
  3. $bulk->delete(['name' => 'JetWu3']);
    2 }* s: o$ U) ~# x( [9 P5 ]* e) J
  4. $bulk->delete(['name' => 'JetWu4']);) s+ T1 j7 F; _
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    + F1 u, s+ n( @- L2 \: V
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);2 ]" a/ T! S+ C7 i& `
  7. echo '<pre>';: ?* }9 C6 K: Z, ]3 W
  8. print_r($res);
复制代码

) y9 u7 R' e  J  |$ ]$ S
! w7 a/ m) `% O7 h$ O9 ?" K7 `
/ ^7 o% s3 J/ `0 p  T
, E% Y5 k+ E; B7 ~7 ]

' r' g: p0 J1 Z$ r. K




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