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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14074|回复: 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()
    $ B; Z, d: X. S
  2. //参数1:一个数组或对象
    0 {( A* Q) j4 T6 \
  3. //参数2:扩展选项
    / q+ z' e! k0 T# O" e/ k1 \( @
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    3 m& G, ^& I3 P1 M0 `9 }+ A; ]# Y2 ^
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志; z8 r1 M) w5 M
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    2 P- k) {$ d( i* V& B% {
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # E" p( |8 n8 F$ g. b
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! e# t, U3 C# O7 b+ }8 U7 H& ~
  9. $mongo = new MongoClient('mongodb://localhost:27017');) R. b, K0 P" e- Q
  10. $db = $mongo->mf;//选择数据库- I" [5 n1 \5 Q  t1 c
  11. $collection = $db->friend;//选择文档集合
    / T% o# \* k' w6 k2 D$ o$ ^4 N. U
  12. $doc = [//定义一个文档,即一个数组/ l. \+ R4 i3 i$ u7 u$ y; A
  13.     'First Name' => 'Jet',
    $ U1 h/ f& D2 {, X
  14.     'Last Name' => 'Wu',
    $ e. l( Q% T! c/ P6 G6 R* t
  15.     'Age' => 26,6 p; ?2 N% M5 n$ W
  16.     'Phone' => '110',# F1 h  H, S" l* z# \4 ?
  17.     'Address' => [
    " @" W3 R0 t' w
  18.         'Country' => 'China',
    2 o+ m& ~6 c8 d% K
  19.         'City' => 'Shen Zhen'
    2 G# {: r1 ]' N" a) r
  20.     ],8 s, `5 d& A: ]8 A' e
  21.     'E-Mail' => [( h; F5 s% u: f! v) ?2 k& b. a
  22.         '123456@qq.com',
    3 V$ D3 d9 G1 W9 m% ?% {4 W3 r. ~( q
  23.         '666666@sina.com',
    5 g+ ~$ |. ^+ _4 B4 ?9 m
  24.         '8888888@qq.com',
    " R5 u& y' F- c' {* n
  25.         '77887788@qq.com'
    6 @; t. O+ @" g+ @3 \2 X" M" w; n# c6 L
  26.     ]$ g1 c" D6 Q4 b  P( z, A* h+ z  Q. A
  27. ];
    & T4 w$ r! c; h
  28. $res = $collection->insert($doc);//向集合中插入一个文档7 m  g, g; j7 z: b5 s, [1 ^' h
  29. echo '<pre>';
    ; }- F. K# T" t! N; q( c' [
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    / h) d! |# Z+ c4 i/ v( z$ b# z
  2. //参数1:搜索条件
    : p% ]9 d/ C2 O6 n% c
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    , S3 j: ~/ [7 L( N
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    2 T0 C6 U6 [, L
  5. $db = $mongo->mf;
    ; E- t$ a. ^4 |9 d" G$ S- L
  6. $collection = $db->friend;
    ) l5 A9 u# }( Q8 g
  7. $one = $collection->findOne(['First Name' => 'Jet']);' ^; i6 I6 ~8 T* C! e* P
  8. echo '<pre>';: v, ~* z4 F( a: B* E4 X7 i; R0 W: k
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    3 E6 i) O+ Q3 r- `7 @8 j/ _
  2. //参数1:搜索条件. y$ X) \4 p5 S* T6 p9 N9 Q
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    1 L# C8 L8 F: u
  4. $mongo = new MongoClient('mongodb://localhost:27017');& ?1 f0 `& l4 D; J
  5. $db = $mongo->mf;& x9 P; o, y8 `$ N$ l# c
  6. $collection = $db->friend;: V9 n: b' p/ I% v2 ]
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素: ?1 }: u7 y$ z0 d- Q# u$ r+ p
  8. echo '<pre>';
    $ A# ]3 `1 w, @2 y
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档. M" D# w. U1 D  F6 G5 x* Y3 I/ r
  10.     print_r($doc);
    / X7 Z, M, E' x& C" b
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    9 `4 x" [0 L% c# B2 a
  2. $mongo = new MongoClient('mongodb://localhost:27017');$ T4 I* L  F" Y3 n
  3. $db = $mongo->mf;2 s4 p3 Y2 O# k! D% e, U
  4. $collection = $db->friend;; B. J9 s0 \( |7 J; _6 K3 Z  x
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);( E' `" G+ e; G1 j4 |# Y
  6. echo '<pre>';5 a5 q1 g. V" }. M+ w0 q. b9 @
  7. while($doc = $cursor->getNext()) {& w' N+ w" a8 r5 H6 m3 t* E
  8.     print_r($doc);
      A! B: @' x4 L6 P) }9 e, ^
  9. }
复制代码
  //查询某个字段的所有不重复的值3 ~5 X6 E, v# t8 E( o9 B
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个5 s# T  X! `4 O
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    - O. `! c3 t7 R3 l- G
  3. ' u4 F" V1 S" X1 F" ?7 z: J7 M
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    3 x( C/ M( V8 ?! }  \# r  G* Q
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);9 W1 u) M1 }5 V! p
  6. 6 v8 `- Z2 ~8 o, f/ Q- |. ^; Z
  7. //$or:或查询
    8 v" n% U' e' i+ d$ `( k4 A: T* E
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    & M1 I2 ~) ?# q6 p/ c
  9. " Y- g% `/ b8 T( i* a8 Q
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中( q& A* [7 P5 }' h/ \
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email& k" j, u8 r% W  ~- ]' V; n
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    9 K2 C( U: [6 A/ l; A& ]; v# J
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    ! F) G! ~, s) Z0 v! t

  14. ' F5 S/ |) I0 n! B! b0 M7 e
  15. //$exists:根据某个字段是否有设置值进行查询
    ' a( \$ P" b- Y; L5 }  {
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    1 }6 U3 J) Y, E! ]! c- n& }) }

  17. 5 T/ f3 H9 \. a5 l/ y7 F! D
  18. //正则表达式查询3 b* {; M: }6 y& E6 P
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序+ j9 l. K1 p8 ~2 B7 P* U
  2. $cursor->sort(['Age' => 1]);
    % e4 i# `) B2 @' r) h. F' k8 L

  3. + d/ `" |; i/ G4 V( K  K
  4. //忽略前n个匹配的文档/ p, w- a" g& [$ L
  5. $cursor->skip(1);
    ' K, Z# w; p" m7 J# s( l; O
  6. $ Z6 ?  o, Q" m
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)0 G, t% a- O+ {
  8. $cursor->limit(1);
    ; E! K' O: g. x1 g; _( L9 w8 H

  9. ! _8 u$ L2 j  l4 F3 N
  10. //匹配文档的总数
    9 S4 I. [3 p: y% h8 `) @
  11. $cursor->count();
    / O+ O! j& W, M3 e9 v$ R5 O9 w

  12. : b) A- Q$ y: Y. H
  13. //指定查询索引
    + j  A- w) f4 U1 L# ?3 g5 E
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    9 Z6 O: d3 A7 Q
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    : S4 c' z8 y' ^! M; m
  3. $db = $mongo->mf;" e3 I3 @) Y% x, \
  4. $collection = $db->friend;% T; O, w3 k) G
  5. $res = $collection->aggregate([
    + w- G( y$ i" L4 `$ L$ d9 f
  6.     '$group' => [) u" e2 ~3 x# U* b* G, ?; g5 {! n5 k
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    / }/ b# M4 o1 K, Z
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 k- M9 B: u( _9 ]* n) d, |
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值# V3 x4 E6 W8 [+ I* S
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值8 q! o& g% d' y# m+ q( b. ]
  11.     ]9 Y4 a3 Y+ W+ h: t
  12. ]);
    8 R; ~. t( p2 y1 q
  13. echo '<pre>';4 c* a1 ]: B1 |+ M" |
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果* [9 H) w, [7 P

  15. / P; ?( R$ v' W1 u$ L+ {

  16. # F: s0 E3 S) z* G( n0 W
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    7 |- U/ k9 f4 `% B) i. @9 T; A* k
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    4 m, \( k- p; K& Z8 X4 }( n
  19. $mongo = new MongoClient('mongodb://localhost:27017');" \% a! M* ~% b8 {1 J. ?
  20. $db = $mongo->mf;
    $ ^6 d# t' ]3 f/ l7 J3 B
  21. $collection = $db->friend;" [, Z( r( \8 \# h$ P
  22. $res = $collection->aggregate([
    9 s- {0 @! O: A) }
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档- ^9 U9 \; K; W6 G
  24.         '$match' => ['Age' => ['$gt' => 30]]
    + r, Y% q4 o/ u+ y% ~
  25.     ],$ f* f1 A0 G7 ~- P/ y" ?
  26.     [//指定分组字段、统计字段
      M- T% Z. c) M  F# D
  27.         '$group' => [
    . B9 g/ {; e: V) R. i% Y
  28.             '_id' => '$Address.Country',8 m* ~8 C9 Y; ^8 N' k6 [4 o: T2 ^
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和" q1 ~9 {( F  j2 L
  30.         ]
    . }" n7 ?, B1 N4 U) h
  31.     ],( _; P$ V: Y: q& r! n: T  s5 h& U
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档3 i+ I: S1 K; J/ p# L- c+ J$ i
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    9 F. o1 A1 q+ s. n
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名* D4 a2 o- U1 f  y/ D' ~
  35.     ['$skip' => 2],//跳过指定数量的文档
    8 [6 L( x$ P( }) L. W! l0 T, S8 E
  36.     ['$limit' => 2],//只返回指定数量的文档
    1 e* b- L, ^3 X" A) F
  37.     ['$sort' => ['totalAge' => 1]]//排序. f6 J7 V! s" `# x' Y) ?
  38. ]);
    , l. s* c1 I( o% o; [
  39. echo '<pre>';
    * f0 L+ t6 t9 o* I# {* k
  40. print_r($res);
复制代码
7 g! j9 [. B( n5 V. i
三、数据修改
  1. //update()( K- s/ o3 n, I+ d7 z1 Z3 l
  2. //参数1:更新条件,指定更新的目标对象。
    4 m$ B5 G5 Z7 e; R- E
  3. //参数2:指定用于更新匹配记录的对象。
    / B  A; v* y$ P  L" i0 k
  4. //参数3:扩展选项组。
    * P% r) d$ |( g7 k3 c3 C( j
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    1 E7 v# p7 S( Z5 L
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。  Q$ g3 C0 \. `) ]6 _
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。; Y! F$ [6 M9 x4 H- J  M  n
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    & d) ~# D; \3 N& C
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。7 T6 |$ @& w! C0 u" r  S6 W
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    0 T% ]8 J4 L3 y# v3 j; c3 X
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    6 m7 }8 A6 A& D
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。  Q. d" a/ O8 s3 K; `

  13. : f6 I9 D4 N2 N
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    % `( I& R5 ?" L/ g
  15. $mongo = new MongoClient('mongodb://localhost:27017');. s+ S. _% I$ i) C$ K1 v  W% G
  16. $db = $mongo->mf;
    - b4 X% K3 K7 @3 b
  17. $collection = $db->friend;
    # l: v& [& m: E
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    $ k, c4 J: p$ h" b2 C2 z& `
  19. echo '<pre>';& f$ H9 ~- i8 d; k
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    8 }+ ^; C7 d1 I8 P9 R2 t$ b- Y

  21. . h% }" l4 j) H1 a
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    - `5 M6 Q" e! G0 W& W4 {( n8 I
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);* q3 f" r" Y' N" b2 g  D

  24.   J9 _- E1 n4 `* x
  25. //$unset:删除字段7 L  \4 a7 F' q: L$ g- t
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);; X+ v- r1 ^; ?' C
  27. 5 F% {3 G) W# ]+ L
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    ( w; A! m6 ]; r( c5 E& @) O4 Q
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);1 U) {5 e/ x6 m( ^# C# Y  {
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。/ S! Q' f( \5 y5 _' c( G9 H* l
  31. + c  _/ b) {% _! H" v7 x
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    $ w" L- ]% |- N0 n0 T) Y2 d
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    + ]9 c9 f+ @6 c" I7 r  f& P( ]

  34.   D  V- [2 ^0 R6 _8 r
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错; V6 }/ I) ^. H- L% s6 k
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);! H: P+ O# Y( ?- j6 D& W  T

  37. 0 x  k( ~1 p; ~+ x6 _: t
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, {  i5 e2 Z6 _* S4 m, j) ~; d& M
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    6 B9 y8 a. z& n/ o. c3 E
  40. + h1 a7 i2 V& d# |3 Q" p
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
      `7 d9 L6 r, Q/ S
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    4 m' w) x$ ~. F! ]

  43. + R; L; N3 T( v1 y+ @0 B
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    / c8 A2 `7 t$ ~
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);6 K$ |" x& W: X" u3 r  X. [; T+ f& _
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);3 H% s# v5 |+ |; z% w

  47. 1 P/ h1 `, T% w1 A& b4 }5 B
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)* y+ {/ w6 P9 R! ~+ J0 ]& y
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);& U: J% h3 C$ q

  50. : }5 ?# C8 L5 [* J: K( P
  51. //$pull:删除数组中所有指定值; l: F3 p2 W6 W* p2 G
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);+ b( z& l6 k2 @5 j. x" }7 o

  53. # _9 r0 O' `/ L( o0 B
  54. //$pullAll:删除数组中多个元素的所有值5 a5 Y6 u/ P3 ^4 H+ t* A
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    " E2 ^3 B7 Z. [! o5 v& S5 G
  2. //参数1:希望保存的信息数组
    ( W7 K3 ~' o- r5 }
  3. //参数2:扩展选项
    . j- Z3 W2 h4 m- w; ~
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    % j" ~( }1 I- T3 ~- O& j' I
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    . ]( b1 Q3 q2 {# \
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。# |" }+ {: o! B1 F6 ?6 B
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; l! ^3 i. L6 ?! |5 s+ W; i' @
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ) j, Y& J' ^- U3 x+ V5 O
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。2 u" ]1 |; w' p
  10. //若想更新则应该在参数1中指定_id键的值。
    9 `9 B9 Z5 F3 x6 O
  11. $mongo = new MongoClient('mongodb://localhost:27017');+ r' q- ~# L. Q
  12. $db = $mongo->mf;
    ) k# l1 t4 U. u; f) t
  13. $collection = $db->friend;
    6 b) l& e# Z' [' E" ?
  14. $doc = [//定义一个文档,即一个数组
    , k; A/ N: K' A. q7 c+ g
  15.     'First Name' => 'Jet',4 T4 H/ T9 X9 [& z$ u
  16.     'Last Name' => 'Wu',0 A* N$ j+ Z2 J! ~& q
  17.     'Age' => 26,
    + y9 K; V) a, [" b
  18.     'Phone' => '110',7 Y+ S* I; A, @
  19.     'Address' => [) r/ w+ i6 j. ^( ~; L* V% V" T
  20.         'Country' => 'China',4 c: C9 |1 r  \6 j  I& ^6 G) z
  21.         'City' => 'Shen Zhen'
    % a4 z3 K4 T0 L- V% l' W
  22.     ],9 Q+ Z; I( y* H& a) {# O, h9 P% E
  23.     'E-Mail' => [
    : X& D  p/ _/ T" i
  24.         '123456@qq.com',
    : M2 i9 D2 d. p4 n! S+ D( L" ]9 j
  25.         '666666@sina.com',6 G; [& N% c# J/ l
  26.         '8888888@qq.com',6 U  U. U' L; M! ?& [# S8 r
  27.         '77887788@qq.com'- k2 v8 f* K' O- _
  28.     ]7 p; \5 K% L/ r. i/ d. G
  29. ];
    6 K, F- J5 ?2 V( A$ D
  30. $res = $collection->save($doc);6 o7 w4 W) C7 g' }2 p0 q
  31. echo '<pre>';
    ) y4 P6 C& _9 `) Y
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    . i5 y! A- g( _" Y

  33. 9 L& N( a9 I. E) h3 D
复制代码
  1. //findAndModify(). J& c- J& o3 n; I: P6 n$ P: l( A
  2. //参数1:指定查询条件
    " x3 M6 R+ X4 g. T) t. X
  3. //参数2:指定用于更新文档的信息- |6 Z$ e/ n* E$ ~# @' W% @
  4. //参数3:可选,指定希望返回的字段
    % d+ G- _% j, M$ |: W* }
  5. //参数4:扩展选项4 H( E1 t6 `" H" v
  6. //  sort:以特定顺序对匹配文档进行排序
    " N' n, {& W* F, h
  7. //  remove:若设置为true,第一个匹配文档将被删除
    7 i4 t2 @) g/ E& ]3 {
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    # `" N8 ^$ c8 G7 C# k
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档4 I# B; q9 b1 `0 o5 |' Y
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档: \6 k( l: v2 j" \4 b- ~0 H
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    : M; U5 _( s' ~7 l4 P
  12. $db = $mongo->mf;
    0 V4 {8 R1 V  J2 e
  13. $collection = $db->friend;4 n. o& n+ f8 ~" f- j
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    $ N8 |8 g0 H7 u' H8 x
  15. echo '<pre>';
    0 X6 T& P: z$ z! O) G# M, E' Z* R
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    9 b; c8 t+ o8 L# h. O0 W" j. R
  2. //参数1:查询条件% k. ^1 |* |6 T
  3. //参数2:扩展选项
    1 ~$ l+ ^+ N5 G! {. e' a+ c
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除2 q$ r- ]5 Y! N* g; m# |
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。, I7 L0 N& E* p% b: M
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作) L4 q- v) s$ ?& k( w9 I9 ^5 ]
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    & n" c1 r" i8 ^  `% ^) l
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    9 K. R5 c: y% O! `, O
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    % U, X7 K2 C% f) R; F1 H
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    ' ~- c. H3 O. J8 J5 V& h; {: ]
  11. $db = $mongo->mf;6 k5 B/ Q7 v* _9 Y( Y3 h/ V
  12. $collection = $db->friend;
    # O* U6 F2 H4 A7 ^3 }/ q
  13. $res = $collection->remove(['First Name' => 'jet']);( [) h' `; ]+ Q/ z
  14. echo '<pre>';; w4 H; H( f* b
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

% X( S$ p6 p9 u& @
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

, d8 L4 @% i% E$ L
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

% {: C+ u' r. `! L/ G
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 c, Q, u: d# J% o: y
  2. $bulk = new MongoDB\Driver\BulkWrite;. ~9 d+ I% D% M! t3 H% e
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    7 L) @3 t* Y7 x* r. D+ A+ Z
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
      W' l! _% A: k/ M# g! u
  5. : J+ m- ^( g5 L
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 Y# l; s5 Q  ~6 q2 z* }
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    6 W) H) K" ]  h  p1 @
  8. echo '<pre>';
    & z& T  I. T# G$ c# z- B
  9. print_r($res);
复制代码

; i. j1 K1 u/ O+ ?
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');" @8 K& c& f3 C' a" N$ E4 C
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    " J( A  d; ?* O( H
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    % C1 Y7 E# ~9 r: w

  4. & P( ~0 [- B% B2 m! |) L9 @0 W: |
  5. $data = [];
    % Z: F- O1 c0 q3 s1 l, S
  6. foreach($cursor as $doc) {
    ! k# U  T6 S$ B2 w1 G6 Q
  7.     $data[] = $doc;% d( G1 B0 ]" I* p0 l& l! N+ M4 X
  8. }7 _2 W  p$ Q5 N2 g8 t, C7 {) m
  9. echo '<pre>';- a, m2 e$ x' @
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');: m* ?: t% ?! r: N7 X+ C( G  o" j
  2. $bulk = new MongoDB\Driver\BulkWrite;
    " G7 E( Q/ @3 `
  3. $bulk->update(
    ' Q, B1 ^& |0 d+ o: {' m
  4.     ['name' => 'JetWu5'],/ Z: Y3 V+ p+ ]) Y2 t2 o
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    % T/ i+ k1 ?9 Z
  6. );
    $ X2 F& Y" i4 e) @% c+ O3 g# l* C
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    % {% K! N; _* S
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ V9 j. l- j2 Y0 @
  9. echo '<pre>';
    8 \* G7 @" W3 @$ z6 E* H
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    : Q" d6 `$ o1 r" i: }  M4 D0 Y- P/ m
  2. $bulk = new MongoDB\Driver\BulkWrite;8 q; u8 X1 s% ~. m0 }! {
  3. $bulk->delete(['name' => 'JetWu3']);, ~6 e8 I5 a% v; r8 r9 n5 @
  4. $bulk->delete(['name' => 'JetWu4']);
    ( A6 m" t. b! H( M
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认  }* O8 W2 U5 T0 k. ?' d
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    * y" O+ a& D: S! p; k( H7 x  e2 g
  7. echo '<pre>';
    2 Y+ x$ X" b* n/ D. e8 _+ c
  8. print_r($res);
复制代码

# ]5 r' V3 A2 e
% L) i: Z" \7 G
+ O  M- N4 I+ x0 W6 B* D

, ^! n6 Y# _! V  x$ w0 J
+ |( q* [) N9 s4 @% V6 f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 02:05 , Processed in 0.068328 second(s), 19 queries .

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