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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13075|回复: 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()* R! s* g0 F5 F1 W5 y3 h: S3 |
  2. //参数1:一个数组或对象
    ) W/ r0 e* m* ^5 c% Q. E  o# g- D; F
  3. //参数2:扩展选项8 }5 g( a3 Y9 Q* ~# G
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘( ?9 F$ F* {& q2 @$ W
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    : o2 _! i3 J9 ^" g4 C
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认0 @" `1 f' M3 \+ M; k. p) K8 Q% ^
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    $ ^* h- C7 O! L7 i/ }
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)- O) O( x3 L9 c/ K* w+ l- v7 H! o1 B( U
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    $ d- t9 y8 P$ W5 b# s% W
  10. $db = $mongo->mf;//选择数据库
    1 [7 V8 c) \: ^4 j  I  \2 z0 |
  11. $collection = $db->friend;//选择文档集合  o4 B: D4 s4 \4 T
  12. $doc = [//定义一个文档,即一个数组* F8 L- F$ e: @+ R& R7 {
  13.     'First Name' => 'Jet'," Y3 j: O$ `' O& [" T
  14.     'Last Name' => 'Wu',
    8 l1 D/ o% L3 u0 k# d! D8 }9 e
  15.     'Age' => 26,
    ) }. @  Y3 b  J* Y
  16.     'Phone' => '110',# p' B/ B( O0 ^# b5 ~
  17.     'Address' => [
    4 [7 w/ ?/ w& {: q
  18.         'Country' => 'China',% R( |- E+ I9 ~6 Q* `
  19.         'City' => 'Shen Zhen'
      a, m' P- x# m
  20.     ],  }6 F' l( S7 l( g
  21.     'E-Mail' => [! [2 u% l% _$ _' N
  22.         '123456@qq.com',
      R- H2 x' }2 y" K7 K( l% \
  23.         '666666@sina.com',0 \9 n' ^; }: r$ ?; ^2 r# t# ?
  24.         '8888888@qq.com',; u5 l* [/ Q  i' O
  25.         '77887788@qq.com'* S+ R4 i1 @- |. t
  26.     ]
    ( y3 a: D2 r2 ?7 Z3 t3 ~
  27. ];3 f& D/ ~1 q1 x( h8 m
  28. $res = $collection->insert($doc);//向集合中插入一个文档: g- L2 Z! d8 p
  29. echo '<pre>';
    6 S! t3 k) l) m
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()% i( l" e& A& L5 x9 p. d  n: }
  2. //参数1:搜索条件
    % N' k7 U4 z& u. J8 |0 U
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    4 M( y7 E( ~/ j0 E' q
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    " V' p1 |( {* u2 S
  5. $db = $mongo->mf;
    4 f% V" _% Q8 [  M& t; R* _$ `) [
  6. $collection = $db->friend;
    " Y: V: s5 U. O& J) s
  7. $one = $collection->findOne(['First Name' => 'Jet']);, L7 c: W0 w) K9 f6 m% J
  8. echo '<pre>';1 x* q: f0 g" U. J$ M9 L
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    * v5 f  E$ d7 L/ z/ P4 U
  2. //参数1:搜索条件
    - R& _. \5 y) F5 G5 B& m5 w  K: t
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    2 w0 A+ n' n& n; R4 N3 L
  4. $mongo = new MongoClient('mongodb://localhost:27017');) @+ }: {/ F7 ~, K$ |/ L! e4 F5 W
  5. $db = $mongo->mf;
    " Q' @2 K2 {- r. k( t
  6. $collection = $db->friend;; Q& }% }8 Y' ]/ j
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素+ D; }7 \: q# \7 _+ q
  8. echo '<pre>';
    8 g: \& \- {: I. d2 o; B1 j
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档9 o% i/ ~1 I6 k0 B( @
  10.     print_r($doc);3 c: O, N* [/ O2 G3 j* a$ D, |" ]! v
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询7 d4 Q) w* K  ?& j# i
  2. $mongo = new MongoClient('mongodb://localhost:27017');1 _+ y; W9 ^7 @$ I* g1 O: |
  3. $db = $mongo->mf;
    7 X; N8 X' [9 {7 G
  4. $collection = $db->friend;
    ! N: T5 L, o! ]9 C
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);+ m% h# H, q" u2 ~
  6. echo '<pre>';- b8 z# @% E6 {) M
  7. while($doc = $cursor->getNext()) {5 w6 O; f0 u9 ]; k7 k3 w
  8.     print_r($doc);
    : z) L* N0 J2 M( C
  9. }
