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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9685|回复: 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()! I: x+ l, K% u! p
  2. //参数1:一个数组或对象
    ' @; Z+ m1 T$ P2 I- i/ n+ a
  3. //参数2:扩展选项! B7 T6 D, Z# @" y; P6 s( w
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    3 k) X% o) V+ A( A( M
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    - }) v; V. }0 ?- g- w9 T% I
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认! }4 s% @0 \& P. w
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间) Y- v+ Y4 v8 G' v$ A% h
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ; i( Q. T' d6 G; Y, a
  9. $mongo = new MongoClient('mongodb://localhost:27017');0 V" N3 f. n, @
  10. $db = $mongo->mf;//选择数据库
    1 R0 h: m% F/ n+ G2 K+ A, E* j- W  Z
  11. $collection = $db->friend;//选择文档集合2 y- A5 E- s/ L, _& B" m
  12. $doc = [//定义一个文档,即一个数组
    * t+ ^9 K; A" v9 I5 X' s! F& p
  13.     'First Name' => 'Jet',8 ~2 w: t: K- ^1 H2 B# m, M
  14.     'Last Name' => 'Wu',
    ( p% H& h1 Y% i* S# ]' Y9 U( x
  15.     'Age' => 26,
    % P2 D, `- U; J& }0 q& N
  16.     'Phone' => '110',
    + b) r  j! i4 a5 e+ y" L5 O) |
  17.     'Address' => [
    - m# _6 w3 ]% ~# J5 }) F; K1 O7 [/ [
  18.         'Country' => 'China',
    * T  M) t4 Q) U6 u$ j# L) F
  19.         'City' => 'Shen Zhen'
    - M. _: U/ d9 u, l
  20.     ],: z& y- q% F7 S. \1 l8 K. [2 z
  21.     'E-Mail' => [* R' }5 \/ x5 }/ h
  22.         '123456@qq.com',) \) ?) {, W- h4 w- b7 o4 [
  23.         '666666@sina.com',
    - |* B- H3 k2 y: p" ?/ ?& Y' s
  24.         '8888888@qq.com',
    1 G/ p% c5 d" v
  25.         '77887788@qq.com'
    $ c8 W+ p9 o3 b# Z; `3 {
  26.     ]
    6 p4 r+ E' z, \7 O0 k% L
  27. ];  ?9 E/ [, H- L0 t: z8 m
  28. $res = $collection->insert($doc);//向集合中插入一个文档( ~& B) d; @! ?
  29. echo '<pre>';
    ( g- c; a' ^9 p- g2 v
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()/ ^# A0 O7 `7 E& q+ y
  2. //参数1:搜索条件" C  N5 }( p$ c9 R' |& o4 D6 X
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    0 V# E; |  y! w- f3 P9 I
  4. $mongo = new MongoClient('mongodb://localhost:27017');8 y2 q: O1 p. e* {
  5. $db = $mongo->mf;) z6 k9 P& g8 \- |3 c
  6. $collection = $db->friend;! L5 q( a+ ~5 y  g; s, m* e" \4 P! u
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    $ i& O* V6 c5 J# v+ R* M) @/ o
  8. echo '<pre>';
    - }# Q  p1 A- n
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()2 z. q/ a1 t# m' `
  2. //参数1:搜索条件
    # ]+ V- b4 p2 n; ]% O4 F
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段: r! k6 b9 t( X+ h$ m  Q
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    . s: v9 }$ r2 y* p$ {# J
  5. $db = $mongo->mf;
    3 E/ n/ `# X: @
  6. $collection = $db->friend;
    9 b2 t0 P8 }, c$ @, t
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素( |: b. `& t. `5 R" z& H; i% _
  8. echo '<pre>';; p3 {2 `" {+ i) S
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档/ E% _" Q" R! X
  10.     print_r($doc);
    1 @4 ]  N: B8 I& w3 T  O
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    ) N9 l& ~4 a& h
  2. $mongo = new MongoClient('mongodb://localhost:27017');) ^2 S2 M- N8 b% \: u
  3. $db = $mongo->mf;
    ! [+ A, H2 C$ C; O: c, {
  4. $collection = $db->friend;7 z% d7 y! U/ [! k
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    ( k: p9 B8 b" P' M
  6. echo '<pre>';
    ' }  p8 @0 w3 ]2 k4 y6 l
  7. while($doc = $cursor->getNext()) {/ O5 \) ]1 m) I" Y+ Z3 X3 ]. c
  8.     print_r($doc);
    ) L# O( G4 a& x- n; e. w3 V) G
  9. }
复制代码
  //查询某个字段的所有不重复的值
. {8 G% B' [" M: E  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    & H) m6 Y/ {& f
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);4 U5 B* _' n0 z  Z" P8 v. p; a+ G- G
  3. 1 Z) b/ A! O. r5 f) @7 ^1 V3 U
  4. //$all:匹配多个值中所有值(用于数组字段查询)" l& f. B; ^7 l6 J8 w8 b  v8 I& t
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);: S* o  ~7 a2 n

  6. , U4 d8 s+ r0 r( q0 N& z7 o
  7. //$or:或查询( j) L/ [# h9 Q! K3 _2 ?: Y( {( x. ]5 O
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);4 z; q; Y) h* |2 ^

  9. 8 m! R' }5 t  F. C2 i
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    ' l& q1 a* ]4 [7 }( B9 k7 g1 t
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    9 z2 |8 b, S% f) t( w* Z5 X
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    0 @) h" N" G5 r, I, A+ Y
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    . \! r( y5 q7 z/ U% Q
  14. # d6 g7 {& `. w+ v1 ^
  15. //$exists:根据某个字段是否有设置值进行查询  P5 P: ^, F0 D: ]5 P5 }1 B
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档* u' ~" K3 t0 z3 z6 @1 U4 L

  17. ) H0 G3 {' k! C, N# H  h2 s
  18. //正则表达式查询* f: }9 V! W' @! I
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序% v4 T1 A  d/ ]( p
  2. $cursor->sort(['Age' => 1]);. y' v1 R% k' L4 `
  3. " ]0 b' c9 p' Z( d  v8 N& m- {8 a
  4. //忽略前n个匹配的文档+ w5 ?0 b$ t0 _& S/ M, B/ X
  5. $cursor->skip(1);' k2 X& e$ V2 D% x
  6. / Y$ y  n) v) h0 _
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    . b7 s. r1 _2 {
  8. $cursor->limit(1);/ [4 O3 G0 {4 P+ f% m- O' G

  9. * ]' W% N% j2 J% `) C- z8 |
  10. //匹配文档的总数
    3 I- {5 W. j3 y9 [
  11. $cursor->count();
    % Q- y  v1 g7 ?& Z5 a/ L: N& d

  12. / N8 r" r' L, P: J" G
  13. //指定查询索引
    $ Y* o, `+ U, i4 q! u
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计$ m+ u9 a1 A" w/ n' B* U0 I. D
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    0 X3 A% c4 E. p
  3. $db = $mongo->mf;8 i# ?( o  K; u
  4. $collection = $db->friend;$ ?, I6 C  u2 x% s) Q9 O
  5. $res = $collection->aggregate([6 T! B- q) W; E$ \. h& L7 g: q' k
  6.     '$group' => [' U- T4 ~: E. t; }7 n
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    4 \) D) @3 ?  P9 E: \
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
      l! a7 U+ m& R0 o
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值4 j( h0 }- s; l0 l0 m; F5 k, v
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值" }* E  k! C; Z6 I* N
  11.     ]" C3 P# t: Y/ f; ]
  12. ]);3 L0 {* b7 t9 S, V* _
  13. echo '<pre>';
    " G5 y8 k* i, I" G3 I; ~. l) i; p
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果& R* F( E4 A" P% e7 i8 o0 k
  15. ; N7 Y. X1 e9 m9 t  m
  16. ! D3 G1 v0 i7 p$ K" F2 X
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序% S+ m/ }3 ?6 `7 g3 y, C0 a
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    ) A) p6 b& {( w# W% I% Z8 P
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    + @/ m/ [) s/ s8 p8 s% ~4 P% y
  20. $db = $mongo->mf;3 k( B$ }, s- u' P7 {' j0 \2 Y
  21. $collection = $db->friend;
    9 W0 \& J, C( L+ x1 A; z
  22. $res = $collection->aggregate([- A) f2 y9 o; B. M7 w& Z& y, D1 D
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    ; k( E9 X6 ^( y
  24.         '$match' => ['Age' => ['$gt' => 30]]
    0 U8 U" J) t' W) h; O/ c+ I
  25.     ],
    & Z! l2 v/ Z9 ^1 q4 o- [
  26.     [//指定分组字段、统计字段" n* {! c, m6 j6 k+ t1 X4 Y
  27.         '$group' => [9 i. n! S5 X7 |7 D
  28.             '_id' => '$Address.Country',8 ~0 Y2 x% r  z6 J: N  r' |
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    # o7 r7 Q$ L9 r7 D9 z# I' k
  30.         ]
    + ]6 W( S+ Q$ `$ m
  31.     ],4 v  z/ `* @6 j
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档$ ?- G  K: w0 A0 ^
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。: C! w  T" G6 C7 k
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名& N' r1 A' i, R( C' o7 N' N
  35.     ['$skip' => 2],//跳过指定数量的文档+ ~% E9 O2 K% m/ S
  36.     ['$limit' => 2],//只返回指定数量的文档
    + [. v+ _" y; @  N
  37.     ['$sort' => ['totalAge' => 1]]//排序
    * a  `$ k" X0 g  h9 O8 ?+ I8 K
  38. ]);
    & w7 {& f3 q8 G( ^  n: R
  39. echo '<pre>';" _2 k. U$ L8 N' h  z! ]
  40. print_r($res);
复制代码

3 @) I: n: e9 h6 A
三、数据修改
  1. //update()
    ! T2 E1 A% a# e" x  ]
  2. //参数1:更新条件,指定更新的目标对象。
    9 H, h6 l% a4 F! e3 c( p7 x1 u
  3. //参数2:指定用于更新匹配记录的对象。' w2 b0 Y  \+ q# J- |2 H9 Z4 l
  4. //参数3:扩展选项组。+ L6 f( o/ B& Z: K: _$ `
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。" ~( b. n" e) J2 k1 M& y- ~
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。" z0 Y* n6 ]- O# }7 j6 J
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    0 t7 P( c7 k5 |+ q% s2 S
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作* u* H8 J) M# h/ d
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% R6 {0 {2 p, [0 Z
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间/ k6 l0 `, I7 ~2 p4 q& {/ t
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    3 |+ r1 ^6 q4 I' X: @
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。, a6 q, y. i6 |, g4 S9 k

  13. 6 R: W& h- z# J) H
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    ( i- u9 [6 K5 P# s
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    3 n; i# v7 y8 x( t
  16. $db = $mongo->mf;: N* N+ k) i" l5 c
  17. $collection = $db->friend;) B3 y- V; ^8 Z, m. J' E0 x$ n; R
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);0 ]) \& I% j8 s) t
  19. echo '<pre>';
    7 \7 Z9 [, \  ~9 o& X! t; i1 ~1 {
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量: f! C( w  j* K5 {/ E6 m$ j

  21. - \$ Z" T$ ^6 k7 z# r
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    $ ]8 X+ V& w! k  B9 R
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);8 u" V" {) \( _$ V

  24. " L, ~5 s0 I% L* V1 ^. G
  25. //$unset:删除字段6 T+ H3 }2 F, D) T2 t4 z; L
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);* |7 J. l9 v/ }) m5 g6 y

  27. : L5 S8 r! j" u# W3 x
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    . S  O" E7 H) I7 H5 E, x
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);! s8 {' W# X1 F
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。; a' `- _: w$ W) z$ k$ E
  31. - B+ y, [: d9 ?6 t: }& O
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    : ]  |4 z' w. Q+ P
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);6 N8 p: q  B# }# @& N
  34. 6 \3 H3 P2 }  M& u# M: _0 z( s
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    7 Z* J- z7 a/ ]! d3 O
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);6 k3 o+ C' g) ?2 Z
  37. ) k8 |$ J" `6 x
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错2 i! N9 S% C8 D( b% _
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);! _* d# P9 x: Y0 y
  40. , T; K  u0 A* S7 l. s0 V
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错  g, }- E2 R- B' A4 r! ~8 s5 w( j
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    / Q  y, [/ {6 x

  43. 8 p, u1 C- w' w2 F' a6 a1 s- [
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    / b& }' G; G9 @3 @% m0 k
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    / a+ Q  i+ ~" j/ U- M5 z' C
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);* B* w. X" v  y, X+ Q( [

  47. 0 d0 g! N' \" o- b7 b# P0 `! C
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)9 Z5 Y+ \; E  E7 \
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);' z& a1 ^/ N$ w- L& `
  50. + d$ v3 s! P8 G2 `4 K5 @5 O
  51. //$pull:删除数组中所有指定值
    8 D, `0 _9 k8 U
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    6 \3 Y3 S3 i7 H/ g9 S0 k

  53. - @8 x9 B" h) t* ^; V
  54. //$pullAll:删除数组中多个元素的所有值# z  A$ f' q: R0 q9 V
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    0 w8 {; o2 x/ J
  2. //参数1:希望保存的信息数组
    ) h1 q, W* ^& `8 `
  3. //参数2:扩展选项: J/ p8 Q3 G, V  p! s6 a
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。1 s2 j2 s& e5 q
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作/ M& H3 q( K9 }4 \
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。1 V& c1 W5 T# w& u" Y( v, o( y& D
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    : J4 g; d6 J6 c% Q
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)/ H* J9 `0 s6 R& H& L  H
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。5 _4 l1 {# D* a5 j; E& V) G5 I
  10. //若想更新则应该在参数1中指定_id键的值。5 f3 A! e8 r8 B% R( z$ K3 q
  11. $mongo = new MongoClient('mongodb://localhost:27017');- L6 P1 |% v1 ~9 D/ u0 ^
  12. $db = $mongo->mf;
    2 Q7 h3 r5 v, g  a. J
  13. $collection = $db->friend;
    2 L! P5 ~/ f+ l! y/ e* A, V6 z
  14. $doc = [//定义一个文档,即一个数组
    ' e4 k$ z/ m$ P" _8 b. i/ N
  15.     'First Name' => 'Jet',( W" E; |1 B# N: Y' I) \" U( G) J
  16.     'Last Name' => 'Wu',
    8 R  }% E1 ~+ ~  W* N9 u
  17.     'Age' => 26,
    3 b2 r, ^6 [6 e. \+ L' Q$ B
  18.     'Phone' => '110',
    . `6 |4 a& B4 @' Q) B& {, A  H
  19.     'Address' => [
    3 ?  W( R9 j8 O7 G
  20.         'Country' => 'China',
    1 m( y: B% U/ A! N4 R
  21.         'City' => 'Shen Zhen') ]4 O8 b+ y( y, ]: u2 d+ `6 c
  22.     ],
    3 K. G# B2 S" o9 o9 U
  23.     'E-Mail' => [# X) _: V: b- }5 x+ F0 a
  24.         '123456@qq.com',
    + O' u- r: [5 k& |9 o
  25.         '666666@sina.com',
    6 E4 Z6 \4 \1 K8 \, @% o
  26.         '8888888@qq.com',% x$ ]- j1 M3 _) u; w. q
  27.         '77887788@qq.com', O  H6 S& e( l: T+ h
  28.     ]
    / l7 n. f) S; k$ z, P# x1 t2 H
  29. ];
    ! f1 ?; L/ d0 M8 L1 N
  30. $res = $collection->save($doc);! W" a4 s# m+ ]9 Y
  31. echo '<pre>';! N: H( h, T! L1 V1 p, M( v
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    0 C* j5 l2 o7 b: P$ a

  33. 2 N( \; S; M( s
复制代码
  1. //findAndModify()
      R9 R9 F/ O) v: Q7 @# O/ \
  2. //参数1:指定查询条件* U7 n& I1 [# [: I8 X$ U2 _
  3. //参数2:指定用于更新文档的信息% y: X4 |  P' e1 ~9 h2 E
  4. //参数3:可选,指定希望返回的字段
    ; R$ z6 f* b3 u; B6 P
  5. //参数4:扩展选项/ _! D# q: q% l# J8 p: G% h8 N
  6. //  sort:以特定顺序对匹配文档进行排序
    4 N: L* O( A/ E2 M1 I. r
  7. //  remove:若设置为true,第一个匹配文档将被删除& D7 e* T2 x- G3 `1 P7 Y: |
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    / w/ }$ s) s! D" {' O
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档5 x3 x; N' P) L( ?8 o0 S& e* v
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    + L( {$ B5 a7 f' ~/ w: n3 ?
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    # g1 B* j  _6 e/ ?% W
  12. $db = $mongo->mf;+ W( P; N3 p3 d) K/ y: b( L7 a
  13. $collection = $db->friend;
    ' j( a( _$ ~$ l- H2 Q# S- A: w7 g
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    ! @- p  S' a9 E/ {2 _
  15. echo '<pre>';, A/ A/ {5 [2 K% F/ }7 f
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()9 H6 ~0 G' V1 S
  2. //参数1:查询条件
    ' K3 m& F7 W6 W- J
  3. //参数2:扩展选项
    4 l3 D6 f. Z4 x" t
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除; c( w  O. e+ [7 _- H( ^
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。4 [) L3 t% w1 W
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' @# L3 T# n6 X$ Q8 F2 l
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。& i$ V) j3 Y3 A; l: l9 X+ y4 P! I
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间% r3 A+ C& H# k: h- b7 o  K2 n+ u
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    8 s2 |" U; ^: W1 p
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    & }9 [6 N' G: X
  11. $db = $mongo->mf;
    / G5 H( R2 _( @  p
  12. $collection = $db->friend;
    8 ~# v. ^3 k8 k
  13. $res = $collection->remove(['First Name' => 'jet']);9 h& X! \+ b; e; A9 z. `
  14. echo '<pre>';1 Z+ x( G& j& t; p0 p. j
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
7 K; N) A- y* H2 g
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

7 W, a9 _  _' [9 L
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
: H: x+ Q( c; d6 ~9 G
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    # H8 P$ Y) G0 Q& c9 T) f4 E- u" `& `( ^
  2. $bulk = new MongoDB\Driver\BulkWrite;( N0 C6 K& u( D
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);8 v' Q6 C& Z/ Z5 g9 K. l2 v$ |
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    % f) t  h  {! }
  5.   Y  f& V" O' p* p- \) l$ r$ a% W
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认5 Y, \6 a' p" M/ _
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    1 F7 G/ j$ B' _9 \
  8. echo '<pre>';
    8 r: K5 v' Z& s; i9 ~
  9. print_r($res);
复制代码
; M% v) [/ X4 w/ P7 D7 W/ G0 c
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    / _1 U7 T& a- n+ j- g& b
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);! y" C% J3 |, s* Q
  3. $cursor = $manager->executeQuery('wjt.friend', $query);, W% C: G% _* O# d4 i5 R9 Q* i

  4. 5 ]8 y+ f8 U0 n. n4 L
  5. $data = [];- r% }& W3 p  A9 ^" S) X
  6. foreach($cursor as $doc) {
    : g) ]" ]0 p; b) ]6 t
  7.     $data[] = $doc;
    1 M% H3 a! ]. Y! v. `& D
  8. }
    ) g/ e* W% ~& n
  9. echo '<pre>';$ ]; o- T/ o7 |; E+ @  a
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
      C2 m" S- Z  K: Q( x
  2. $bulk = new MongoDB\Driver\BulkWrite;
    5 y+ r. Y( l7 @- D7 H6 A
  3. $bulk->update(6 [. ^) d3 o& ~  P( z* d; l
  4.     ['name' => 'JetWu5'],
    & G6 B# u) u# u* R5 s; G
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
      T8 N' Y: R1 b) e# O$ e# X
  6. );
    5 G+ R6 ?$ c7 {' h# I  h, w
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ( T. D. h6 M. A  N. H  W
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ; m$ N3 B+ L, E0 s
  9. echo '<pre>';
    " d6 z& x3 j4 Z9 m7 L' q4 C7 [
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    $ u8 M- H& v) [1 Y/ o
  2. $bulk = new MongoDB\Driver\BulkWrite;# [  d: u/ Q- x3 @0 H* o; F
  3. $bulk->delete(['name' => 'JetWu3']);' R2 w0 p5 a0 h/ _; O' z3 F6 c
  4. $bulk->delete(['name' => 'JetWu4']);
    1 Z" f7 p+ w( z2 P! E. q& _
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认5 U. @& ?' |2 L3 q6 P
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);; G% ~' z; R0 R. j
  7. echo '<pre>';) ?, X; C& N! h& @3 ?
  8. print_r($res);
复制代码
3 }' F9 F4 [" ?
1 d( ~+ S" ~7 `
( t: p$ w6 W$ H6 p# D, |! Q* `+ x6 e, D( m
" p- v$ Y# R* }; S$ ~5 ~
* u5 z/ s# |  _) n* U+ c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:36 , Processed in 0.145294 second(s), 20 queries .

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