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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13545|回复: 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()
    $ }5 O( {9 L! \' H
  2. //参数1:一个数组或对象
    % |" ^7 ]+ d. f) w& C
  3. //参数2:扩展选项
    5 {9 w2 x: K+ K* T; w
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    * E% T* m+ e3 p  `/ e
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志2 E3 U0 q" p8 H  ~3 [) D
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    6 d& {5 s( q7 i8 O8 |7 b
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 }3 q4 y! d. M3 R. n
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ( _- @5 z& F5 d" H7 V, R1 P
  9. $mongo = new MongoClient('mongodb://localhost:27017');4 s- q+ g+ [% q2 C0 [- q! N2 K
  10. $db = $mongo->mf;//选择数据库
    + d% A/ k# j7 P6 o* L
  11. $collection = $db->friend;//选择文档集合5 A7 q: K$ W' m3 l" C' M* _: R
  12. $doc = [//定义一个文档,即一个数组
    0 e: j( i( N+ ?8 q; O8 O
  13.     'First Name' => 'Jet',
    ! Q8 [6 E% z* _7 b! g  p% r
  14.     'Last Name' => 'Wu',
    * e+ l' D+ {" @5 S% J6 v7 d4 R
  15.     'Age' => 26,# i3 U  q, P& i) c! o  k5 b: z2 m
  16.     'Phone' => '110',
    ; j& K# l3 `) S* |6 S! _7 U/ x3 |1 z
  17.     'Address' => [
    $ Q* ~* j9 R0 ]/ t! q
  18.         'Country' => 'China',
    - @/ _+ v) Y: l( W- k: n2 `
  19.         'City' => 'Shen Zhen'
    ' @. t5 I$ D1 ^3 G
  20.     ],) i* k1 _: H! V5 ^8 L
  21.     'E-Mail' => [; F" ?: G/ A8 V+ j" S8 X! c5 t) R
  22.         '123456@qq.com',
    0 C! ?; r- V' `. F" E
  23.         '666666@sina.com',
    5 Q- p# ?+ B7 l  ~, p. r
  24.         '8888888@qq.com',
    & ^4 g/ H5 r, ~4 B
  25.         '77887788@qq.com'
    ' ~0 r" W# D; H# V2 o
  26.     ]0 Y9 @# Y/ U7 f4 Y2 V
  27. ];
    ; \. J- K5 `5 \  N( A  t& ?
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    ; K- b4 A  U1 `* w$ N
  29. echo '<pre>';6 \8 R! r# d8 ]7 F) g  l( X" D
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    " Q: t6 A, m+ t
  2. //参数1:搜索条件
    1 l# H6 b$ Y6 z2 p+ T; M; }# s
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    + Z) M2 F' h! `2 Z
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    # q* G# g8 ]! P: T: [; o9 m
  5. $db = $mongo->mf;
    & t& ?2 @* x7 v. z
  6. $collection = $db->friend;
    4 C8 m2 Y1 h1 d9 M1 F" V: l% m6 t
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    & z( {8 Q8 o7 E* J
  8. echo '<pre>';( A2 P0 h4 F- O& }
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()( |6 ^  W& Y) e7 J5 `! }
  2. //参数1:搜索条件0 n: Q* m  z  ?" z) H4 c: H
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    : V6 b# F+ a- w
  4. $mongo = new MongoClient('mongodb://localhost:27017');6 j- v+ R6 `+ C6 R4 G2 t& i3 M
  5. $db = $mongo->mf;
    ; s3 ?. t. |0 }- o- ]
  6. $collection = $db->friend;
    ! [5 ]9 [" a" ]/ Y: g
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    % P6 b! b( Z# p* c8 ?
  8. echo '<pre>';: b* \9 E: G) [
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    $ i- d, E; `, r) j! p* O
  10.     print_r($doc);/ O$ d: _/ P7 N! D3 j* C: ]" m4 [3 o
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询1 M7 U) o4 o9 x+ b* {7 @4 O
  2. $mongo = new MongoClient('mongodb://localhost:27017');# V/ d2 N, j# w2 F# |
  3. $db = $mongo->mf;% U2 t! k* v8 q- `/ @. @
  4. $collection = $db->friend;
    " N0 P- I9 u4 {) i" S& u$ ~
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    2 t! S4 T# H, x5 ~
  6. echo '<pre>';; }& p) o, ?9 y+ v5 k
  7. while($doc = $cursor->getNext()) {
    2 Z) q% W! G' e# H# z4 N# G8 k% b
  8.     print_r($doc);
    + f, j) C. |+ m  h6 }# Z
  9. }