复制代码
  //查询某个字段的所有不重复的值
* V3 R/ Q2 f, _  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个, L  M' R6 d* W0 t$ \. e
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    % x2 i0 @' v, ~1 o

  3. & D. O; K' X& k7 S
  4. //$all:匹配多个值中所有值(用于数组字段查询)$ H: @1 Y+ U6 }4 d/ T" d
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    6 P8 j) }' Q, Z0 `
  6. & z9 a5 c- W1 J: o8 s" [% f7 ^7 v
  7. //$or:或查询5 W+ F2 T% R0 b1 v; r
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    5 }2 {- v- O: w) M9 F8 K

  9. 0 L' L6 b6 V: N! ^. A1 `
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中7 y" T1 O- m: X4 i) z3 G4 }
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    & l: [# z# S1 q- z7 ?
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email0 K, a, M4 X: q+ F* Q+ p
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    % p4 p; G& C4 X  U- K- C, \* C

  14. . p3 `' ~9 k* H
  15. //$exists:根据某个字段是否有设置值进行查询: U* a3 f* {$ z8 c" K& T
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    " O5 d$ v9 g' O( O% a/ f# O' K
  17. ! k* a8 P' U6 p0 D6 D+ N, J
  18. //正则表达式查询2 l! v! u$ D' \. V; r
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    1 Q! @! W, H" E* w
  2. $cursor->sort(['Age' => 1]);
    / M% ?6 E9 o2 ^1 c3 o& h8 X

  3. 9 r; r- ]7 {9 U$ a3 U$ g  {; e( z
  4. //忽略前n个匹配的文档
    * q8 s6 R" f; ~' [9 t
  5. $cursor->skip(1);5 J0 v3 ]1 Q4 m& b$ J

  6. : l+ s- y/ [2 N) P/ d( ?
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)% u1 k2 h! F- Z- e6 v( o! R+ o
  8. $cursor->limit(1);
    ; s& K0 |. b" }6 k5 d8 q. B4 L0 V
  9. ( c9 u2 @* N. n5 p& d! b- h8 J
  10. //匹配文档的总数
    & J' r7 u( T+ Z
  11. $cursor->count();( F3 c8 Q; B4 F3 F
  12. - v, h3 m2 ^% K+ N
  13. //指定查询索引$ O$ S7 s! ~/ L9 [# @
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    , ~4 z8 K$ }' E4 P
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    5 c7 x# h3 ~1 \  g! J2 |# a
  3. $db = $mongo->mf;$ Q" E9 l0 M( S: ]
  4. $collection = $db->friend;$ {. r* e2 m6 }5 u" v
  5. $res = $collection->aggregate([% }! ?- ]3 Y/ P1 c6 k5 D6 \
  6.     '$group' => [( M* P3 K4 l" h) P% `
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    - \3 r8 P% P) ^( a) W% o) B
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    1 N0 Y' L1 L: o* N
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    3 H$ Q- Y2 u! M( l) \+ f3 C
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    - ^  s1 Y/ A6 t) s& N0 m' A/ l5 n8 C3 C% S
  11.     ]7 [+ C+ f& C; F, {# _2 k, L" G0 s! k
  12. ]);1 z" B; x) @. w
  13. echo '<pre>';
    & v7 @5 R8 k+ y4 L: \
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    ( s  j: v+ \' o! P% n
  15. $ o! t9 U, c6 B/ S" t+ Y$ K5 W
  16. - a5 M0 u, J3 h9 n' v. a' w
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    . {% G% E- I5 _; X" j# x. H) J
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    2 l3 T' ]2 @5 a% p5 A4 x& D
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    3 z) p8 {6 {2 o  P
  20. $db = $mongo->mf;
    0 N8 {8 A$ w! B& w( J
  21. $collection = $db->friend;
    5 I3 b( T: |+ n# \7 Y
  22. $res = $collection->aggregate([
    % i" s4 \7 V4 ~: S
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档" L1 ~$ G; d) y5 n6 \( ?! ^* u
  24.         '$match' => ['Age' => ['$gt' => 30]]+ O$ ^: j  ?0 Q3 u! m, a
  25.     ],; h3 O) _, L% Z, U+ V
  26.     [//指定分组字段、统计字段1 W+ B4 {; x  l$ e7 M, c9 O" p, s
  27.         '$group' => [! y1 w2 y* n; O* d0 A. ~4 v
  28.             '_id' => '$Address.Country',
    8 U" B6 H0 f' P5 V$ c/ d' y7 `
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和8 m- n& b0 g" h0 ^0 r2 q4 g
  30.         ]) @% Z& z( \1 U* u9 b% m
  31.     ],
    1 Z2 H: e. _" C) `9 G. g
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档- V4 K/ {5 f% t5 G; b& W! I
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    , n3 N3 f4 o+ n) Z
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名3 x1 m. Z- f& h6 e) e2 y/ |
  35.     ['$skip' => 2],//跳过指定数量的文档- T4 M7 M) q: J. J- p
  36.     ['$limit' => 2],//只返回指定数量的文档
    : r( Y2 n2 J# E: J9 [, h
  37.     ['$sort' => ['totalAge' => 1]]//排序
    7 e+ ~( n! ?6 r& ]/ {1 e; U
  38. ]);
    $ T) o4 ]5 s! U: h7 F- |( \
  39. echo '<pre>';) V& u9 `, t# l) L3 s7 W. g
  40. print_r($res);
复制代码
( j1 I, k5 _! P! P5 b1 H9 N
三、数据修改
  1. //update()
    & ^; Z1 E2 E: p* q
  2. //参数1:更新条件,指定更新的目标对象。" q8 y: s. C4 N; \3 N6 w: t8 ]
  3. //参数2:指定用于更新匹配记录的对象。
    " Q# y2 }; P) L2 Y
  4. //参数3:扩展选项组。9 W; H( h% r& k1 i1 u5 y
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。( A% x5 p, Y+ d8 Z) N0 k
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    3 H3 P( \+ T5 `* I$ {
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ; r+ W( w4 c' h  X5 q
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    6 a3 k9 ]5 X( M
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) p" |; E4 s! _$ l) T# U- u
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    : u* Q* y( C# u# M* h
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)* o/ T) x/ V) O1 C% |
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    7 C$ {9 t" s+ H! k6 C. q- s
  13. $ K" P1 |* n( X: {- D
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    & @3 J0 ]. O$ ^4 h
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    9 Q7 }' _" Z! c0 q1 F
  16. $db = $mongo->mf;  s; Y1 u" S5 K
  17. $collection = $db->friend;4 Y: T+ o) Y  v; ~3 v/ n
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    - ~+ d: w* H, `  U* O% p* V( ?
  19. echo '<pre>';) v3 l6 W2 Q. T
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    0 X( ^( L  v4 v9 g
  21. / t2 x$ d5 z9 C- \* b. e
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值0 @! I! D( d" b# A, E
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    6 J% n8 R9 G. \5 B- ]# u6 l

  24. 3 t8 Z# I+ D5 x% F, F2 M
  25. //$unset:删除字段
    ; I6 h( j4 M; I( J% b
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    3 B, m( W# y- S3 U
  27. : l  g( @4 }- f, `, Y
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
      k* S% ^5 R$ z) p0 g, V. S
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    3 V( o7 E2 [( h4 t7 u
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    $ V- d$ h2 c/ w% v; @$ o
  31.   o" O; O  k& J2 i& |3 h2 J
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的4 C; v) `8 f9 v+ }0 e% A! |* C
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    0 v8 x' H4 u! w# W4 N9 L

  34. " o/ S3 u4 ]: }7 m6 f) o+ p
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错$ P* |. ~1 B6 S; z7 P
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
      R9 y8 o/ H9 ]4 C) l
  37. 6 P7 C: ]( w) C' A
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ) q3 A# p: z; Q4 g/ q( d4 v
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);3 F- O2 y  n* J6 f
  40. & y0 Y3 Q7 `2 E* w9 M% C- T
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    9 P7 ^/ E: I! B% X4 Q+ c" |( Q
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);" O# u# @/ {* R7 F2 v

  43. ( R2 B) e2 `+ v# c( J0 u
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    6 C8 I" P( r6 _
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);* g5 h  L4 ]% Z- J
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);8 @2 s: j. U. U( T& R
  47. & T, |( \) t$ u' G  i  _
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ s4 l: O; B4 L' C7 c- {% P1 g
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 p! o0 t4 F6 \+ ~0 l  y

  50. 5 S9 h9 v5 t/ R/ u0 a  }  _# n8 A) X
  51. //$pull:删除数组中所有指定值# j* u4 \& T4 a
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    ( U" c& }( p. q0 P
  53. : J( _% {. {# D5 w6 a3 h% s/ r0 B! H
  54. //$pullAll:删除数组中多个元素的所有值# W; A* V" z4 W8 p' W. l9 J2 D) w
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    - L/ r( D6 d! `, X3 v' ]
  2. //参数1:希望保存的信息数组- g1 h$ }6 Q$ R5 A! W& e, ^8 A
  3. //参数2:扩展选项5 O3 e! a- }) e8 O3 |9 a
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 m* Z- u" _8 U% R( n
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    / u: }% t. s+ R
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    * }/ b/ E$ m+ X9 k& M2 K
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    ! Y: m; F0 ?% z0 S# H* X! P
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒), e- b% B# [5 _- U$ Q3 I& G# `
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    5 S" N6 e. A8 k- s
  10. //若想更新则应该在参数1中指定_id键的值。
    * ]9 D6 a5 p% a1 e8 C( `
  11. $mongo = new MongoClient('mongodb://localhost:27017');* e3 v2 ~& Z& O4 Z# ~) ]6 j
  12. $db = $mongo->mf;
    + ]$ {2 C- J+ j  w! \6 @
  13. $collection = $db->friend;- a1 [& f3 {, K
  14. $doc = [//定义一个文档,即一个数组
    ) V6 g- d$ ]1 y% ~0 L, ]3 s1 A
  15.     'First Name' => 'Jet',
    5 h' c5 P) N: k8 e" L, Q
  16.     'Last Name' => 'Wu',
    7 I! Z# J8 T/ i. U% \, P8 q( G* ]
  17.     'Age' => 26,
    + r& p% F# z8 t# V+ y# D' J, x4 O- J
  18.     'Phone' => '110',0 n' O) W7 V8 i" k# F. e' K9 w
  19.     'Address' => [* k, N# n5 f+ x% k
  20.         'Country' => 'China',
    8 [" }( t% B  c- F7 N( ?: M
  21.         'City' => 'Shen Zhen'. d% _. d6 x6 y1 k' f
  22.     ],
    1 g- p0 P6 [' [: K. R# |* K4 i
  23.     'E-Mail' => [
    4 a! u) G) Y6 P0 p, [, r9 Q
  24.         '123456@qq.com',
      r$ v( r, R' v
  25.         '666666@sina.com',
    7 T( c- x& l. D4 K9 b
  26.         '8888888@qq.com',: \1 y1 c1 g& H/ t6 D
  27.         '77887788@qq.com'
    * d. a+ z8 E& W+ F
  28.     ]% x! Q1 N  `' {) B0 |) ?9 ^. q
  29. ];
    + y7 z* t4 }4 u; W4 |
  30. $res = $collection->save($doc);
    . ]; K1 L( M1 N% I! b) J$ Z3 T; Z  {0 c
  31. echo '<pre>';8 o2 ]  A( A5 s( `. e5 f
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入  F8 I. q# n7 A6 ]( @  T6 w

  33.   V% d* V3 L" K4 q& L# o
复制代码
  1. //findAndModify()
    / V9 s* J9 z# ^' o( g
  2. //参数1:指定查询条件
    5 V5 f$ s0 h* W  Q- W" L
  3. //参数2:指定用于更新文档的信息. z( K1 |" P  H* H, _
  4. //参数3:可选,指定希望返回的字段
    6 |$ l. C3 Q  B. K
  5. //参数4:扩展选项$ j5 E' X" m0 T1 H8 ^5 r
  6. //  sort:以特定顺序对匹配文档进行排序
    . v0 Y# m# ]8 r4 \% |8 h
  7. //  remove:若设置为true,第一个匹配文档将被删除
    1 s5 B* v2 y5 x& r
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    ; O! L7 @5 c" D
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档* f( t; @, [4 ]
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档$ }% Q( ^7 n- S- }5 [  C
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    - K6 }4 Q$ U* T6 @
  12. $db = $mongo->mf;
    $ S4 Q3 U3 a7 a' x- z
  13. $collection = $db->friend;
    4 q: N# m$ y- E6 N9 ~
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);- R( s& h, _: n
  15. echo '<pre>';
    2 {" G, t+ B9 g* `: Q7 b. n2 M
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()! t/ Z6 d6 M: X6 i" w
  2. //参数1:查询条件1 z, J& C2 W6 O0 {  \
  3. //参数2:扩展选项" ~+ f. |" p  C6 j* W9 @7 S. B, [
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除3 c1 o3 t% S) k! f. T* v
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    & x! e3 n/ \( X
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ( c( ?# ^2 p4 @" h) u6 O
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ' a1 r- u" U& D
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 S2 J2 }* {$ }0 |8 o7 e7 c$ K2 {
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)$ R# Q; H1 Z( J  b/ X* `
  10. $mongo = new MongoClient('mongodb://localhost:27017');6 J0 \1 `4 e) A9 i; c7 x: E# Y
  11. $db = $mongo->mf;& [2 p% a$ f8 h8 Y, J/ h
  12. $collection = $db->friend;1 _2 g* ~- U) X1 e
  13. $res = $collection->remove(['First Name' => 'jet']);
    ! q) s" |( x. @0 Q, i2 h
  14. echo '<pre>';( i/ C0 y' A7 |+ M
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
- h! f$ k6 p# @" E- R
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

8 f' a9 O; c" p0 m* l9 s$ Z* z. H
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
! X/ U9 r) Q2 {) f0 I- |2 b
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    9 P5 \! J& ^* V0 k* j
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ! _/ b5 B# V9 a
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    1 b1 _/ M2 s! {; x7 [5 }
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    & M8 g3 p; }! v# d

  5. ; f1 `3 |$ G; k  a; |, {4 V
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    0 V  |! r: F7 A! E* A7 P) N
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    9 d8 x* L$ l; l; P/ h
  8. echo '<pre>';
    ( r$ U3 I  R/ l$ T7 j
  9. print_r($res);
复制代码
6 N# @4 M$ t+ A9 c5 |1 ]
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# [: H9 \9 p! b  s/ q0 y$ ?
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);* ^  J4 u, A0 r2 d' T- r1 F
  3. $cursor = $manager->executeQuery('wjt.friend', $query);% f2 ^" i1 Z8 }% b' m. \

  4. # K) j0 |" }/ h8 l; E
  5. $data = [];
    + P2 i/ _6 J. u4 d% n( D/ W
  6. foreach($cursor as $doc) {
    5 `8 V7 L& d- _; a4 G- S
  7.     $data[] = $doc;' @* u" l8 K' t9 e( d; q  s4 Y$ A
  8. }' w+ I8 D8 @8 w
  9. echo '<pre>';& k3 \4 s  N2 ?/ n3 L
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    : N' s: E: T( \0 Y+ I* x. x
  2. $bulk = new MongoDB\Driver\BulkWrite;
    " f! w; }- ?& O+ S! [9 Q
  3. $bulk->update(+ e) S- Z, z& V0 \: M' u5 K# @
  4.     ['name' => 'JetWu5'],
    2 B' d, X/ @4 j+ K) g$ c
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]- D) J3 h) o* b3 M
  6. );) Q9 A; e2 S' C2 s
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    - L) F" t' A6 X' x- A
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; b+ W2 \- K6 [- G% E7 n
  9. echo '<pre>';) @/ E9 U, K/ Y: v
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');. e- x8 l8 ?9 a! V
  2. $bulk = new MongoDB\Driver\BulkWrite;
    * U2 K; D$ N) P, S
  3. $bulk->delete(['name' => 'JetWu3']);
    , _2 i) h0 o% `$ i) u8 W
  4. $bulk->delete(['name' => 'JetWu4']);
    % Y: ~, X6 }! q" d# w
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ; g; f$ e% }( l; X/ P- k* {( J9 \: m
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
      E1 s1 i) b2 h
  7. echo '<pre>';9 O2 ^9 I$ {9 j4 S+ a3 y+ m% S
  8. print_r($res);
复制代码
+ b4 Y5 i* A2 G  }9 L3 d

* L8 F  ^9 \  e9 k' b" U( G- `1 |+ [7 ]; j6 W
7 V8 z5 K/ D0 R, |8 V) e! @. |; `
2 {0 k8 ?( D" Z2 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 02:59 , Processed in 0.060240 second(s), 20 queries .

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