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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14078|回复: 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()
    $ \0 r- ^$ `& o. L2 ~
  2. //参数1:一个数组或对象
    9 O! \! B/ o% J
  3. //参数2:扩展选项
    ! {+ W4 q! f8 u% \/ D* o
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    . e# p2 D: B' b
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    , Y2 u9 G: E8 r  b* H. E( v
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    3 y  q+ w& Q2 U9 w0 g8 `% y) a
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    7 K2 @: Q( Q) W: r% R# Q6 F5 O
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    7 Q! ^1 x# M% K1 I+ u
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    8 g, ]0 d4 E9 ^
  10. $db = $mongo->mf;//选择数据库' I7 f/ L& _0 q7 i8 L0 e
  11. $collection = $db->friend;//选择文档集合
    - T- I* c4 W2 C  ^# P% `/ }7 s
  12. $doc = [//定义一个文档,即一个数组
    ; M8 w; [% ]" D
  13.     'First Name' => 'Jet',
    4 a) W* w% F0 t) Y) _
  14.     'Last Name' => 'Wu',
    ( l$ V. e7 A  p3 D
  15.     'Age' => 26,
    5 ]2 N+ u6 Z0 @7 k2 ~( S8 [
  16.     'Phone' => '110',, {2 F4 E) ?+ P( U. p8 |
  17.     'Address' => [
    0 ]3 g+ F( `" ?( ~% S- s4 {' ~
  18.         'Country' => 'China',
    4 H1 O7 y' s/ Y7 X$ a
  19.         'City' => 'Shen Zhen'
    : D9 x) D7 E" |7 \# _: d/ p
  20.     ],
    " B! o  M9 R/ E  i) n
  21.     'E-Mail' => [4 j& a  E( L+ g8 Q% x( ^
  22.         '123456@qq.com',  q. x' y4 ^3 U) k' T8 t  ]  j
  23.         '666666@sina.com',
    ) h0 }6 q% w& v/ ~. i1 `: p
  24.         '8888888@qq.com',5 ^  b! F' j/ L2 e& u8 h
  25.         '77887788@qq.com'# b& t1 T( W1 }7 {- m, J
  26.     ]
    * N: X% @% @- v' Z. e& v9 D. \- q
  27. ];* Y& E# I& Y3 K0 r
  28. $res = $collection->insert($doc);//向集合中插入一个文档" Y0 X1 p; p0 o1 E7 A& W
  29. echo '<pre>';
    1 |$ W/ e4 x3 q3 C
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    % s0 F& k! i; d. U% n
  2. //参数1:搜索条件
    : l' e  ^% g  S0 G$ N3 f7 }8 V
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    " t3 r: i- P' K& s3 z
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    $ Q( _! ^2 R* I8 J) u$ B2 b
  5. $db = $mongo->mf;. d& s# ?  O7 X  ^
  6. $collection = $db->friend;2 b1 a; z8 \3 }- Y0 V
  7. $one = $collection->findOne(['First Name' => 'Jet']);7 v8 H3 S% G3 ^5 o% k- p7 r0 x5 g
  8. echo '<pre>';$ M0 ^- o+ u  R3 `6 e* _3 l, T
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    1 m4 E3 s# h4 M) u0 q% ~. N
  2. //参数1:搜索条件. ~' X4 h$ ^- f2 g
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段! X2 ^0 j% C8 p# H9 z
  4. $mongo = new MongoClient('mongodb://localhost:27017');8 f" x3 J$ g7 W3 z8 f4 I
  5. $db = $mongo->mf;
    9 L* c7 F. w) h: m
  6. $collection = $db->friend;
    9 k2 p% _  T4 q/ S+ a, Y
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    . s$ w" u. s* e4 `! I
  8. echo '<pre>';
    9 i# U( {+ ^+ x! [5 S- j
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    2 y3 C/ c, S0 m! D& T. `: {( l
  10.     print_r($doc);% r# T! B7 V2 O
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    - a% z6 a2 @& Y
  2. $mongo = new MongoClient('mongodb://localhost:27017');) S8 Q1 f# x- }8 x( x0 C
  3. $db = $mongo->mf;
    + ?$ L) [; H4 v* l! a1 F
  4. $collection = $db->friend;
    $ J, L9 P% b+ u1 u& J
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);: P+ W5 d9 R; L3 I. T0 ?5 z
  6. echo '<pre>';
    + C0 ~" @6 J5 k5 U. q! E: `
  7. while($doc = $cursor->getNext()) {  l4 S! x* O5 d% n9 k( a
  8.     print_r($doc);1 _+ ], P9 K. U6 E, v
  9. }
复制代码
  //查询某个字段的所有不重复的值
* s# J/ z- v- I. H4 X9 M( K& Y  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个# V' G0 i' R$ e# l
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);& b3 B+ ~! {; e0 d3 |
  3. ) S5 ~4 r3 T+ N1 @: u
  4. //$all:匹配多个值中所有值(用于数组字段查询)1 }3 j( J! W0 W, r' P
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    1 A, w: _2 G; C+ D9 `# X

  6. : {7 @; w2 I- I6 D, w
  7. //$or:或查询
    . s0 Y0 k: e- W
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);, C# a  C7 b: `% @9 C
  9. / Q+ J; A% H: X, \5 G# ?& {
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    ) d# u" w4 C% _, O1 G
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    " f% ?& ?3 D" k5 q: ?$ V4 K5 G+ d
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    % q0 z4 v' l/ z: M. Z, b
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    ) B; }6 }8 R4 o( T

  14.   ?9 Z) @. U- V) O
  15. //$exists:根据某个字段是否有设置值进行查询
    ) s6 `9 R6 V% q- Y
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    8 ^. w* b4 |: k* ?8 \: J  p

  17. " h3 w  E8 A" u
  18. //正则表达式查询# U: W1 `6 u% [1 `* H
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    3 n7 e3 c$ B3 y: h5 X7 h
  2. $cursor->sort(['Age' => 1]);# d  d! z( E. ]  o( Y" t

  3. $ d- c! m6 u9 _! u9 J
  4. //忽略前n个匹配的文档; h$ k$ t" `' ^3 b
  5. $cursor->skip(1);$ q# ]( P9 A% t* W8 k. S
  6. $ b. P/ }' l' h9 }: g+ }' f
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)' {+ U! }+ c4 s/ Z; N; |. A
  8. $cursor->limit(1);
    2 t; P" u* b& Z1 z6 M

  9. ' ^+ m& R# l  |# ]+ ?
  10. //匹配文档的总数7 v0 h7 }* }: j# Q# R, r
  11. $cursor->count();
    9 r" Q! x3 s( @! v

  12. , ?1 N! C7 @1 Y6 y
  13. //指定查询索引6 n7 @/ B* ]# h; D& ?5 {8 n
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    : z+ O9 i9 O3 b% c; L
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    : J6 s8 p4 o( P$ x; {) ^+ f* \5 C4 {% G
  3. $db = $mongo->mf;
    * v8 q1 A: j2 x% i- u/ S9 M* ?& Y
  4. $collection = $db->friend;( F5 u7 k3 H& b' z- G' ~7 r+ [
  5. $res = $collection->aggregate([
    6 |+ v! S3 c/ b" f/ m
  6.     '$group' => [8 H5 j% i/ @1 g
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组- h7 J$ \' f# r5 B3 L
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1) g7 t! D; z8 O1 X  v3 L6 j! ~
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值/ _- e1 |) K+ P
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值( L' m% y2 v. }1 b. n  z
  11.     ]
    * X  D1 T' @/ N; ]/ L# W
  12. ]);: x% m. p9 S5 `% u0 a+ U7 M+ m
  13. echo '<pre>';
    * L3 X- F0 ^5 N* Y9 S
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果) |8 ~! N: v. S& r" @- m' @: y

  15. . M* b. a( W, e1 c# j) b

  16. ! {3 p9 U) a* v9 D$ P! Z' o
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    - c2 K. d  j1 [) p2 r/ D
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
    0 N3 A9 W3 f: S
  19. $mongo = new MongoClient('mongodb://localhost:27017');4 H: L7 h3 q; P0 h( Z" B/ I5 w" |
  20. $db = $mongo->mf;
    # p2 |( f2 T0 g
  21. $collection = $db->friend;9 s) @2 X! [' d7 ~2 _0 H
  22. $res = $collection->aggregate([
    & N6 z/ t( B* r- q" r) ]% f& N" ]! c
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    ' p+ Q, K0 J# l) p" j
  24.         '$match' => ['Age' => ['$gt' => 30]]
    ' j& I7 ^& q! y* g0 Y$ b; r
  25.     ],
    ; M6 P  ]- S5 v% b% ?/ R
  26.     [//指定分组字段、统计字段) \8 @7 e) Y6 U- n$ }5 s
  27.         '$group' => [
    / y, G2 f+ q; }7 ?$ c0 z3 D
  28.             '_id' => '$Address.Country',3 b/ g7 p, P; E5 i" @- j  I- ], ?
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和- d" p* s6 U- E0 p% {
  30.         ]. R1 i6 a( [: M- R
  31.     ],' U* t1 }2 w4 I& o# J: I
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档7 }4 L/ W4 y; p7 Z' x1 E
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。7 @( A1 Z' @8 E: q# H* a. f
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    2 [& }* b. N) Y! o' R# ]& V
  35.     ['$skip' => 2],//跳过指定数量的文档3 X" Z- g( _1 g9 r9 O9 j4 y
  36.     ['$limit' => 2],//只返回指定数量的文档/ J0 K9 O5 h' m7 M
  37.     ['$sort' => ['totalAge' => 1]]//排序
    ' M5 S" Z0 `( E/ G% R
  38. ]);/ ~: }( }4 D6 X! o1 l. ~9 l
  39. echo '<pre>';
    $ R) z3 Z+ W7 {; z
  40. print_r($res);
复制代码

9 X* S  O9 c( j; ~0 S. _
三、数据修改
  1. //update()
    , R4 i) S1 {) \0 h
  2. //参数1:更新条件,指定更新的目标对象。" Q- A, y" c! H- K$ |4 F# H0 K" q# Z
  3. //参数2:指定用于更新匹配记录的对象。7 V9 ?& T# b9 _7 s0 V
  4. //参数3:扩展选项组。. X" E- M3 H0 ^, {- h3 F" n; o/ R' N" Z
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。9 f; ]/ y& W& W9 w2 ~) E
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。5 j9 ^3 i/ f6 `8 e; V
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    7 B0 y; B- E: U# j
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作1 s, ?4 S: Y! j- f  r' \
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    0 v$ ^- m* w8 C% ?
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    3 @$ `, ?7 P; A+ d
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)1 W% j) i) ?3 Z9 J9 w
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    5 [# B! f3 \2 J0 ]
  13. $ `& a* I9 |4 u, G; y7 K
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 C: w$ H3 h/ j1 u0 h9 J7 M& u
  15. $mongo = new MongoClient('mongodb://localhost:27017');6 Y& n/ R; e5 Q0 F! T
  16. $db = $mongo->mf;
    $ A$ `+ {  e$ z3 L4 m. }( ?
  17. $collection = $db->friend;
    1 {* h2 w! D0 |! r
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);: s3 ]! x; i/ I" w8 N! v1 r
  19. echo '<pre>';
    ( M% h3 s6 ~. M, i
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量( W; I# G: A5 N$ o' Y

  21. # p2 U2 t; e& y& n
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值/ S) |  N! a' n
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);6 T1 ^% A; W5 X7 O
  24. $ X* m' I' s! B' {; |8 F5 Q9 b
  25. //$unset:删除字段5 R1 u: z7 b" j8 C& ^& v
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);) N* V* ?/ ^2 v8 Z* z2 l, b
  27. & Z( a0 V8 F8 q5 A/ ~( B7 K
  28. //$rename:重命名字段,若字段不存在则不进行任何操作" L! Z0 y$ J/ i+ S0 S+ g
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);# x6 X! s5 u" D/ h5 N1 |6 [
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    $ d3 J/ C# I3 a% Z
  31. 2 _2 P! h- Z6 d$ E& S
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的: r3 X* w; ~  A- E3 F' z7 g
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);, V$ n, K- X5 q; o+ q

  34. , t, m" Y2 z2 S
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错. m2 X- C8 k: ?5 Z; P" j
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    0 m) M( z9 {9 S+ R2 R
  37. 1 q" W- P8 {. |8 \' n/ j& y; m
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    4 _; Z! n7 _/ `2 T; M
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    * g* \5 A7 G& _4 v0 N; i0 N; m6 V
  40. 9 e6 g3 S2 k8 _) P' B. d! s- N
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错+ Z" g- }1 ?4 c& g
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    : m: Q! u& S: E( }! A% [7 O0 m) U
  43. : x. M# A% d6 z) w, w
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    : ?5 V  f3 b& o' F
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);5 Q& Y, _8 b* m7 O/ s' m8 b
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    . c- {2 J8 p  Z. T- W' a( c' \
  47. # d: Y* Q& Q  w4 O4 P9 P8 i
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)+ n, Y+ N; w9 W: v3 Q0 X  W1 z( Z
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);+ T' A8 C- o) p9 K  A/ @

  50. $ ?# s- }8 X6 r( N, Z
  51. //$pull:删除数组中所有指定值2 B" F* ?, ]5 F+ J" F0 H7 n" }% Y
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    : J/ U) R8 [& ^; D2 K% c9 r

  53. 6 Z' {1 B' m4 e* `" b
  54. //$pullAll:删除数组中多个元素的所有值
    : J! b& f5 g  s0 X$ E9 I$ k: g, [
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    / B) j, d% L' `# e  O
  2. //参数1:希望保存的信息数组' P# E4 Y% ?: t  _0 Y0 ?% \' P& r3 [1 h
  3. //参数2:扩展选项) [0 K0 s0 `/ Y
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。. g/ m6 N5 T/ u! k
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    # E  R7 D7 B- g4 I% h- d. K
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    - b+ W4 J& o( z9 A' {
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间, _- S, A% }3 S$ @& i
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒). j+ u9 @& S% K% Q9 a. x
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    3 M. K+ [0 M! r9 B* |
  10. //若想更新则应该在参数1中指定_id键的值。
    + y+ p0 V8 @  S4 G9 V" f
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    / J% x/ A; ?  w! p/ G3 X4 s3 G
  12. $db = $mongo->mf;" Z. f2 w; L# I  L5 l  R6 ]
  13. $collection = $db->friend;) O/ U- F- F) J7 \; P
  14. $doc = [//定义一个文档,即一个数组! M- ]! R0 ~( }+ {
  15.     'First Name' => 'Jet',
    % J: _, [# f$ R" F
  16.     'Last Name' => 'Wu',
    3 }# S7 `9 r" }5 z5 q7 g; E/ x2 s& N" {
  17.     'Age' => 26,
    $ P$ @$ k$ V9 k! @3 M3 x2 t
  18.     'Phone' => '110',
    0 d5 r) s. N' M5 q: e+ \; S
  19.     'Address' => [  e( }3 }  O5 z
  20.         'Country' => 'China',
      V7 K7 @& `4 I( {. i. Z0 _+ Q
  21.         'City' => 'Shen Zhen'2 h/ g8 \5 A) `6 K" y
  22.     ],5 J' M1 b3 \' t
  23.     'E-Mail' => [
    & b' U+ S1 q7 Q* h" w* D) Y7 I( w
  24.         '123456@qq.com',
    . ~- D7 I8 S/ t6 n6 F! N
  25.         '666666@sina.com',; q' K! I) {8 V9 s. x& m# ^
  26.         '8888888@qq.com',4 ]2 c9 W5 P0 I  P3 b: A! l& E
  27.         '77887788@qq.com'% `! L. O. h& a3 q+ Z
  28.     ]# M) v4 j( J$ w$ t# t% U0 j
  29. ];
    . a6 m9 O. ?* d( |. B
  30. $res = $collection->save($doc);
    - o+ v5 v" b" T8 N4 I( v) u
  31. echo '<pre>';
    $ P3 F2 R6 v8 m/ I% a% `, ~0 g9 z
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    . C9 ~' H& K9 h& l# }4 ]7 `, A

  33. 0 F+ w4 a/ v- L3 m# e
