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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9696|回复: 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()
    : Z8 M0 a" T- _' [" ^7 L2 [  a
  2. //参数1:一个数组或对象! X5 P; o, ]1 F+ J0 c! s
  3. //参数2:扩展选项
    7 p/ B0 d5 K* d1 \% w; n6 F0 w# \  E
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
      W% n$ p7 r4 ^' M8 P. u' W! J6 [+ x9 f; n) x
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志# s1 G7 {/ Q: [5 d5 U4 d0 _8 H
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    . w% G, E( G% F$ A' ?3 l5 ]
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    $ {" P4 B( q( C- ~" t9 t/ ?
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    / T* ^' B/ E! F/ C/ N! A" [
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    4 u( x; O" ^+ d
  10. $db = $mongo->mf;//选择数据库
    ) V  p, |* ]' \& z; V$ K) V
  11. $collection = $db->friend;//选择文档集合
    ) n" {: ?0 o- c; q- }% i$ E
  12. $doc = [//定义一个文档,即一个数组
    - O: K( c& U# ^7 a% p- g' _
  13.     'First Name' => 'Jet',
    : Q- W7 z3 i! ?- X
  14.     'Last Name' => 'Wu',8 j! H( U" u) J! _2 [% y6 t8 B3 t
  15.     'Age' => 26,
    & W5 \" m6 t* k7 b. E- q
  16.     'Phone' => '110',* B% L2 v' B  m+ \! A0 n
  17.     'Address' => [
    * |3 Z7 W  K4 s* h/ Z; n
  18.         'Country' => 'China',
    ' J( M3 P5 b! _8 l1 A
  19.         'City' => 'Shen Zhen'
    & O! S- S4 E2 W7 K! d
  20.     ],# }* s0 [+ i1 [5 s3 @( v0 X! a0 N4 {
  21.     'E-Mail' => [6 E4 q" w$ C! u' a
  22.         '123456@qq.com',4 m; H4 U' X; s( t5 r5 X
  23.         '666666@sina.com',: S! ~% b( F; C9 p
  24.         '8888888@qq.com',- t5 ?% @0 B. x3 u- c0 _; l+ G
  25.         '77887788@qq.com'- y/ e5 A1 \0 z: S# V  `
  26.     ]
    4 o1 m- S8 q! r( J6 \" Q
  27. ];; q0 v: c7 ^1 v; Z
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    + _: Z: H* |% E6 |5 f! d& _" M
  29. echo '<pre>';7 J% S& ^; p& x: B' H
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    1 H0 Y, `* L6 q% `- C
  2. //参数1:搜索条件; ?7 q1 W3 o  \7 K- z0 S
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    " O, V; _: H- r" e
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    : ?/ i& @( N3 t; T, j7 L
  5. $db = $mongo->mf;
    3 s. ^( W( u4 s# _6 j
  6. $collection = $db->friend;; f" Q* |- |$ ?. l
  7. $one = $collection->findOne(['First Name' => 'Jet']);. V, j  {& g9 z( q. @/ e3 w# l
  8. echo '<pre>';0 E$ K! o1 u6 A( q& C' [" J
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    # U9 }) r0 T9 a, q. J# O3 r& L
  2. //参数1:搜索条件
    : b9 l5 r- `5 j9 g/ w
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段" D. L1 m; ^' Z2 U
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    0 B9 W6 ]/ }6 k, l' O: f
  5. $db = $mongo->mf;( Q# P% `, o6 I7 \$ l7 |
  6. $collection = $db->friend;: A8 c8 d$ p% W8 o1 i
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    " z: h! V8 h& D4 ?8 `6 b
  8. echo '<pre>';
    2 l6 {- p8 s3 y' g, }) O
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    ( d4 S3 o) ]; M- f) _
  10.     print_r($doc);. `6 i4 x  t9 k& M0 {+ y% w' K
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询+ t# ?) V4 g: Y
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ; L; r5 _9 e5 l3 w* U" o- Q5 l2 D, C
  3. $db = $mongo->mf;
    0 \. T) ?# ?6 A/ L: ^$ Z7 L
  4. $collection = $db->friend;1 j" c6 R; Z7 `+ g; t
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    8 e" h0 V3 |0 `5 B! d8 D! ^
  6. echo '<pre>';6 V8 f: M# ?- x& l! S7 s
  7. while($doc = $cursor->getNext()) {
      R$ {5 A/ m% v( G$ }5 v
  8.     print_r($doc);
    1 e+ [1 W  j7 Q# j: n$ L3 @
  9. }
复制代码
  //查询某个字段的所有不重复的值$ T5 x1 ^+ a: c1 j$ {3 M
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    ! ~7 U  t, x6 \! _
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);) K7 y# c7 Y$ F, a) q
  3. 5 ?" @) Q; K* m2 c2 S2 T' ?
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    + N7 `5 H" w5 C
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    8 b, a5 J; @' R- r# B7 q
  6. * v$ x- P7 w' A3 u# U
  7. //$or:或查询
    + [( o, r) c6 s6 ], ^+ D7 j( B
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);8 G+ c$ ^0 d2 m- ~6 _8 `; O+ j/ k8 t
  9. ) n8 B+ c) |+ ], M- O7 e& u
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中8 H1 C0 {, R4 y" ^8 L0 R+ c
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    ' @& @" K0 W! A& @
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    " `- Q7 c  i0 G' U" m
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    $ |; n! d1 B0 k2 J: U( q2 W

  14. 5 i4 Y2 g5 ^" j2 W. |6 d: G
  15. //$exists:根据某个字段是否有设置值进行查询! l  s2 P/ M2 T. O4 G' o
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    $ a& ]. \4 i% t7 B. w) ~  U5 H

  17. % P( ~# [4 W7 p& o% L( v
  18. //正则表达式查询
    3 P' R1 a' O7 x: P
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    ; z9 ]) R- A7 ]9 v4 F% f
  2. $cursor->sort(['Age' => 1]);% I9 v; l$ y8 X: l

  3. + T+ t% E: C* i5 v% ]- y- D" d
  4. //忽略前n个匹配的文档' E" Q: x0 ?! B; v, {$ K
  5. $cursor->skip(1);% I' z' v5 j9 s1 A
  6. - F2 a/ J1 G1 e
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    ; u, E. y* i6 ?1 y1 `
  8. $cursor->limit(1);
    3 m5 D# s+ Y/ U2 L
  9. 0 Q7 i- x  v1 m. y6 x# y( C
  10. //匹配文档的总数" _% S3 U/ D1 R: ^7 R) H4 i+ d
  11. $cursor->count();
    $ j! p- T# }- Q1 I; [/ V
  12. " T( d  ?$ S' T8 g7 J
  13. //指定查询索引' |" U( k* {6 [" N( p  m# Q' @
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    # T; I1 R3 `3 s
  2. $mongo = new MongoClient('mongodb://localhost:27017');1 _6 O( J! j0 `8 Y8 H
  3. $db = $mongo->mf;
    + s1 |# Q# S+ ?& O
  4. $collection = $db->friend;: Y1 R. _  g/ r& r+ p
  5. $res = $collection->aggregate([# G- z. H8 y/ \+ o1 A# J
  6.     '$group' => [) O% G: H1 \7 \4 l
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    1 }7 E  T& ]. T3 I* i
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    5 D% X, p4 n' ?: P9 H; l& X2 J
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ; I! r) ~1 j6 a( g( e! R# S
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值. \: U9 h  V) w4 \
  11.     ]0 f' a1 {: o' Y. r
  12. ]);8 ?' e  |+ S# D  M* I+ ?) l7 f
  13. echo '<pre>';
    5 h! [; _8 X5 D: j8 \8 B* m$ u4 k
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果8 v4 l, }* c' t+ w' D/ U

  15. 1 S( a  W0 T5 A, v, c
  16. : `3 D/ s: R5 ~+ E* h
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, Z2 Q, b' _4 I' u% B# q
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    1 s2 ?! B. W9 V( n4 f& y8 ^
  19. $mongo = new MongoClient('mongodb://localhost:27017');6 n0 F* x, O7 v7 D/ w# P
  20. $db = $mongo->mf;/ z2 w: _' y+ S6 v7 z& A
  21. $collection = $db->friend;, `0 l8 Q. t6 a, F" R  [" ~/ |
  22. $res = $collection->aggregate([! h& A' ~' I) A# J( O
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档1 e  H: G8 d. H1 [4 [8 J9 X' u1 P2 F
  24.         '$match' => ['Age' => ['$gt' => 30]]( d: x' e) Q0 Q5 o& |0 ^( }
  25.     ],* l: ^8 e8 q  J& @, e/ X( ]% y
  26.     [//指定分组字段、统计字段
    ; @7 w, Y1 ~; Z  c/ m! d$ R- `9 O0 \
  27.         '$group' => [/ R& \$ X$ O- _- c8 ?
  28.             '_id' => '$Address.Country',
    * G* D! \: J; S8 U2 Z& ]
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和5 ]3 E0 a2 L6 H$ C! K2 v, [+ K0 U
  30.         ]4 Q% R2 N7 J0 p) O4 ]- |
  31.     ],
    ( t6 S$ [/ p& C+ i
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档; E- g$ |# ^, B3 a$ `  n8 n
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    , |4 ]# V7 _4 g7 m/ v+ U1 D" A: Y
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名$ u. F8 B, v8 ]8 I
  35.     ['$skip' => 2],//跳过指定数量的文档
    6 a; I7 F; s0 {8 k
  36.     ['$limit' => 2],//只返回指定数量的文档
    ' n3 f# e8 @8 q. r+ y
  37.     ['$sort' => ['totalAge' => 1]]//排序- @: n, i3 Y6 o
  38. ]);
    5 g/ ~  v2 G  a) L; s. u
  39. echo '<pre>';6 i( z. y, U1 _0 ?% O$ _
  40. print_r($res);
复制代码

4 t0 E( K1 g0 n3 h- g
三、数据修改
  1. //update()( a" c0 r9 |/ G4 L
  2. //参数1:更新条件,指定更新的目标对象。
    : u/ f' @- y- b- U7 k8 L# s* F6 {
  3. //参数2:指定用于更新匹配记录的对象。
    ( K- s2 l( l, M) l- K7 C; O1 {
  4. //参数3:扩展选项组。
    # W+ ^* V- Q( N5 d" h
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    * l9 e: `- A  o# ]. j+ s$ b
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    8 e, ?) C" E* S% y" x
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    0 i5 T, [3 U! Z4 L5 a
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' O/ \: F6 Z; Z
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ! y8 E3 ~/ J0 H/ @! N/ M* z
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    + R. D: X& }: c! f! c" I6 [0 X( M8 C  @
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)0 ]3 Q: ~3 e' g4 c
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。: ?% C+ h" ?; Z) W3 P5 Q1 R
  13. & G+ C0 A. b: t+ K
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 e' q# L* E, r! q6 X
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    9 n9 P& ?8 k* }% U
  16. $db = $mongo->mf;
      ]. @3 Y! r2 ?
  17. $collection = $db->friend;. B/ V! V, j' ]: P8 I
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    & S+ @! `3 P5 ]! ^: c
  19. echo '<pre>';* D  {1 j, k; u
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    % Q5 Z3 M7 H' _8 g& z' J$ X% p

  21. - j6 p5 u7 x0 z& \
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    0 y0 D0 r5 ]$ E0 {
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    : [4 d; J8 d( [+ T7 t* z* B6 m

  24. ( q1 l) `4 a7 L" s' I4 w. B
  25. //$unset:删除字段8 n& \# F( q# T5 r
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    ( F% |$ c# j; r, _
  27. 3 b. l6 m$ A, Z9 U4 ]
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    2 E) s" q6 N2 `0 t( i3 V
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);8 O; d1 C* n% ?- v$ Y9 @
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。  r# n9 F6 }! a# e  s

  31. / V( |4 \" M8 R6 a. L/ V
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    ! {( {! |( y8 r4 P7 w/ [  R& u5 A
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    ) ~2 k9 A8 K) N$ F5 h: A
  34. ; l% n  i$ {# Q
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    8 B4 ]7 s7 z% K' v) Q
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);8 S4 I; `2 o0 A5 v( e
  37. # }) j' T( J$ x" F* H+ C- p- O
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错) `& i. Z/ m& V# b! R' Y. q
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    ! S2 m0 E& u1 l& Q/ u% Z/ {

  40. * G3 E  O5 }$ v. [" B" P8 O5 t# ^
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    & f5 y0 ]. R8 P6 N; y$ C, n( p
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);( [0 [1 H  m% Q; L" G2 f) B# u% I5 ?

  43. 9 T0 ~+ }" W0 D, A) ]9 q+ y
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中). M; }1 A! \2 Y; V& {5 N
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    ! L0 u. z' F# {$ A6 y, W, r. s/ ?
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);; j$ H$ a) v# w, S. ~

  47. , s- M8 ~- o1 n1 [/ G
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)* s1 ?0 a: J( j6 a( a! e
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    2 ?+ Q5 u& e: Q+ _" R

  50. 8 s) j+ m7 T2 m9 N
  51. //$pull:删除数组中所有指定值
    2 B. j( b9 U8 w. n3 A% b
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);9 o4 h$ b! M  K6 Q+ w6 ]

  53.   I$ c( ?; y; j. Y; V  p  L* E) j
  54. //$pullAll:删除数组中多个元素的所有值' O, L; _( t) y. a- S* ]
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()* c$ g! z* @  P, ?2 W  r
  2. //参数1:希望保存的信息数组& v# Y' W7 c: n0 J& ?2 t' S
  3. //参数2:扩展选项
    8 ]2 T5 ?# ~3 k7 d
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ' k8 C6 c( `3 G. Q
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    2 l- O/ H+ H! j
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    + _% V& F6 p5 e; h
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    : m, l+ V" S- W) z1 q9 U: J5 s
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)2 s- ~% A6 e6 ~* |& j  g
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    7 e( D# a' R9 ?( S; {4 y; B
  10. //若想更新则应该在参数1中指定_id键的值。
    * P& i! X5 Z! ~0 ]: F4 J; M- p' _$ P
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    " i, F/ [* y$ k. S/ n$ l( O" `8 l
  12. $db = $mongo->mf;+ N5 F% V% i- Q! Y
  13. $collection = $db->friend;/ v6 C4 A( @& Y
  14. $doc = [//定义一个文档,即一个数组9 c( \- a' a$ ?% d# R
  15.     'First Name' => 'Jet',
    8 h* ^) d8 f, A: M3 j# t% y
  16.     'Last Name' => 'Wu',
    : J3 f+ p- f) ?; W# P
  17.     'Age' => 26,
    8 ^: N) y& g6 U, p
  18.     'Phone' => '110',
    * ~/ O9 p! c. w# r1 v
  19.     'Address' => [/ Q4 x  ~* ?$ e2 D# t6 Z" V
  20.         'Country' => 'China',
    , _5 |: N1 i* _* q
  21.         'City' => 'Shen Zhen'3 |2 i' x2 Z7 h( c7 n! P6 Q
  22.     ],
    : v" V" b% a% q5 i, X# r4 |- L
  23.     'E-Mail' => [" K% j/ U7 o# y6 I5 q& ]3 a
  24.         '123456@qq.com',
    4 H. F9 j3 o% ~+ p
  25.         '666666@sina.com',$ R( Q& e" O$ X" o7 M3 q
  26.         '8888888@qq.com'," I% o* S; Y7 }# w/ _7 v& L
  27.         '77887788@qq.com'( @/ X' Y6 o' a( b. x
  28.     ]
    / w, k( o5 O1 L# f. L
  29. ];/ l' t- R& A  \. w- h1 ?
  30. $res = $collection->save($doc);
    $ ?. E' o) _; ]1 x
  31. echo '<pre>';
    4 l4 J6 R6 O4 s6 \4 C
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    3 c' n! L9 Q1 t) C  O0 ~4 h
  33. , _2 R2 L* g7 V4 M6 Z2 R' N# l
复制代码
  1. //findAndModify()2 }4 u- h" P" P
  2. //参数1:指定查询条件
    # v6 M/ n$ u* O. }$ @# w
  3. //参数2:指定用于更新文档的信息6 U- Q" m5 y- h
  4. //参数3:可选,指定希望返回的字段
    - u' l% i2 S* ~" O) p1 \
  5. //参数4:扩展选项7 U3 W0 v1 b3 K
  6. //  sort:以特定顺序对匹配文档进行排序
    * a) w! s6 F$ n6 {/ y
  7. //  remove:若设置为true,第一个匹配文档将被删除: ~; t  Y/ ]! p/ X% P
  8. //  update:若设置为true,将在被选择的文档上执行更新操作" e& t" t+ [( h/ s2 H
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档  H7 y2 E; E: g6 N: R) \
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档0 |( @6 K- A6 m9 z4 B
  11. $mongo = new MongoClient('mongodb://localhost:27017');
      ~# {, S, \/ a; \' \. O
  12. $db = $mongo->mf;
    3 y+ T9 v' v% B+ V3 z
  13. $collection = $db->friend;8 n* E# X9 d9 o5 _
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    ' A, z( a2 H7 C" j
  15. echo '<pre>';
    ) {5 K; \% }* N* x/ Z) P) H6 f
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    2 a$ M6 x9 D% E
  2. //参数1:查询条件3 C" n& O3 ^# s+ K6 ~$ A" M2 r
  3. //参数2:扩展选项
    5 }/ h( N  [, S* T  G
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除7 D4 o9 s! H* r( ]
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。! ^5 c8 T$ ~# O, x; j. n2 |
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    & ^- B! Z) w" b: B6 {# c1 Z7 a3 t
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。; l9 |7 S- q0 K4 H
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # E; G6 V3 C4 V$ x
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    " N: U/ Z: l: C4 G9 U. o+ l
  10. $mongo = new MongoClient('mongodb://localhost:27017');) ^( s& L% i6 S% l. S
  11. $db = $mongo->mf;3 @6 J! a) [. T7 E7 @( [$ Q7 O" I- Q
  12. $collection = $db->friend;
    ; t, }0 I; B) N" [& L5 g' r
  13. $res = $collection->remove(['First Name' => 'jet']);1 F) D  k: i1 d, B, K- X6 q) i9 P
  14. echo '<pre>';% y- v- J3 b% w$ o6 \. n" D' b) m
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

' R% b8 v; k8 g- _1 `
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
0 X6 D3 }/ g( B0 I. }9 S
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
) T" R5 y+ G7 m" ?( j& P
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ! Y1 O% d- d" F0 B3 \
  2. $bulk = new MongoDB\Driver\BulkWrite;! X; B0 F1 a( K  ^6 q$ e( t) w
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);: V: N' p& m9 ~( F7 T# O( |
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);8 b- A7 S1 n+ W, A6 X7 ]+ Z9 ^

  5. , I0 p4 \- }6 g! h8 T
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    / {" e9 E2 F4 t* l+ h3 l' r/ v
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ e1 G' n8 [$ [2 H3 Y# m; `" P
  8. echo '<pre>';
    ( e; n/ N: b/ }) u3 `8 I, D
  9. print_r($res);
复制代码
5 H8 P% I. |4 V0 T# U1 u: P+ d7 [/ D
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');2 R; ^6 L4 y5 M1 V( m! z
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    2 u( x: |7 ^. w2 Y* x# [
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    . r2 i- |# C1 f6 Y; `
  4. $ L* v$ @8 N, m4 }
  5. $data = [];5 }0 z/ p. m1 t% q6 I& i3 [
  6. foreach($cursor as $doc) {
    . j0 f6 l9 G1 ~1 S
  7.     $data[] = $doc;
    , y6 \0 c' z! y/ q
  8. }
    % S* m2 }8 |% M, F6 s0 a+ ?' D
  9. echo '<pre>';
    % }% C7 s8 w; ^5 U+ K: T2 c% a8 \8 B, @
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# l2 p  S( `# D( t* \
  2. $bulk = new MongoDB\Driver\BulkWrite;3 T4 [) D5 I' T
  3. $bulk->update(
    7 X# @4 ~8 @# H! k& _% A" Z. ?
  4.     ['name' => 'JetWu5'],
    - Z( s' F% g  K- o7 d: P
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    8 y; w' o) [7 b7 ^7 c* \1 m6 W
  6. );
    & _& x- V) j& F+ v
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    2 J0 U9 N; u, i: g
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    6 b3 f2 \) ~2 H5 L( t7 v( x
  9. echo '<pre>';4 M% B: i% ]% [+ X
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! A2 ^8 G& @: C# t# f. W7 G
  2. $bulk = new MongoDB\Driver\BulkWrite;5 t+ |, B* A7 ^' c& X
  3. $bulk->delete(['name' => 'JetWu3']);
    2 y4 M# D9 J/ f- y. p
  4. $bulk->delete(['name' => 'JetWu4']);; q7 {6 I% q  t  r$ s% `
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认! s$ S+ F# e  ~. k# P8 g
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. X) @1 {9 A, R7 E: W; s
  7. echo '<pre>';9 J' X6 F  ?+ J/ j" ?6 V
  8. print_r($res);
复制代码

% X9 A2 K. M/ g+ M+ |0 b' A9 C* U' x1 a

7 z% r+ |$ ~7 L4 s, P' j/ H5 \

, C, _1 R: L" \) r: f9 i! l- F4 _8 s# W& a; n9 v5 l% Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-23 01:43 , Processed in 0.121204 second(s), 19 queries .

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