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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12603|回复: 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()' T; U7 N# R3 r) P
  2. //参数1:一个数组或对象; l9 {1 b; Q1 o# ~; v6 U
  3. //参数2:扩展选项
    , X% a" y1 v0 n3 C- O6 x
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘7 i6 R9 Y( V9 i6 E  G
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志0 M, M/ b6 w% F, W
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    8 l- p- G1 w6 I6 U+ e7 v
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间' `8 L0 P6 _4 \" K; m! s
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    / m: u9 j! U3 I$ K$ R# @0 N
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    + T/ H/ [- y, i* L
  10. $db = $mongo->mf;//选择数据库, M  j/ }1 Z3 `2 h) K+ I1 F0 m
  11. $collection = $db->friend;//选择文档集合3 k& A" n2 {1 s2 S7 q
  12. $doc = [//定义一个文档,即一个数组6 J% k$ B' D: }9 E
  13.     'First Name' => 'Jet',
    / g, N; y0 s2 q
  14.     'Last Name' => 'Wu',/ j+ s( r5 Q+ |( Z! b
  15.     'Age' => 26,0 z5 d5 G( a6 `3 H! w5 E% C
  16.     'Phone' => '110',
    0 u) r; A6 A* i- ?% E# G0 ]
  17.     'Address' => [7 c: ]) S0 p$ e, ]" }- m9 f
  18.         'Country' => 'China',. @5 K: R* j1 u0 p/ N
  19.         'City' => 'Shen Zhen'1 N4 C7 D! r/ h" d, a
  20.     ],
    % u  t8 z$ g. D$ K5 Z& t
  21.     'E-Mail' => [
    5 I$ \) C2 Z3 v* [, R: z' I
  22.         '123456@qq.com',
    4 x% c7 P* _2 j! _, L/ ]
  23.         '666666@sina.com',' p! R- y9 K$ o4 f6 d
  24.         '8888888@qq.com',3 N" s* D8 z$ [# X8 n( z. k
  25.         '77887788@qq.com'
    4 u- x% l+ Q8 U
  26.     ]: x( r( @6 I6 c7 I* ]
  27. ];: g( p/ v) e! w* v! h
  28. $res = $collection->insert($doc);//向集合中插入一个文档* T; T! l6 Z$ C  [- i6 \/ y; |
  29. echo '<pre>';
    9 J4 T& i0 V; f1 D, B3 G
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()1 W; j1 i! z: s; z
  2. //参数1:搜索条件
    8 [2 z, C/ ?2 \/ ~. ^/ `9 V0 ?/ t3 p
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    - B, m$ {7 G) W4 J4 i6 V8 Q/ D
  4. $mongo = new MongoClient('mongodb://localhost:27017');, V1 T& T6 x! S: y! m
  5. $db = $mongo->mf;
    . ]7 i; t! l) }/ A
  6. $collection = $db->friend;
    + U2 v& d1 x; \- m' D
  7. $one = $collection->findOne(['First Name' => 'Jet']);$ {  I+ H6 O: `/ W9 I
  8. echo '<pre>';. K" Q9 }1 d+ _& M8 p8 J
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    8 T5 o+ @' e1 X; ~1 U2 R1 v
  2. //参数1:搜索条件
    * N. @( J) H& z% s* u9 W
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    ( R- S% x0 S6 ~) F5 j8 |
  4. $mongo = new MongoClient('mongodb://localhost:27017');- D3 r& q& j! g+ W( |9 o
  5. $db = $mongo->mf;" N' |' X/ o, Q3 }! N" ~. P' u! L
  6. $collection = $db->friend;
    7 u2 T% m# ^/ M# C
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    ' H0 f" r( G* }% }  o& J& z
  8. echo '<pre>';5 X# `" A4 F; Z' Y6 a) o: G6 t
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    5 s' ~  o1 l; k
  10.     print_r($doc);
    : \/ q& ?( _+ j" l9 V/ N% d
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询" t4 x9 h1 R  [  E
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    6 X9 Z7 v  {. C  ?+ o. I
  3. $db = $mongo->mf;
    ' L2 N8 }; B7 H( s+ f. Q( a9 c
  4. $collection = $db->friend;% X$ x" @: h/ j
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);' \: \3 X( L$ B) f; D
  6. echo '<pre>';: C" m# ~9 v7 Z  X
  7. while($doc = $cursor->getNext()) {
    1 E; }) P' T- v3 G; R: Q& Y
  8.     print_r($doc);& k3 w: [, O: P/ x; d  \6 `* H
  9. }
复制代码
  //查询某个字段的所有不重复的值+ l0 Q( C% F7 x
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个8 D, N0 f7 F% U3 t  ^2 K& D
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);$ i" A( P. F# G- |9 j' L9 t; z4 b
  3. * S( [; x, l" R/ v2 y( e0 n. _
  4. //$all:匹配多个值中所有值(用于数组字段查询)  T5 `# |: `7 c" u* {) ~
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);4 |' a9 {% `, H) E/ n  T+ u
  6. 5 S7 o" L5 T" v" L# u8 S% {
  7. //$or:或查询1 l$ K  [5 B5 u7 T6 ?! g
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);7 i& w5 k- [3 r+ ?9 [: G* _2 r
  9. 0 I# Y* ?. o: R6 K) u# f
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中0 B" ?) P' [2 T9 W- \
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    ( u) u" v) E8 F: A1 v
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email) @0 r0 u7 i3 |* Y# o4 b8 q$ L* c+ N$ d
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    7 j5 }$ F+ E* l' e% n

  14. 8 g1 j, j# w7 k
  15. //$exists:根据某个字段是否有设置值进行查询) @% S, p- N% v; t8 q' Y
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    7 |3 D" \9 _+ h% `. t  H4 `

  17. 0 D$ p+ J  L" Q. u9 L4 N: h# y0 k
  18. //正则表达式查询
    7 Q5 g9 Q( T7 E
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序. L) a9 D; M& ^0 K8 |* m
  2. $cursor->sort(['Age' => 1]);4 a1 n' s  T- {. d* h
  3. 5 H4 R* Q. Y0 r3 W8 b3 j( M# y" U
  4. //忽略前n个匹配的文档) |5 B8 U6 {: v) M! e" u
  5. $cursor->skip(1);: P+ M9 X6 S% @+ Z, Z, ^
  6. + i5 C- {$ H+ f6 K# U
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)* l( Z0 _, l, F- P, W
  8. $cursor->limit(1);' Q$ i/ m& H. o$ K! U

  9. : {! w7 R' A& ~5 P; k
  10. //匹配文档的总数
    ! t5 `  |7 r% a
  11. $cursor->count();$ R- Q0 C6 F( H9 k% B% F, v
  12. 7 c9 [1 a  `+ O; s, v( ^
  13. //指定查询索引' O( i5 f( v& S+ Y, u
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计+ r8 t; ~" u- |' D
  2. $mongo = new MongoClient('mongodb://localhost:27017');" u! }% W, t0 S7 M- I9 z" V
  3. $db = $mongo->mf;2 j8 M" Z. O" i. t. x2 w
  4. $collection = $db->friend;" \2 u- P' L+ E! a' H
  5. $res = $collection->aggregate([  p" U$ U5 Q7 ?5 Q- t* V, B' U
  6.     '$group' => [, F6 r9 [/ ^3 C5 l( F/ e
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    . H3 Q/ L5 u/ B+ ^' Q; Z. M
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1, o$ {& n+ N3 E0 ?: A
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    $ m$ m2 K. N0 Z) `- ~
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    + l% s2 V/ x. s  m( i. I+ I
  11.     ]
    ! R& [& p9 }- R, `6 @& z
  12. ]);
    3 V+ r0 ^& i2 h/ _$ z' d# q
  13. echo '<pre>';2 J9 W' v( V4 w0 K
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果6 f/ C% V, c: D- ?
  15. 5 c; D+ x3 G7 t% f

  16. - ?3 i$ A/ r; a0 |4 B
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    $ q" M5 n0 }+ J6 m) k* v
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
      i+ k) P' r  P) S: g
  19. $mongo = new MongoClient('mongodb://localhost:27017');. H  d$ U6 h0 W9 X& j0 v( ~
  20. $db = $mongo->mf;
    " t9 @! A* L1 H0 C) P, Z  d8 ~& o) W
  21. $collection = $db->friend;0 j  G$ e* X! d
  22. $res = $collection->aggregate([3 I6 i/ _1 G2 }# A8 r2 U  o9 j
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 T. j5 n0 ~; j' ?
  24.         '$match' => ['Age' => ['$gt' => 30]]
    . v" x5 X/ C+ N9 I& U$ h
  25.     ],' y5 p8 k5 T( i; i9 C
  26.     [//指定分组字段、统计字段9 U& ?7 k. u" E8 x9 ~3 @* Z
  27.         '$group' => [
    7 v! X$ H* @5 O
  28.             '_id' => '$Address.Country',
    . a$ c# |' ^4 l4 t3 V
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和! a. l8 z3 a) @) @7 z' t  ^
  30.         ]8 P! R+ p% u4 V5 o4 q3 F
  31.     ],
    8 f: g, {4 Q( x! w1 i
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    + z5 c2 O1 m. L, A. l1 P2 k
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
      \: o( p9 G# L- {. V
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    , T1 F- b- I( Z( m
  35.     ['$skip' => 2],//跳过指定数量的文档
    + a* i1 L2 x5 e
  36.     ['$limit' => 2],//只返回指定数量的文档
    + q, {& t" F& g1 P0 F7 }
  37.     ['$sort' => ['totalAge' => 1]]//排序
    : g  w  p5 c! s
  38. ]);
    ! p1 z8 ~& k2 o
  39. echo '<pre>';1 S$ w; m; A) c* V( P; j
  40. print_r($res);
复制代码

9 o/ C6 f5 z7 c
三、数据修改
  1. //update()
    - m& l3 R# h  r0 ^: m
  2. //参数1:更新条件,指定更新的目标对象。7 T( F- C+ S, k; _1 e( a% j' }+ Z9 v% Z
  3. //参数2:指定用于更新匹配记录的对象。
    $ s) q1 w: i$ n8 ~
  4. //参数3:扩展选项组。
    9 H  Y: x9 E5 U  m' }3 g
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    ; d# w& Y; i' e
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    ( O5 U+ H) A/ p- S
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% }8 Q! Y/ e/ e- {: F+ ]( G
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ) r& Z' v# F" E$ C6 ]2 g6 ^
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    5 _' B% b( U6 M4 H) E- K
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间5 H( [1 A. L& I2 w( i3 e% T& ~
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)" s  h- l( v3 U' F# u0 e
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。$ |$ q. Z% [: H  e# V$ x

  13. 5 n1 @- _/ p. y5 k3 B% B( K
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值9 N) D5 m4 A4 H( [9 T
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    $ O% I, b# ^- a. D
  16. $db = $mongo->mf;# S: Y& `- x- `5 T
  17. $collection = $db->friend;2 {9 @) [9 J& T) {1 Y) q& D
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    ; Z& ], C* L' u5 r2 J
  19. echo '<pre>';
    % J6 B# r% h% S+ z- E
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
      v3 p' d+ k4 E" ?; M8 \- Z
  21. 9 i, l3 @) m4 p3 F' h# B2 U
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值! t7 S+ n  J# O# R
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);2 j& b- p- F0 r/ g' T& m& p9 ~
  24. 4 n* P" r# ~0 X6 ^4 X4 Y
  25. //$unset:删除字段
    0 x. l1 S. d0 U) l$ A4 f' Q! c; `
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);3 O  k6 w/ I0 M9 N
  27. 0 u7 i& l& n' O) o8 W+ q3 W
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    - ^0 o1 L( |4 {
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    ( w% m- a4 Q, R5 I3 f- N5 A: c
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    ' m( w1 t) m$ w* z

  31. & v# J% O1 N7 Q
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的2 A9 |9 ^  S. g* ^9 K
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);' m" s9 }+ K* @# H8 a
  34. ' d' o! W, {- H5 U
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错5 E2 r1 y8 d% H* h) W
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);$ m9 t0 e3 b4 B) `% K
  37. + c+ t) M2 n- p8 ~, x- d9 o0 k: ^
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    7 y4 e3 F6 C4 u! ~0 E0 W9 j' v
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    % V" e; A7 |3 c* b, M
  40. / K# L1 J: p3 k( W8 M
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ' q) A9 ~; w. F5 R# X& f1 |: }
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ' t& k+ F4 v% U/ O4 P8 z0 R
  43. ; ^: x( ?8 u: t1 `6 A' d; s0 y
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)& _& K3 o. E* h0 u. y5 W7 L2 o' A
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    / i8 s) K* c& V: {3 a
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ' @1 @" z1 X. L; r7 H

  47. + J  W) \" a2 A" u6 m0 z
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)$ Z+ }% n5 x+ `- }  c  Y* X9 w/ C! y
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    4 q( o2 x/ ^" B0 \2 h. U) y

  50. 9 f) b) A" S0 f4 F" T( M
  51. //$pull:删除数组中所有指定值" A: f+ I+ `8 G
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    3 J3 P  y( U' C8 p% W+ J
  53. * k7 t: E' E" v: [
  54. //$pullAll:删除数组中多个元素的所有值4 f% V6 p2 |4 E. [
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    , ?, P0 ?# Z. Y
  2. //参数1:希望保存的信息数组
    3 W9 U/ E9 ?3 L5 |
  3. //参数2:扩展选项+ Q8 V5 w2 f8 X* d; K7 e/ a, n0 V
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。6 L. O; c7 I, U) t/ x
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- V8 j- I) Z, q0 P: T
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。& y  t: J/ N7 Y, |: Q
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间1 n, K, }/ Y+ z, h& [, b
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)! [* g1 s: \  A9 Y# m1 q
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    ; h  }( h: ?7 m6 H3 o# F
  10. //若想更新则应该在参数1中指定_id键的值。
    7 n2 k+ f  j9 u/ ^& W! t
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    0 X- b. A4 f( X4 z7 Y% ]7 m. m
  12. $db = $mongo->mf;4 t* {$ [( T# A  }9 _. _
  13. $collection = $db->friend;7 y) z' b; D# G( j
  14. $doc = [//定义一个文档,即一个数组4 _3 B) v# j/ l# p, [& T
  15.     'First Name' => 'Jet',
    * z' Z9 C# f9 O1 ^! o7 |
  16.     'Last Name' => 'Wu',/ C3 B! ]6 r# y3 E  d5 P; f
  17.     'Age' => 26,
    % p6 z& F5 q4 ]
  18.     'Phone' => '110',
    # T$ g- b6 z2 ]0 V
  19.     'Address' => [8 e. ^  f6 W5 I! C
  20.         'Country' => 'China'," _  r1 l- \; w+ u: Y" l% z/ M6 c7 C
  21.         'City' => 'Shen Zhen'
    8 ?  z7 q5 f8 l  E
  22.     ],
    : E* K5 t. \6 b0 @  B
  23.     'E-Mail' => [7 q: V" h6 i3 u  p# h  A9 Q3 X% c8 h
  24.         '123456@qq.com',
    / j/ E( s; K9 v. L$ q
  25.         '666666@sina.com',5 G( `9 e0 _& c$ ~
  26.         '8888888@qq.com',2 n" Q5 E% X) a
  27.         '77887788@qq.com'
    ' m" K/ |) U! G# c1 J/ m. W
  28.     ]4 H) F1 }# Z% u& j5 }+ g9 z; Y. \0 m
  29. ];
    ( M3 }. H  m/ ~. N
  30. $res = $collection->save($doc);# ?) F" H! }' P1 I4 Q$ t
  31. echo '<pre>';
    / X  j6 M& S' Y4 e4 v7 u
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    % E, ^( b: S/ I4 t0 Y4 Z% S: }3 L% E
  33. 9 `" {3 s# t0 z& C5 b' O1 W1 Y/ H
复制代码
  1. //findAndModify()1 O, _: N- l1 J0 X& f6 ^
  2. //参数1:指定查询条件1 o2 Q+ Y  G$ b4 F- M! h" t- E" L
  3. //参数2:指定用于更新文档的信息! l0 \# }% ?9 S4 Q, V1 v3 ?! a
  4. //参数3:可选,指定希望返回的字段
    / O, y  z, @9 E% r8 p8 t
  5. //参数4:扩展选项
    ! g: {) h7 V! z8 s6 U9 W+ k
  6. //  sort:以特定顺序对匹配文档进行排序1 m2 K: m- W1 g- k. H- O. E, {
  7. //  remove:若设置为true,第一个匹配文档将被删除
    ; v& U" e8 X) @, g( q/ V
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    , i) M" o: L; Y
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档4 b+ I. V, X6 K; `
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    * v" E1 M5 p. u3 J* b% d
  11. $mongo = new MongoClient('mongodb://localhost:27017');; z. ?' s( l" E& p; g- t
  12. $db = $mongo->mf;
    + [' T0 r% X7 A% k+ Q
  13. $collection = $db->friend;
    . J" u' j1 F$ o& v
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    , O- V* l) G" _1 p
  15. echo '<pre>';
    ; {0 K9 k  c( X- A  ?% d- J% |- ~
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    + ^7 N- v* Z4 }  g+ n
  2. //参数1:查询条件- ~) o" C. R/ r; k2 {$ W% y
  3. //参数2:扩展选项. W5 ~* o- q2 u$ @5 g9 k
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除, c9 u8 @, O" O$ h
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    5 L5 I4 T* n$ T0 P
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% J6 o1 s  p8 \% S7 @  ?; j( c
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, Y2 ?5 X( S, l# g0 ?- O
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间1 _) u0 ^7 B1 D$ M$ C# {$ D
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)$ a% k* m5 l, E! d# r
  10. $mongo = new MongoClient('mongodb://localhost:27017');/ b, f, q7 _: P% `
  11. $db = $mongo->mf;6 J- }+ b. \( S: E- J
  12. $collection = $db->friend;" D3 Z1 l3 ~* t. V1 P0 l- F2 p
  13. $res = $collection->remove(['First Name' => 'jet']);
    2 X3 y& e* H+ U8 L
  14. echo '<pre>';1 ^4 K" s5 [/ z4 n; S$ C
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

! ?" y, y) v: Z
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。
8 S% O7 j) k* O. |% o& d' n
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
) i# M: K. h- r6 ~/ e. L
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');1 u. q3 R* n/ |* K! D; }9 D
  2. $bulk = new MongoDB\Driver\BulkWrite;0 N% l: e% _3 }' @( M& W
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);$ w; O/ e2 U9 X. G. y# g) Q; |
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    8 A: N: t0 ^  R! e& l/ F( e$ ]
  5. ! H) k2 k; {6 O- x+ q
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认+ A3 t+ ]0 k" X
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    / z) N9 S2 B, x" \+ D  ]
  8. echo '<pre>';
    , B( V2 ?6 m5 N" u+ @
  9. print_r($res);
复制代码
: s! t! P5 P! V& H4 m  F
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    , j, X7 ]4 B3 }6 T' }3 j/ C; U
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    # }; j: `) |* @8 N7 i' v
  3. $cursor = $manager->executeQuery('wjt.friend', $query);- ~' Q4 j3 v/ H+ V, t
  4. : e! _7 U/ \, k2 p8 }
  5. $data = [];
    $ s& a1 r4 d; V" c7 h8 `+ j( z  N
  6. foreach($cursor as $doc) {$ A' g$ ^( D+ Y1 e
  7.     $data[] = $doc;$ A1 w$ K( p5 Y! W  l
  8. }( s2 O, c. `8 S
  9. echo '<pre>';
    ; ?) k. F5 K# j8 ^1 x% a
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    $ L9 u& i% Z9 p, W, f
  2. $bulk = new MongoDB\Driver\BulkWrite;
    0 @+ J6 o$ [9 b
  3. $bulk->update(6 X, h5 {% y! v1 H2 H9 }
  4.     ['name' => 'JetWu5'],
    4 O- [/ o! V4 v* j7 I
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    / }1 `9 j" r9 Z2 I$ a+ P! m
  6. );
    ; a9 ^( l( J8 t; }. _
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认. ^. x4 Z9 z; A2 A3 S% g) Q
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# ^( F5 D$ U: D  b: U* x; i
  9. echo '<pre>';
      U7 {, [4 ~; e; v( N" D' O
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');6 h) ?* k' t( h- V5 ]
  2. $bulk = new MongoDB\Driver\BulkWrite;0 V0 w9 l  {; q; J) M
  3. $bulk->delete(['name' => 'JetWu3']);
    / M) S7 R! [  W: h' _' S( b
  4. $bulk->delete(['name' => 'JetWu4']);
      Z+ L+ o' z6 K( n; N+ v
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认/ B( c6 r) d& D, J
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);4 P2 D" M1 d3 K( y
  7. echo '<pre>';
    ; A5 v5 B, h. N' F, }' R
  8. print_r($res);
复制代码

. _  ^6 u: ^- Z( u
. C' ?; e- p% Q
# c, X  a3 a+ Z

" `- q! v! ]" {0 P0 k
% T9 O+ w: F! Z! d/ b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 21:49 , Processed in 0.055677 second(s), 20 queries .

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