复制代码
  1. //findAndModify()$ B6 V( T0 C4 V. S' t
  2. //参数1:指定查询条件3 A# P! V  t# ~! T
  3. //参数2:指定用于更新文档的信息
    * L" d0 b6 r6 ]  @3 g
  4. //参数3:可选,指定希望返回的字段
    , ^+ j( @0 [; z  X# N  g" W% h
  5. //参数4:扩展选项2 O0 ]/ h3 _  T8 w( J0 X8 R; a
  6. //  sort:以特定顺序对匹配文档进行排序" O) o+ @, j- v- v5 e. Q( R
  7. //  remove:若设置为true,第一个匹配文档将被删除: T+ F+ K( U* B  W. L' ?) G
  8. //  update:若设置为true,将在被选择的文档上执行更新操作1 K/ Z  ]  H! j4 ~! a' K
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档6 i. N5 j, ~8 }/ {% R
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档0 z; y4 Z  u  E
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    7 K! C0 ]' B! n6 A; H$ _
  12. $db = $mongo->mf;
    9 S3 q2 M5 f0 T9 o: ~4 h
  13. $collection = $db->friend;
    $ N, X) i) ^4 {
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);6 O! u, Q: |. J
  15. echo '<pre>';% P2 k- T5 p  X1 N3 N
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()8 R2 b2 k5 |9 E: E$ F7 w" H: U+ i
  2. //参数1:查询条件
    - L9 V8 L1 n/ M
  3. //参数2:扩展选项
    ! q' k) a$ j2 W+ \
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    ! N1 s. h2 K/ G5 ~% \  U
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。3 d0 y0 _, ?- _6 E
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ( {: V$ h9 U+ v+ a, I; {: y1 a/ x
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ! l* b, r! f% h' t* P
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 H. r7 V9 k3 o3 F* c  k
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)( O2 b6 K# L5 w5 O& t; m1 u5 z7 q
  10. $mongo = new MongoClient('mongodb://localhost:27017');: g5 s; h* i. n1 I% p5 L# Q3 t+ N
  11. $db = $mongo->mf;& Y! N" [4 t# x) H9 N
  12. $collection = $db->friend;
    ) {% E8 B, q" G
  13. $res = $collection->remove(['First Name' => 'jet']);9 B( D+ t. [2 W+ M2 z% t
  14. echo '<pre>';
    6 m- L) C4 L; h4 L2 R2 L
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
& _1 _$ Z3 t1 `. v) `% P
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

" |. M- H4 m1 c, l9 I
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
5 T) o  _5 G+ }# _
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');/ u3 @3 u- X0 e& a
  2. $bulk = new MongoDB\Driver\BulkWrite;9 g* g( S1 p0 {6 w9 Q1 O1 W
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    1 d7 E: k; e1 \7 u" @  f0 B
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    ( B5 V2 o2 I! J7 L: v
  5. 6 ^) Y0 O  f+ C% d
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 n3 P0 t* J2 L; [4 D" E0 W* t
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);6 s6 r# S6 {; W% n6 g8 B' h9 Q- b" J
  8. echo '<pre>';
    4 ?8 T) O$ m) v6 M  C
  9. print_r($res);
复制代码

, w" a, {" o) {( f+ \
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');* o- o2 S' v! N+ t  o) g3 l- s
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    . L. m' Y7 N' @3 F. D& I
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    ) f0 C" Q$ d2 b0 p1 {9 l- X/ o2 o
  4. ( Y2 D( O. B9 D( `, I5 A
  5. $data = [];1 m) F) q- ~* g8 _- `2 t7 D% Y* s
  6. foreach($cursor as $doc) {, ^# T/ V( ]& D
  7.     $data[] = $doc;: z; X# m+ T. A# w% q
  8. }
    : ~, o1 @1 `+ h" W- r
  9. echo '<pre>';$ T% d  `* z$ L
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    0 Q/ u4 Z6 l0 Z
  2. $bulk = new MongoDB\Driver\BulkWrite;7 O5 S" a( s5 K! m; P5 R- d
  3. $bulk->update(  e6 P* u" L1 u
  4.     ['name' => 'JetWu5'],9 ]' J2 e* u$ F7 Y" O
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    $ C' I4 I9 d3 d; |3 r2 F
  6. );
      ]+ E0 ^$ K( X8 x
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认0 j/ A, z' |; K4 l, O  X: j
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);1 J9 L7 @% Q+ Z
  9. echo '<pre>';
    : ^! ^+ l# }0 Q% V4 b
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');/ Q2 x1 ]& A9 R% z
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ) ~% f& D) Z7 j& ^9 {# W& M
  3. $bulk->delete(['name' => 'JetWu3']);% o( Y. \2 k% t8 ?- I2 g) y. Q9 ?
  4. $bulk->delete(['name' => 'JetWu4']);. Y* ?  G4 i* _0 {
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认# A' P! B4 j% e
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);0 v/ C  w; M4 @- E8 F. S# V
  7. echo '<pre>';
    - L1 f5 s& D  X$ f
  8. print_r($res);
复制代码

$ C) u0 _" `2 m8 e3 j# S5 E' u3 j3 d+ K

: |% W4 B8 ?: l$ P

  |/ H5 G2 W7 ]$ D, _! H1 O% I1 o$ B  ?) Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:13 , Processed in 0.056058 second(s), 19 queries .

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