复制代码
  //查询某个字段的所有不重复的值" u+ U$ q4 W8 ?$ u. j
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    ( D2 }1 B4 c6 r) E
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    & i0 j5 o7 {$ N) a5 U
  3. - i7 Q2 P' b( T4 X9 X/ Q
  4. //$all:匹配多个值中所有值(用于数组字段查询)0 A, h& u4 ~4 g% \+ P4 I2 {
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    ; R! k9 l- o0 y% {& x% u
  6. 8 m$ ]& Z) Q- _
  7. //$or:或查询
    + T$ @8 e( ^  x9 I. f0 `
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);! H  N' k! B# r: N$ H

  9. 0 ~  w( L5 t" I; G2 ?, c
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中/ u3 ]+ V. ]& v4 V0 u
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    & V  {+ r" Q2 ~) y1 B% ^
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email0 Y: u- [  k( }, a0 |
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个- R* t3 ~4 a; ?. h1 m: W
  14. : {  [, @6 {- M& R; s
  15. //$exists:根据某个字段是否有设置值进行查询
    ) M0 R+ R* S# C
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    # B5 J/ W* b) `" l* S
  17. - ^4 S$ m+ Z& ?/ W
  18. //正则表达式查询' C9 N4 r2 y! r- f3 }# H& x2 q3 H1 w
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    + m3 A6 j6 M/ }! x; A0 \( M! x
  2. $cursor->sort(['Age' => 1]);8 H1 j7 D) c8 o& R& i+ l4 \; k

  3. & e" [4 K) k0 T# }
  4. //忽略前n个匹配的文档2 H, A( L  `: \* e0 M/ {2 [2 U/ y+ z% l
  5. $cursor->skip(1);% ^/ c& d% h4 V( Q: K
  6. ( D* V# z/ V4 S" h' W5 q
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    5 {* }' Y9 L$ R9 ~8 l
  8. $cursor->limit(1);7 W2 F) z+ c/ p8 X0 `

  9. 5 C( w) t0 I2 A2 v: k
  10. //匹配文档的总数. L4 O; K; |: k7 ~# [4 Y
  11. $cursor->count();
    ) Z6 g! S* r% J8 G5 U0 L
  12. 8 i, o, T6 y5 F9 l3 {& E
  13. //指定查询索引% G) I6 Z+ M$ ~& l5 E8 C7 e9 P
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    * k# _3 a$ y5 a; }9 H
  2. $mongo = new MongoClient('mongodb://localhost:27017');1 D$ Y# }; T0 E! {% X0 E
  3. $db = $mongo->mf;* V- Q+ B! |9 I0 K2 E( p; k
  4. $collection = $db->friend;
    & L3 @1 F0 z5 F' I% G' j
  5. $res = $collection->aggregate([% S( Y3 V/ R5 T' s+ N; H' a
  6.     '$group' => [6 _: N- X: \. a8 j' X! z$ h
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    9 {  Z( Q0 Z. f- I: s6 [7 J, {# E  Y
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1. a5 J) R  o4 U. R( b" d3 r8 c0 p3 K
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ' L1 U2 G0 Q+ t+ k
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值) J; P/ m$ o0 ]0 W
  11.     ]& w9 C5 I$ F- y7 J6 _% I
  12. ]);; Z. G7 p5 ~7 |/ b, }8 p; S
  13. echo '<pre>';
    3 A" X: j- |* H* y6 A& D& R
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果8 \6 @! M* E! {7 i9 V# k+ Z
  15. : J- R/ ~8 `0 w! M( r' U. O- G
  16. 9 ?$ u: g( ~8 B2 j
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序) Q' b) T  ~" ?  R
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。9 G1 Q7 I+ P7 i" P& _, q1 `
  19. $mongo = new MongoClient('mongodb://localhost:27017');% c- q: O! T/ |' J5 @% c8 L! y: q
  20. $db = $mongo->mf;1 }# M. G" l( x- l- H9 A
  21. $collection = $db->friend;
    ; }+ v8 |- `* |$ e8 s' x
  22. $res = $collection->aggregate([
    3 M1 {+ [9 H1 j
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    $ p; g7 n& h6 c) @2 T, G; q  i: S0 i
  24.         '$match' => ['Age' => ['$gt' => 30]]
    ; B+ f7 G. n  ^& ^, Y1 a
  25.     ],
      s& N6 l7 s" N) B! l4 w
  26.     [//指定分组字段、统计字段
    " O3 }0 g! U6 g- D3 O
  27.         '$group' => [7 L$ |9 z) P  f" C
  28.             '_id' => '$Address.Country',) k; S# E; g/ j$ W  T
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    . ?6 U6 J% i/ p) m$ T8 S4 ]0 F
  30.         ]
    - F' D' c. U* v2 Y9 K
  31.     ],
    . j" s) ]0 v/ k" s$ H" t' E+ Z
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档" J2 s- |/ [2 @+ O. y. s3 r
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。( `" K! ?8 U. A- b- q
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名, B# R% V) |7 L& @% }8 `
  35.     ['$skip' => 2],//跳过指定数量的文档
    2 X/ M! H) Q% y7 f$ v: O' b
  36.     ['$limit' => 2],//只返回指定数量的文档; p7 @0 o/ d5 R8 }2 }. q
  37.     ['$sort' => ['totalAge' => 1]]//排序
    ' M, P+ c& L' J3 O' d
  38. ]);6 M! F1 }! M1 N/ `8 E8 G/ _
  39. echo '<pre>';
    * L$ \$ D; D  \3 u5 @" U* b4 }* y9 I
  40. print_r($res);
复制代码
% F8 d  @  E3 ?
三、数据修改
  1. //update()
      R' g, w0 B3 Q% r' J+ E5 l. Y
  2. //参数1:更新条件,指定更新的目标对象。8 Q8 ^  A4 X( W
  3. //参数2:指定用于更新匹配记录的对象。
    + d9 x- i; S- C! O9 O
  4. //参数3:扩展选项组。
    7 }. C6 ]& W: R* L) E
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。- g. u8 M  W* |2 Y% |$ ]
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ' {3 g& c6 T  u4 O5 a
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) F7 Q6 V% e2 n$ R1 @
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作, B) {3 c: |9 R# w$ F$ E
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ( ?3 H) k7 {7 s) M/ {8 c
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # g- X1 p+ p+ q' V  a5 ~+ Y& f( ]
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)" J+ i; @" U" {- h' r+ w1 k
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: _8 C# f; b/ Z

  13. % k; m6 W6 ^8 Z2 d- t
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    , s  a) F/ G1 C1 J. N/ p
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    ' G; v: B6 u+ d& L" t) C
  16. $db = $mongo->mf;
    / Y) J) P3 D/ o% Q4 ?
  17. $collection = $db->friend;! B8 F$ q- k) n0 e  j
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    ( K3 L; S5 T4 s& u$ ^: {2 B
  19. echo '<pre>';
    $ x3 u3 ^+ c4 u: S# R  g' w- I
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量% x2 d- g7 e5 @$ o" y5 R
  21. 4 g6 _8 M  A, d( K
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值: E- c4 n, m' U4 o- G) `
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    7 o/ {8 l# o. W2 F* ?
  24. / N1 R/ k6 V  x" _9 \
  25. //$unset:删除字段
    8 E' q7 B* _2 p6 n" f& Z
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    5 f  {  ]- O" F6 E" g& G$ p
  27. ; ]. S& B7 i# P
  28. //$rename:重命名字段,若字段不存在则不进行任何操作( H! l0 r! L4 Q5 K# Z
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);& v! o* A( Q7 T
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    5 \0 M) v) m( t, D4 G
  31. 5 n1 t6 `9 R* D! E* C! d& H
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的& V/ M; R6 l$ e# ?
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);7 R- S! J- f, [

  34. / }5 z0 \6 v: w5 j; a
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错( v# S4 G  E: V) ]' A$ N
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    ' s0 N$ A4 k# x4 |( A: L

  37. * q: `7 u+ f! \2 q+ T; z
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    " ?# ~2 |/ n0 i8 w. _
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    : c3 L2 y  Q1 h& N5 w5 t

  40. ; \) W8 q, ~% Y; k" z: C4 m  l
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错' l& {5 n1 \% u9 k2 N  S3 `
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);6 b3 Z1 Q% J- @! `! [
  43. & M- f) s- i% S, W) A) k, o6 }
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    4 p3 C; T  Q$ w9 O* [
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);% |2 a* Y8 b/ z4 t
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    0 ~& r& a: j" G: a8 g

  47. + T# `( K: D0 r- h& Q3 \' y3 [, W. a
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    ) ^& X( u7 J/ g# P  d6 i# R) ~
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    5 h0 v" @8 k4 L' v7 ^% X
  50. ; a0 j! y1 P% _/ K
  51. //$pull:删除数组中所有指定值) y4 g7 d, T- Y3 m
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    + A, t8 [4 S: m1 t1 \

  53. ' u0 A4 }$ c" q, P9 `% n
  54. //$pullAll:删除数组中多个元素的所有值' [  Z  o" g1 w$ X' \0 ^
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    1 o9 c0 V5 z/ w2 H
  2. //参数1:希望保存的信息数组
    & k5 i) r$ c6 b, f8 h3 z7 _! D# p
  3. //参数2:扩展选项" {: A, S. k6 n4 I7 q  W0 t  A
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。- ?2 m( u' H3 y- C5 J
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ; _* x  H- Q/ u
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。6 [% m% W" H3 c% d" r% P( ?* o
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    4 l$ Z0 b+ X+ {
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    0 d7 ]  u0 P. ~7 z6 G
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    & F% u' J# y+ g
  10. //若想更新则应该在参数1中指定_id键的值。) u) \- \2 s; V. y. |  R
  11. $mongo = new MongoClient('mongodb://localhost:27017');4 S  P5 ^, y0 d
  12. $db = $mongo->mf;
    ) |, N, o( m  f; N, q
  13. $collection = $db->friend;
    # w6 a* M6 H$ B  L' u" k
  14. $doc = [//定义一个文档,即一个数组
    " B4 ~6 `( @" o* ~$ O
  15.     'First Name' => 'Jet',
    ) ]' a& G3 w8 j1 W6 X
  16.     'Last Name' => 'Wu',
    8 ~' G8 r# n7 g' ?" k
  17.     'Age' => 26,1 t& B& D% F: f6 Y3 H2 T7 Z
  18.     'Phone' => '110',' {' C" ~* X2 I8 X: y! G
  19.     'Address' => [
    6 v8 H# \) {! b$ G6 A
  20.         'Country' => 'China',. \7 P( o8 q8 y
  21.         'City' => 'Shen Zhen'
    1 o3 r5 S% e; d6 I+ x
  22.     ],
    4 \. i) V' J4 i$ E! F
  23.     'E-Mail' => [
    5 s1 @' Z& N# o0 n0 D/ t
  24.         '123456@qq.com',
    - A5 a( D7 w) ~2 f1 L" o+ m3 ]8 D
  25.         '666666@sina.com',! \& D; s& I. O# P
  26.         '8888888@qq.com',
    $ K. p/ b+ |  Z1 u$ o
  27.         '77887788@qq.com'. q) k6 _3 N' \5 d5 i7 Y$ z; ]) H
  28.     ]- C. Q7 @; R$ {1 U% ~
  29. ];
    6 q/ e& {+ K+ M" `6 u* ?" d
  30. $res = $collection->save($doc);
    " e4 `2 |) G5 e3 Z4 m; n
  31. echo '<pre>';
      ~. a9 @  Y" w, M8 L5 c1 n
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    % C, x4 ^5 q2 X! ^
  33. 9 t+ Q" g" z5 _7 n* T
复制代码
  1. //findAndModify()8 ]. j" s3 R! Z; H
  2. //参数1:指定查询条件4 g8 D$ c! [. z9 M
  3. //参数2:指定用于更新文档的信息
    # s: S8 g# `/ \" `
  4. //参数3:可选,指定希望返回的字段$ W, V. a2 ~$ f5 t
  5. //参数4:扩展选项
    " Q* [6 R2 r; Q
  6. //  sort:以特定顺序对匹配文档进行排序' f6 n. ^3 V1 l. Q" k0 c" R
  7. //  remove:若设置为true,第一个匹配文档将被删除
    & W  x% t1 b* X& o% O0 f# p! E4 x
  8. //  update:若设置为true,将在被选择的文档上执行更新操作: f$ a$ z( u6 h+ I/ K4 ^, g
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档7 U" V% s4 N4 z6 z; K1 M
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    ( {& K  B# F$ _
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    3 M8 y. n: A1 P8 Q' P2 s
  12. $db = $mongo->mf;
    / r: x5 f0 y' O- J, x
  13. $collection = $db->friend;- y6 G; |8 {/ z1 C# k
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    ) V. ^5 K/ a1 x; R
  15. echo '<pre>';/ b0 y  t3 v# o' `, S
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    1 d0 y/ L% l" @  T) h% r; u; y
  2. //参数1:查询条件  }  |1 G6 s  Q% c* R" r. e* ?
  3. //参数2:扩展选项9 k: {( [* d& h. D3 v
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    4 y7 P  D) f0 m3 r6 G
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。. Q1 Q# w' P$ |$ c! [, G* L
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    / g3 f* I7 {* P3 {) N
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。. p+ j" d/ ^" F7 o' t
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    2 }- c7 s. }3 p+ [( J# o" O. B' u
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)0 C2 B# i1 j  F7 b4 z0 L
  10. $mongo = new MongoClient('mongodb://localhost:27017');1 p9 _/ N1 p  r+ H4 w$ v
  11. $db = $mongo->mf;
    ) N$ H) h$ A, w, O6 u
  12. $collection = $db->friend;2 P0 w/ l6 e2 @5 L" ]" Z/ J
  13. $res = $collection->remove(['First Name' => 'jet']);, ?* ~; }, S  ?+ u( p- |; k; w' ?
  14. echo '<pre>';
    % D- k. w( |6 _& F+ v% K0 y
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
0 ~2 M' X, w; ?# e' J* O; c
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
4 Q) K' s' C1 Y" }; ]
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

* E& b7 N# }# |* K& Z
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');2 p- E( P- o- d4 d& U- r
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 ^) w/ I% n9 j+ s5 w
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    & S/ ?, F& w7 z* h) ]+ D) n( E
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    ' C% I1 d7 P! X8 G, @" X+ i1 {
  5. + S( _5 A5 X1 G6 Z
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    & P" ]: @9 X0 ]' Y% E! o: x
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);! p& r/ G) m/ m+ |: j- M- Z
  8. echo '<pre>';6 ^( |1 H4 [' w& X" Y, j& m1 a
  9. print_r($res);
复制代码

6 Q9 D1 L  y+ s8 [2 D
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 X/ q5 t2 l$ {. u0 S) |- i) p
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);. n; A2 p2 B# _) u
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    . t+ i. b9 @) x* q/ N0 V
  4. ; r0 q$ v7 S: Y' x0 Z4 T
  5. $data = [];1 Q9 v- A  O$ l$ F+ @
  6. foreach($cursor as $doc) {6 h% N, ?  @0 Q7 f3 s
  7.     $data[] = $doc;# D4 `1 e* [( k1 a
  8. }/ u) v2 `8 {) p3 L9 }/ g
  9. echo '<pre>';
    ; Q+ a  u# ~+ x+ }4 g
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');8 p& |3 Q7 D  [
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ) n( B, e- m5 n4 L2 g4 ?7 k
  3. $bulk->update(
    7 \2 _1 W6 K9 H2 |) y7 i
  4.     ['name' => 'JetWu5'],- K% E0 \: _8 R# S8 E3 w! H" ~$ P% [
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]8 B' L- H3 Q6 I/ [% \8 t
  6. );
    + e. W7 a3 @8 p
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认' W6 g- X' r) E2 e9 E9 n
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    - _7 w$ o1 P! V+ i
  9. echo '<pre>';6 C# B8 y6 g7 Z, E3 N! `9 o: w
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    # b9 {9 ^( e3 D  a" P4 |9 q1 V. X
  2. $bulk = new MongoDB\Driver\BulkWrite;
    - c* W7 r4 b  Z+ Q' A9 h8 A
  3. $bulk->delete(['name' => 'JetWu3']);$ G: K. b: y- X  n' Y* b+ ^
  4. $bulk->delete(['name' => 'JetWu4']);5 e* \. R: ]: B! [+ j# B+ J
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    $ E  R5 |! @8 |% n& w
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);3 q! x3 A/ ?  r3 q: J! ]. @6 C
  7. echo '<pre>';" G* [7 P6 h- ^
  8. print_r($res);
复制代码
3 K) v8 V, C6 r+ b" _7 w; b

4 U* `3 w/ z+ J  @% E3 f2 \- X% q9 n3 p' q/ h( m# H
4 r7 \) ]: Z/ P* M) s
  h+ W7 G5 Y! Q9 |8 I4 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:55 , Processed in 0.059386 second(s), 20 queries .

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