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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12600|回复: 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()
    ; L% C) t( i7 H! m* a0 h
  2. //参数1:一个数组或对象  L; k9 v* c) p2 v7 |, u$ w: \$ w' L$ a
  3. //参数2:扩展选项" M( e& a& k( C! O2 G
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    1 o7 t: N* i5 K3 H1 w& a1 k2 ?
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    - ]8 c$ p! E1 D; ~: S: C( q' a
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认2 n% e! t) W/ h8 R7 {' N) L
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    2 T0 S" h0 D( `9 ?/ r5 @
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒), N$ r; o3 C( w# t* U2 ~: _1 P
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    + c; _  Y. F8 M
  10. $db = $mongo->mf;//选择数据库
    ) Y, D+ b& \+ J5 t) y! ]. n4 }
  11. $collection = $db->friend;//选择文档集合8 w8 w2 x4 [# Q0 m) Y
  12. $doc = [//定义一个文档,即一个数组
    8 }$ F/ @+ h& }$ W
  13.     'First Name' => 'Jet',% R3 H( ?+ t& C- ?. e7 M
  14.     'Last Name' => 'Wu',
    8 A# O2 f2 _, ?) K
  15.     'Age' => 26,% |3 T1 M4 Z- Q
  16.     'Phone' => '110',
    + X6 n2 ?; j: F
  17.     'Address' => [
    8 @% e! _# m/ y/ _
  18.         'Country' => 'China',
    " C! L" e. u+ e
  19.         'City' => 'Shen Zhen'
    . [3 o8 z2 p1 N' J/ t
  20.     ],! X; i  O6 D: B
  21.     'E-Mail' => [- @" C, I9 s, F6 F) W& k0 p' F
  22.         '123456@qq.com',
    7 J9 M8 g/ `4 V
  23.         '666666@sina.com',
    ( Q: ?, w8 @3 l4 v
  24.         '8888888@qq.com',- p7 F9 P* t. K8 M8 Z
  25.         '77887788@qq.com'
    & {" w8 r3 `/ P6 L
  26.     ]/ ~/ ~7 e( g6 m+ t# G
  27. ];/ w+ ^8 n$ E, Q) a0 U  F% v' t
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    ' H$ ]; X. P* F' x7 C
  29. echo '<pre>';' h& g2 F) ^) z! i
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()/ S0 J" m9 n# _6 n( v
  2. //参数1:搜索条件
    - j! j  n; C; {3 i0 g
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段% q. N8 f7 [7 p$ J2 l' ]- U
  4. $mongo = new MongoClient('mongodb://localhost:27017');7 q1 r$ q( w8 V& G
  5. $db = $mongo->mf;
    % V+ h; ~% {5 t
  6. $collection = $db->friend;
    # o1 C7 [$ u$ r; E* x4 L
  7. $one = $collection->findOne(['First Name' => 'Jet']);7 C/ v  O; s# x! C% |/ V# |
  8. echo '<pre>';" V6 D, I7 n/ a# V+ [0 M" C( ?
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()6 {- M" y  S) p/ d( i. E7 b. d
  2. //参数1:搜索条件2 b) k' B2 a( c% I& X% j
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段4 s2 }% J' l; i% w
  4. $mongo = new MongoClient('mongodb://localhost:27017');8 J# {: v6 L& x" A
  5. $db = $mongo->mf;; R. K$ J0 R. x- B# k' A
  6. $collection = $db->friend;: O  H$ ~- V, e! E0 g. A
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    ' h2 M6 f( l/ l
  8. echo '<pre>';; t# w6 ]1 V. S# R, L0 D
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档  R' _0 l1 a+ K  s8 @; C9 p/ b
  10.     print_r($doc);
    4 K$ B; \# y3 }! h
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' S9 k1 p# K* B% W- c' f) i
  2. $mongo = new MongoClient('mongodb://localhost:27017');4 W! b5 G' d: o9 J- ]) Q+ Z. ^
  3. $db = $mongo->mf;
    1 Q5 D% k  c7 _/ l/ j/ I
  4. $collection = $db->friend;3 s  W6 z$ i/ Z3 `) H
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);0 ~$ l& D( g- X/ ^4 B3 s& a* E3 v
  6. echo '<pre>';: l+ O1 l1 l4 b* @. @4 Y
  7. while($doc = $cursor->getNext()) {
    ; D: a# v$ y8 P6 h" q( o. \
  8.     print_r($doc);$ Y5 }- z2 G- j% J
  9. }
复制代码
  //查询某个字段的所有不重复的值
1 U' L" F! j; P& @  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    9 H1 ^, Y( d2 q# w0 q! A+ }
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    3 ^0 k- t/ I1 I6 j) g+ f

  3. % j+ y. }3 ?$ M/ ]5 c8 X
  4. //$all:匹配多个值中所有值(用于数组字段查询). I4 n( I  q& y8 g  i2 z+ X. w& c) V. ]
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);$ |2 u" T! {3 y+ B
  6. 4 m9 ^: j' }( |% c$ v7 r
  7. //$or:或查询
    " T  L; M7 n1 {% P
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    . e* z" p. }7 _
  9. ; J9 }- i  g; E
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中* v. I0 w: G: @% Z4 A' f
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email0 e- P5 q9 I6 F& C" Q: ~1 _& j  U
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email! ^% e1 D! W6 H' I4 b: V
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个1 K* O0 l9 v# v) q5 o/ }2 n

  14. . v5 c7 ?$ }3 S* C( _: S# S
  15. //$exists:根据某个字段是否有设置值进行查询7 ?. G3 s: V8 n; J8 T/ K
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档& {% w( X4 N  ]1 @( {
  17. # X3 B* s4 o' Y! w" |0 L
  18. //正则表达式查询
      ?# X8 f' ~7 }& j, k
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序; v6 M$ h, ^0 v2 Y1 m& y
  2. $cursor->sort(['Age' => 1]);
    ; E& \- E5 V! v/ J% N: Z7 h7 s

  3. 6 Z" i# V& n7 A! l
  4. //忽略前n个匹配的文档, N% ^) R4 T$ ]: |4 z
  5. $cursor->skip(1);' \; Z2 j- }, A) c' x$ z) I

  6. - f2 g, ]1 i7 ~& l; a6 i+ P
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    # ^' G1 [$ ^+ T9 Z
  8. $cursor->limit(1);; y  @# g! S+ V/ e* B. I, C9 k9 V
  9. 9 i/ G, w/ |& j0 S& u" d; y
  10. //匹配文档的总数
    ' l6 d/ f# j- x0 C6 s
  11. $cursor->count();$ O# B; u% A8 [4 [$ _

  12. # o. i) Y7 G: ^
  13. //指定查询索引
    " O9 M' `" \0 {* Z7 A- m6 D1 N: G
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计$ y( F0 t; w" @1 ]0 m6 L, N: S
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    % w: t' G  J- N; |: G$ v" l  i
  3. $db = $mongo->mf;
    7 W' O4 p+ F0 X0 P; s5 i, N4 S
  4. $collection = $db->friend;
    # B. B' g8 @& p6 ^/ H- F
  5. $res = $collection->aggregate([% A, z8 V5 r: V& F& s' g" r' J
  6.     '$group' => [' w3 b4 a! m* e% A7 c
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组. U3 y  P/ L. @( G  B0 d$ |
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1# q$ r, |0 U. s" m% t# N4 t
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值, \! |" b1 f3 e- g9 s3 G* J
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值5 [) s7 a& X) H3 Y# b% L+ d6 R
  11.     ]
    / O3 x+ ?, s3 ?- u6 U* I0 J" v+ X
  12. ]);6 B3 s; T; p& X" K$ }
  13. echo '<pre>';
    ( y: b' V! k- g
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果; f7 E& w1 j$ K

  15. $ ?6 U! \. u$ }2 v: m

  16. ) k! q! z1 Z" e/ \4 {
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    3 I1 n% X0 i: B9 }' W2 h# f
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    & v2 k9 h# Z1 l* d
  19. $mongo = new MongoClient('mongodb://localhost:27017');: d1 o/ D3 j* u( |
  20. $db = $mongo->mf;
    ' ~- t, N" n. e; ~* a
  21. $collection = $db->friend;/ P4 m& i' [+ v7 W- S+ ?  u
  22. $res = $collection->aggregate([5 {, t% Z5 f6 G3 b1 K  V& p  F4 r
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    0 p! L8 L4 R$ [5 Z, W- P. Z+ C3 c
  24.         '$match' => ['Age' => ['$gt' => 30]]/ A& R9 n5 _+ |3 Z# h1 p
  25.     ],/ [- q% C; X0 s# [9 ~
  26.     [//指定分组字段、统计字段
    , _2 f& x1 s& d! B  \. u5 ]
  27.         '$group' => [
    ( r" c- t' L1 I" A8 a2 W
  28.             '_id' => '$Address.Country',( V$ B4 x+ e. }: V" V$ z
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    ; {& q  F- I+ Q2 k5 u: z
  30.         ]
    4 I) ?" r3 W$ F; R8 P8 t4 y6 s, Q
  31.     ],$ I/ S) X1 P' y1 u
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    1 N4 ^; z! A- c0 V& |
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    * s' p3 [0 m* r- c) a9 K
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名0 F2 d$ X+ A: x1 x9 k
  35.     ['$skip' => 2],//跳过指定数量的文档
    4 G" y, w3 `! h% L9 g2 }+ t
  36.     ['$limit' => 2],//只返回指定数量的文档
    ' \: X- j! U( o$ Z  \
  37.     ['$sort' => ['totalAge' => 1]]//排序( |- u9 `; j. S' I# @! A0 Y- B
  38. ]);
    / m& I+ q, I+ ?6 V
  39. echo '<pre>';& A+ B, k0 S, e2 F! Z: t3 t
  40. print_r($res);
复制代码

* l- W( F, ^$ s+ \$ R2 }/ ~( w7 o
三、数据修改
  1. //update()
    2 z' P0 f, r  `
  2. //参数1:更新条件,指定更新的目标对象。( ?: R5 W( y5 c. Y  ]+ u8 g5 \
  3. //参数2:指定用于更新匹配记录的对象。+ O% n( Q( c! {% z  V
  4. //参数3:扩展选项组。" p- \1 R8 l: B1 ?/ u) @5 |3 [. K% p
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    * G2 F6 c' A, ]. A" k" w! Y% g
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    4 o3 E6 e4 L6 g* y  x5 @7 A
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。) Q+ h" |. h% e- f
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    / a7 L* |; u! ~! s5 m* \* e( ]
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 H0 }) g. j0 I) Q
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    1 a8 I  R' @# h6 C; n( w; b% [: M: W3 b
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    1 ?, Y% `1 {% ?9 i( |5 X
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    7 `, ?$ x' ~- s$ l8 D3 [5 i! t

  13. ; {: }8 s' h. M2 r- h
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    5 I: `" w3 T" i  i5 C
  15. $mongo = new MongoClient('mongodb://localhost:27017');5 B4 J9 U' W; ~6 N" D
  16. $db = $mongo->mf;
    7 [- X. m7 g+ M- y
  17. $collection = $db->friend;
      m4 p. O- w. Y9 {# l8 w
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);1 I& v6 j  U- g6 O
  19. echo '<pre>';
    / Q( x& w  T. v! X* Z
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    ) z+ X7 j  V3 z* [0 M" {+ S  n4 O
  21. ! n. E, D/ g7 x( k2 |5 h0 F
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    3 M9 @$ [, I; V7 A; ~1 E# u: x" I
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);/ W0 q' c3 H! v  I0 l/ b) p! K
  24. ) g4 D  J* R2 ?( y
  25. //$unset:删除字段0 r8 d- s. f) p1 m. y# ]
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);1 |  M2 h* P% t% Q0 U
  27. ! w" B; ^  U4 C  p% A! g3 O/ F
  28. //$rename:重命名字段,若字段不存在则不进行任何操作! `6 a+ F9 ^) M: C9 c
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);1 l9 K5 U( h" S  G7 P" X. f) c
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。! k4 H. J1 }! n

  31. , f9 |1 m5 K3 M% p% A" `3 F
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的- k" y0 T1 l4 d7 K. J" Q/ n
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);4 V  o* u' u3 T4 r' R

  34. 8 {  s4 y# v8 E' `4 `
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    + L4 {5 h7 p6 M8 d% t8 T- m2 A! I" _2 |
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    + Z1 h6 @4 D- L0 V

  37. + H5 A" h; P" C9 Q* d; `- z9 Y
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# V6 W7 @0 {4 E
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);5 c2 R& J6 t" {# ?
  40. 0 ]$ i$ k. ~& r& v
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    7 v' I8 V; ~" t
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);2 T1 _( \  h4 ^& B: \# q. a: n8 Q, x/ p

  43. 8 X) G: l0 g& p' q6 `) U  y/ ]" W
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    7 x( Y4 H% V( O4 z
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    ! s/ `& y  T5 x. v
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ; }* H1 ~) P2 P' M( N

  47. ; ~; {6 z9 m$ O1 }% X! i5 k
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    , h7 B( D; R+ s! |+ ]- Q; J% p
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);8 f; q5 B" t' P  c

  50. ' m7 @/ D$ W" s) O) _( j% \
  51. //$pull:删除数组中所有指定值/ l# Q. E0 ?9 j( J/ g8 d
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);; s4 b  c- q0 F7 D

  53. 3 O+ T9 z& q) r; p
  54. //$pullAll:删除数组中多个元素的所有值, m2 b# \+ B- q4 h1 F5 _
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    * e8 V- ?7 E3 t7 C3 A3 ~& L
  2. //参数1:希望保存的信息数组8 S9 W- p2 A: r) s! I. V# F/ z  t
  3. //参数2:扩展选项
    ' b; `: h0 I8 S/ H" D, S1 O
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    : z  Z9 K( u6 b$ Y" O2 o' b- @
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 x$ M+ u' M  w7 f* O. b
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。- A% g3 H, p- t4 c# a7 @
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    : p& v4 _/ V" T
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒). f% A0 R' y- e
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。9 ?: ]4 k0 }' [( E' f$ k9 [
  10. //若想更新则应该在参数1中指定_id键的值。
    0 x. r% i; ?" p3 s
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    ) Y# U5 I% h! e  k' X
  12. $db = $mongo->mf;
    8 M! P; C1 o) H8 U. D
  13. $collection = $db->friend;
    ) m, z1 o* y# ~4 R0 c
  14. $doc = [//定义一个文档,即一个数组  L% s! @8 v5 T% i( Z& j: P
  15.     'First Name' => 'Jet',0 k; v# [4 s1 f. b% A
  16.     'Last Name' => 'Wu',
    , P- ]: M8 N; n
  17.     'Age' => 26,
    9 i+ Y/ o' R# t$ D+ n
  18.     'Phone' => '110',0 s  \: h) _. e" T6 d
  19.     'Address' => [9 d$ I) u( I6 ~$ N" n# U; s
  20.         'Country' => 'China',, z+ R+ u6 J4 _8 y
  21.         'City' => 'Shen Zhen'5 ^+ O* H4 O5 ?7 ]' Z4 {
  22.     ],2 u$ C( w4 X5 w+ h/ M
  23.     'E-Mail' => [
    3 D8 O9 C  b0 ?% u. v" M
  24.         '123456@qq.com',
    ( t8 y( `# g- j# a
  25.         '666666@sina.com',  j1 Q( n; Z. c" b8 Q
  26.         '8888888@qq.com',
    ) v# Q* S% E, f- i" ]7 K! J) E: W
  27.         '77887788@qq.com'7 U& K) k5 @0 J1 @/ H6 L' r
  28.     ]
    8 V4 m* `: O! I7 x0 P" P" T' h
  29. ];
    & j( S$ W; |3 c- z6 B
  30. $res = $collection->save($doc);
    % R; B) E, g- \! w
  31. echo '<pre>';
    + w2 u) Y2 r  {. d
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入) A1 e1 r) [7 N, L* ?% ]/ C: b
  33. 7 C) H3 V! ]  ^9 y* m
复制代码
  1. //findAndModify()* s7 ^- X- S2 C7 N" Q  j
  2. //参数1:指定查询条件: p1 J1 V! S* ~* W1 k( ~  ?$ \6 n$ h
  3. //参数2:指定用于更新文档的信息5 z7 Y* z, t' P: a: o$ r
  4. //参数3:可选,指定希望返回的字段8 b$ D0 H( v) ^# b. T; M
  5. //参数4:扩展选项
    6 z% i' l0 q3 f4 x' f
  6. //  sort:以特定顺序对匹配文档进行排序% G( x$ y2 g5 y8 Z5 S
  7. //  remove:若设置为true,第一个匹配文档将被删除* S: a$ L% [; `. J% C0 o" g( j
  8. //  update:若设置为true,将在被选择的文档上执行更新操作: t5 a2 W; d' E$ p
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    : K8 k5 n* T+ I( Q# y: q
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档. B( P, b$ c) X
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    0 B; n7 J9 b/ a) c& J  ?
  12. $db = $mongo->mf;
    3 J* Z( b+ V' z: S1 V7 E' F. z" ^
  13. $collection = $db->friend;+ T7 S5 j& l% C$ v! m7 U) H
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);+ X) p# g0 E6 V7 e, p
  15. echo '<pre>';: o0 `  k. O' C  L# H+ n
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()6 s( W# G: |- s3 E; C' ]. {! B6 q/ t
  2. //参数1:查询条件
    ! i8 F5 b- _6 s: t: N- u, e9 }1 b
  3. //参数2:扩展选项7 [, j, d: F, w  j8 `
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    " c: D6 N3 B; m8 d" F8 t, o
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。# _5 N2 d1 A9 T+ _& A
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作5 ]% C6 }: @0 H# i% M: E& b" O! C
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ y) G8 p( h; @! h7 C9 s
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    * L1 \2 v5 c. x4 s  s
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)  j9 ]: t% @% P. n' u
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    3 R& g3 o. W# ]$ `5 g
  11. $db = $mongo->mf;
    9 u  D- C: c/ j
  12. $collection = $db->friend;( P* p. ?$ \3 z  u
  13. $res = $collection->remove(['First Name' => 'jet']);
    3 v% s+ `+ _& \8 d5 i4 O
  14. echo '<pre>';
      b2 Z; ~/ z, N
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
  _  M5 V9 l7 n  @! @. v: M
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

8 k5 s* v1 N; G* c( x( b) Q
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
+ S. F- F7 d% `4 M2 i
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    7 r. n8 l% L1 |0 Z2 x6 S( E; _8 W8 X4 A
  2. $bulk = new MongoDB\Driver\BulkWrite;
    : a1 [: }- m/ f4 X3 N- J0 Z+ `
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    4 m6 G6 Y" F2 ^9 s2 q! j( H
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    % ~8 b1 w2 Z. H$ O& d
  5. 6 I: M3 Y3 ]' I$ ^; _- {
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ! Z  \: A" }% Q
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    & Q* m( G0 l, V) _( K; [: j
  8. echo '<pre>';
    - x/ H4 k5 s5 k/ a
  9. print_r($res);
复制代码

+ O$ Y/ `  n1 w4 E+ u6 m. a! l# I
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    6 C& e" B* H  M  `6 m7 g! g
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    ) d- h' H, q1 r4 {3 Z3 H
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    " D1 U5 m, J2 G, I8 ^( o0 \' l6 ?
  4. " W- v5 _8 _/ _1 r+ B
  5. $data = [];# a( i- @7 O3 r2 _  E
  6. foreach($cursor as $doc) {
    . {+ @$ o9 ?1 F8 `& K
  7.     $data[] = $doc;2 o. L) Q0 P$ O) Q8 x, v
  8. }
    0 x+ J8 s) m+ _
  9. echo '<pre>';2 _- T: O2 k( m% I+ t  ^
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# L0 s  R8 H$ p# Q
  2. $bulk = new MongoDB\Driver\BulkWrite;# i5 w. z9 ?& g1 f8 \/ v
  3. $bulk->update(. V! M- s* W& r0 B, @
  4.     ['name' => 'JetWu5'],
    7 ~+ }6 }0 ]% V( {' w
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]# Y1 R( f' T% j2 A. e
  6. );! j2 Y5 p% S' W
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认# s! A2 w1 j& F1 K9 p' }
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);0 z; ], n4 A  P+ t
  9. echo '<pre>';
    8 R' K+ @: A7 T9 d; o1 o
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');4 Y+ w3 q. Q& [4 w* s2 m) B
  2. $bulk = new MongoDB\Driver\BulkWrite;% s. o' n( ~1 d
  3. $bulk->delete(['name' => 'JetWu3']);: x1 C7 x* Y% P4 h3 @
  4. $bulk->delete(['name' => 'JetWu4']);3 M( g7 B8 r% N+ _7 s* k8 m
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ S5 c) {$ ?- g0 i2 I+ E5 x5 w
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    8 R* {  _, _/ ~" A8 }2 k
  7. echo '<pre>';
      M1 Z& ?  B5 a& D5 H" ~" q
  8. print_r($res);
复制代码

& i7 b# B* I5 x. c: Y) [. P' h0 y2 y
" W# r9 t; v  \: i
8 X: S' U" e+ o( R2 r
' r/ o& E, Y9 G- c3 v+ i# l$ |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 20:00 , Processed in 0.067030 second(s), 20 queries .

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