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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12870|回复: 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()
    9 F) E* A& l: g7 X' p) z
  2. //参数1:一个数组或对象' ^/ g: y1 r  q9 n% ^
  3. //参数2:扩展选项
    ; @* ^  I7 l% b$ X$ X
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    " }/ |3 ?5 m) @" f+ N4 @
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    ) \- t6 W  M* }! z
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认/ |/ u8 Q5 }) V2 [
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    7 o8 y8 v' j" Y+ t1 m2 K; K
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    # Z' v6 p! ]0 I
  9. $mongo = new MongoClient('mongodb://localhost:27017');3 H9 y0 o: ~# f- |% x) f
  10. $db = $mongo->mf;//选择数据库# K! r) z2 {( w
  11. $collection = $db->friend;//选择文档集合
    & ^: r. {" ?; X7 z# b* G
  12. $doc = [//定义一个文档,即一个数组) W* v2 i& l% T9 T" e# _
  13.     'First Name' => 'Jet',
    0 {: x/ n! |1 u$ z8 |8 v
  14.     'Last Name' => 'Wu',
    , H9 L. {" u1 r- J( p
  15.     'Age' => 26,, y% x6 `8 u# n. F' v( E$ I4 f4 M
  16.     'Phone' => '110',! j" Q3 g' [4 h, Z7 A+ g) r
  17.     'Address' => [
    6 u6 Q  x/ i: t# @" c
  18.         'Country' => 'China',
    ; h+ E1 x& o- ?! M' L4 g& B
  19.         'City' => 'Shen Zhen'
    ' m5 L! W$ {: V( }" @# ^$ T% t, O5 X
  20.     ],
    / F" ^1 ?; [& r# @  I/ l
  21.     'E-Mail' => [% K/ k& F) c; A9 f
  22.         '123456@qq.com',
    2 K+ V" C9 a. B* O8 C
  23.         '666666@sina.com',
    8 T6 p3 s( B; g/ k, G4 _, E% A6 o' R
  24.         '8888888@qq.com',
    $ H) W: h, W* J2 _
  25.         '77887788@qq.com'" n" g/ Z) U5 ]# P
  26.     ]
    / f3 d* G/ h3 o
  27. ];5 l) f) J! z$ x  o: z
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    5 ?4 X- h- n, w
  29. echo '<pre>';' O1 g: g$ ]% k# P4 j8 N
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()# F) \; N' l8 I3 G" o
  2. //参数1:搜索条件5 o* i8 h9 Z/ V6 }* u' i2 ]
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段/ d: V: c& N/ V$ |- Y1 N
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    / E- _5 G: y" q& y9 Z
  5. $db = $mongo->mf;
    , w/ h5 ~0 Y2 g. k! X
  6. $collection = $db->friend;
    / D* P! E9 z1 X7 I0 z) F: b7 ?
  7. $one = $collection->findOne(['First Name' => 'Jet']);& e, Z" d& y: g2 y# A
  8. echo '<pre>';, h/ e' J8 n% c
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find(): ]6 V3 ]# d1 k/ ?
  2. //参数1:搜索条件0 c5 l0 [) L6 `) ~6 g6 u6 |& e, r
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段; q" S4 @8 T/ {
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ( `3 [6 N3 B3 h$ T6 f$ c
  5. $db = $mongo->mf;( b- F6 m! f& d
  6. $collection = $db->friend;
    8 y! Q# r4 v9 I
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    / b" T3 q1 A- I% b% V+ ?
  8. echo '<pre>';
    ( x7 o! K9 B% O4 O9 ]8 g
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    1 m# q3 S( u3 Z; m) U; ]
  10.     print_r($doc);2 k' h2 E# U( g$ y9 ]/ Z
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    3 n: l; b9 ?2 A8 o: k* T
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    4 }7 P# y5 \! |" W, B+ A3 ?
  3. $db = $mongo->mf;, l# A9 z, N+ `3 l" H: `
  4. $collection = $db->friend;* T0 n+ Q  R  X& F. h5 s1 N" I
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
      a0 ?: }1 Q+ Y, d2 L, G2 W
  6. echo '<pre>';9 b% @& K! L! _! y2 d( Z( H
  7. while($doc = $cursor->getNext()) {
    ( d( X. @2 I+ x) m  a+ m
  8.     print_r($doc);, b9 y9 F3 y9 X: t
  9. }
复制代码
  //查询某个字段的所有不重复的值
& \, B, L( @5 i4 u. r( c$ P9 w; K  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    / a8 O- P0 Z% d
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    " F, V3 \- {# D' [

  3.   Y5 H3 N: J1 P9 t. b$ @
  4. //$all:匹配多个值中所有值(用于数组字段查询)/ ~: U7 Q+ I# Y: V  O: `' [5 F
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    / U; I, C  O: K$ o+ o5 @% y8 T+ w

  6. , a) E+ `9 I, [/ ~  z2 ]# J
  7. //$or:或查询
    & a) a' b! X8 a: B% t
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);4 `+ b- w* H% e/ R6 ]- I* M6 V

  9. 7 m9 o9 N: e" S2 }% S
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    9 Q4 r* N7 Z4 f7 b0 q% S1 p
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    ) ~1 g2 k4 y* j7 {1 Y
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email( f" o. s1 B( E9 u6 \, y
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    2 n6 W1 y8 A* ~" I2 X' n; e

  14. - f8 _2 ^* P% T
  15. //$exists:根据某个字段是否有设置值进行查询& f  y6 q$ q0 B' A+ X& W( J
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    ' Y. K4 d1 |1 T3 [6 b: h" X1 H
  17. 6 G4 G, A% ?, s: t) b8 j  }
  18. //正则表达式查询
    " x- o/ p# \* S% S+ ^. U
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序  g, o1 p$ ~8 _- r' F
  2. $cursor->sort(['Age' => 1]);1 O' ], ^* b2 k/ a
  3. / v6 m; Z, a: D' I7 \6 [, s6 n
  4. //忽略前n个匹配的文档
    $ h6 p: M) B( q. F9 f1 s1 ?
  5. $cursor->skip(1);' x# w, a6 m" q# s- l/ q! F& {

  6. " v" z3 K% ~% ^2 s. w
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)# f; _  ?$ |$ c; B
  8. $cursor->limit(1);
    " C; ~9 [3 z2 e. F- P8 |
  9. $ N) ~4 Q# `& `' c) a. O. M5 y
  10. //匹配文档的总数
    3 m  _; \6 Q+ O% `) K1 {1 S, T
  11. $cursor->count();; u6 \2 N% j% N+ @( m0 ?) A

  12. + J- q) y6 ~) v" |0 D' o+ S
  13. //指定查询索引- L6 {9 C' P$ P
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计" e9 X/ ?$ @' l" e
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    2 V% |1 L; R1 w! E) ^
  3. $db = $mongo->mf;
    $ l/ |% B7 b0 G7 w- r( }1 R; Y6 Z& C
  4. $collection = $db->friend;
    $ I: a% R% ^0 w4 M& `6 A0 U
  5. $res = $collection->aggregate([5 _0 ~7 V; R: S( a! `: t& G8 `- v
  6.     '$group' => [
    $ u& U, ~" E/ `3 v! V' ~/ r
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    1 l; g9 @- n: `( Y) B
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加11 }; z, P! L0 N% I0 P$ R% E7 g
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值; k* s; s" f) y! {2 A! t, {
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    ) @0 d! G# Y) l  q
  11.     ]: u1 X; O! A: N$ o1 t
  12. ]);$ r3 k" j! }5 v+ d6 w2 l! m
  13. echo '<pre>';
    1 D  f4 l; N8 x& H. E* L0 T  I3 d
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果
    " w5 X& I0 O) ?3 w7 z- S7 k

  15. $ {9 X% p# E* X% F% `7 @

  16. , T" S# y! V) q7 J+ v! ?
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    4 I! p' D% Z) X  _; A
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。  H( w# w' j& j% t' N. C
  19. $mongo = new MongoClient('mongodb://localhost:27017');' [7 T# m& H/ C" C# M) i# f
  20. $db = $mongo->mf;
    9 R& X$ j: i# e7 l8 y8 I9 h
  21. $collection = $db->friend;
    2 n  G+ u& Q5 x2 ~( i9 k3 V
  22. $res = $collection->aggregate([0 b4 E& L0 N8 [9 ]- s
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档+ O5 ~% {# p- O2 I( O- e7 f( u
  24.         '$match' => ['Age' => ['$gt' => 30]]  \! H2 z- f. Q6 E, ?* U" Z
  25.     ],% K2 ?; U$ ]- t5 K
  26.     [//指定分组字段、统计字段
    ! Z! V" x& c7 x- b
  27.         '$group' => [6 u1 g8 k( L' k; |
  28.             '_id' => '$Address.Country',
    ! A7 T9 B8 U9 Q9 M% L; f2 C; S  Z3 P, j
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和" U0 t$ g% n, x1 V' r9 e9 O! Q
  30.         ]- A+ s( F: }5 N0 c0 g! L9 Y
  31.     ],
    ) ~7 m$ s' [( @0 r0 ?
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    3 n- M% t, @! E/ @" T9 M
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    7 ]- x/ X8 l# Q1 I, l
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名0 h) E! J# w5 ?) `
  35.     ['$skip' => 2],//跳过指定数量的文档0 u2 @) R; _" \; Q4 s9 ~
  36.     ['$limit' => 2],//只返回指定数量的文档
    7 y6 G, p# o5 h, B4 o3 b1 O
  37.     ['$sort' => ['totalAge' => 1]]//排序7 Z3 C: \3 S. J8 ]- q0 E* c
  38. ]);
    0 p6 B3 C' Z7 v6 b, Z6 v& [
  39. echo '<pre>';
    ) L8 o- M- f; k8 ~
  40. print_r($res);
复制代码
& a, V4 |5 `& u3 O! R  s0 `, D
三、数据修改
  1. //update()
    : N) F) m5 b5 P* r6 x
  2. //参数1:更新条件,指定更新的目标对象。; G6 t$ q8 l4 T6 B6 `0 d" Q' z
  3. //参数2:指定用于更新匹配记录的对象。( H% F4 b9 l: T' E! r# b! U; H
  4. //参数3:扩展选项组。$ W, x& l, ~* d, V* m/ z# v
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    : l& ]: p: R  b
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。" Q$ u: O6 N  {  |) e& Z: t* m) z
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    7 ~. o. F6 F1 D: U( N1 g' G6 O
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作# c& g! r: x7 Z$ g- G" G+ ^
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    9 T% G- ]) z- W. }7 S
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # K2 c& n9 T/ R& j# p$ O
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& E8 Z9 Y, o  i. A/ J
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    5 ^& I7 V* ]& B/ g- U2 t( K% M

  13.   o4 n+ b+ j6 _* @+ s7 {$ |$ F. |
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值6 a( c& x* f( _! [8 V: H: k0 C( R
  15. $mongo = new MongoClient('mongodb://localhost:27017');3 Y8 g. ~9 j$ J2 b
  16. $db = $mongo->mf;
    + C, J* f) d1 i$ |0 j6 d
  17. $collection = $db->friend;
    0 @* |% y) a& y0 }, ~. R/ x3 q/ k
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
    # x; |, F& _6 K2 f, G2 ?& D4 x
  19. echo '<pre>';
    7 i( T8 S% h( {  A9 [/ J
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    5 x: i4 [$ G0 l
  21. / e1 i8 k1 Z  t, N; V; O' y
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    2 D  O: Z0 L: V3 T
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
      u7 D% Q% C4 F% r$ w

  24. 2 H$ b6 h8 ^% J/ T" v" j
  25. //$unset:删除字段( x: E( @9 T9 ^# v* @
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    3 P& J  ], l2 v8 @2 S' M: I, a
  27. * `4 A: C4 ?& |
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    + O& X1 N) f8 m# D+ F9 e; p
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    5 T0 `5 ~! Z# S0 m1 p9 N
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。  M9 [- E! t. h( e. U& ]

  31. * z1 o% C6 s. n6 z/ g
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * E: r# B6 m3 S9 r: f7 M
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    ) f7 o( b- M& n' Q8 F

  34. ; R+ i  T6 P( P& B4 f7 J
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错! P% i' ?9 h4 F
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);  U: o$ i  ^" j% |
  37. " E9 ]: d' s9 C. v: ]
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    8 L( D; h1 \2 r$ Y
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);8 e4 |; h" s" ^

  40. , ]! q0 S3 r+ i: J' T7 \6 |
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错5 G$ W5 S1 a* A, A
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    9 M+ I( R/ q" Y& H1 c' L

  43. 0 V6 V6 t( x) Q6 L$ L, m
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    ' h- W" L8 k0 v0 r) |/ K) n
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    - w+ k: R4 T2 G
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    . h  E3 R1 f+ D
  47. 1 K$ r) Q. D9 D
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    + Z/ @0 k2 }: A& j
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);, M; D; T0 ]- h# n2 c2 q& I
  50. / F: [% O' m& S/ g
  51. //$pull:删除数组中所有指定值4 o% g. s9 [) F' \2 o- [0 Q  V' \8 ]
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    6 s: g. a0 ]3 n4 b5 f6 @$ i
  53. . ?7 c% q' E3 ?5 b
  54. //$pullAll:删除数组中多个元素的所有值
    1 h; j7 L# l3 ~; I0 Y: U* _# F
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()+ N- N% K/ W8 x0 i$ k  I' [0 I
  2. //参数1:希望保存的信息数组: k5 r" V0 Y$ R5 u
  3. //参数2:扩展选项2 W, Q- [0 Y; \* r; h1 U# _
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。% B$ l4 ?3 ]' {3 K6 f5 ?
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    0 I# H$ b9 Y  M1 t
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。! b& f1 y, \! J* e( x+ O5 u* ~8 [
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ p/ Z* D% |' H/ Y/ k- t
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    9 h/ |$ V4 o3 Q6 k7 R- r, [5 x
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    1 u2 Q2 Z) v7 K0 b
  10. //若想更新则应该在参数1中指定_id键的值。5 E: x( a, V' F8 c: O
  11. $mongo = new MongoClient('mongodb://localhost:27017');% F; L' C' b. v
  12. $db = $mongo->mf;4 _3 q, l+ o/ m1 Q
  13. $collection = $db->friend;
    5 @) k7 q5 T& M
  14. $doc = [//定义一个文档,即一个数组0 q$ c$ J0 D! v. m) M
  15.     'First Name' => 'Jet',
    , D) l1 L( f/ H
  16.     'Last Name' => 'Wu',
    9 S& @5 l( A7 I% J
  17.     'Age' => 26,
    ' ^. X3 e8 \: z5 L3 `7 t- L
  18.     'Phone' => '110',3 M8 U: d, X4 E# E" y4 @
  19.     'Address' => [9 g- I0 B  k3 ]9 e7 k
  20.         'Country' => 'China',
    " N, Y+ ]% e# N! N: A
  21.         'City' => 'Shen Zhen'
    6 t! g) ]+ n' W5 |  S7 [' y' M
  22.     ],
    * R1 }! ]/ I2 s8 a# E7 t
  23.     'E-Mail' => [
    6 S7 w% q# h. P" w" ?! y# k, ?
  24.         '123456@qq.com',
    ; }. K: n' E' E
  25.         '666666@sina.com',
    - A( c  Q: ?( |! O$ A
  26.         '8888888@qq.com',8 _: _3 {. h" @- M( O& K
  27.         '77887788@qq.com': j: X) Y4 ^7 N0 h
  28.     ]; D7 M# ?# k; S/ l
  29. ];
      X. O) S; M5 V
  30. $res = $collection->save($doc);( @0 {5 ]  [7 r/ t( `4 K5 K( T
  31. echo '<pre>';  h3 U% q; J! {3 j
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    ( i6 [6 Z7 U6 m( @
  33. 2 e: H0 `- Q6 A. l, o
复制代码
  1. //findAndModify()$ u, i7 Y/ ^! c" I# Z
  2. //参数1:指定查询条件
    % Z( d7 V3 B6 x; C8 l
  3. //参数2:指定用于更新文档的信息* u3 b2 {" j% o/ i. \5 j, N8 I
  4. //参数3:可选,指定希望返回的字段  f- O9 {) \; J. r" @
  5. //参数4:扩展选项
    6 q: I5 E7 ^6 A; F9 T" l; R1 o
  6. //  sort:以特定顺序对匹配文档进行排序0 ^# A: Q1 p# A$ _' k5 s6 H
  7. //  remove:若设置为true,第一个匹配文档将被删除
    5 a, A, C; o. L: l
  8. //  update:若设置为true,将在被选择的文档上执行更新操作+ \6 b# x2 m- b* v
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档0 V% c, I' X2 o5 Q. \  M
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    . I5 y8 Y# J. U0 R  s2 V/ [
  11. $mongo = new MongoClient('mongodb://localhost:27017');+ Q. t" y- f) e
  12. $db = $mongo->mf;  d$ U, D  g$ A/ W6 I
  13. $collection = $db->friend;
    # o  S* K6 Z( C4 ^4 u
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);, ?- I7 S/ c( B2 g
  15. echo '<pre>';4 c* @. c0 ~) \3 N' D
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    * k+ w9 M# X( v/ s) G0 |4 E5 Y: Y
  2. //参数1:查询条件
    1 p- D: _8 P; g. Q( L
  3. //参数2:扩展选项
      Z$ b0 ~+ N- X- }8 e
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    : F1 b& m1 Q3 c2 y, m2 X
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。2 R/ _4 X0 h- m# U3 S6 t. X
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作+ S; A8 a4 ^2 ~/ x9 x# n  c, ^* Y
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ( k: w7 I. b3 X4 _: i
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间2 [% m9 |& V8 ~" f0 D4 ]: `! @
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    # \. P' M1 p  ]. X( W3 x
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    & J8 p% O" w7 w; X8 E8 R3 {
  11. $db = $mongo->mf;
    / a, Z7 v: O9 N4 i0 b
  12. $collection = $db->friend;" j, v9 |2 ~; f6 C8 Q& ^7 W& u2 f
  13. $res = $collection->remove(['First Name' => 'jet']);' Y! D5 ?! w$ W1 x1 i; q
  14. echo '<pre>';0 q! g2 V6 [4 M# H' N# J% j5 L9 K
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

2 _" T4 I) `: D, B& H
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

+ b+ y0 d6 ]' D! M9 _& M$ n- |
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

$ P3 Q- a; n6 X1 {
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');0 R0 B8 m: A* ]6 {
  2. $bulk = new MongoDB\Driver\BulkWrite;
      y8 U; q) S0 M) O  }, U
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);* p3 Y) `. p+ `1 L0 }. f
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    ) R0 Y5 y) g0 C' q6 W: _
  5. ) s- p+ {! c2 W
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ' @4 u' H7 Y& d1 L9 b6 c& U; d
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    # n8 s  G  d9 {  [6 [
  8. echo '<pre>';
    ; {. S$ ?$ q* k
  9. print_r($res);
复制代码
! \# T* w$ ?, y- s) E1 N# k
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ; Z: m: Y0 L3 Y" S) b# b5 j$ V
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    ) n: P0 B6 Q( x5 c+ R8 N0 a
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    4 N, G, R4 f, D+ ~
  4. / }/ {0 u% j7 Q+ Q: z# [  {
  5. $data = [];
    ( y8 B1 u: g6 n' G$ m2 Z6 `% r8 h
  6. foreach($cursor as $doc) {
    # u7 w  \6 j/ z5 O/ y' V! O& l$ m
  7.     $data[] = $doc;
    7 Q7 b: ~7 d& j4 u6 e# G, T9 R
  8. }9 I7 M# x2 j# x, z  k9 m% [6 d
  9. echo '<pre>';. ~- _) x: w" o6 c# J
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    7 E1 P# P! c5 P9 {" L0 C' r3 l. o, R
  2. $bulk = new MongoDB\Driver\BulkWrite;
    ; S6 B4 @/ |% K  L" G7 g
  3. $bulk->update(
    2 m( Q4 i$ h0 Y/ q  o, F2 H
  4.     ['name' => 'JetWu5'],( R! B$ H4 y, P. Z' M0 X
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]2 g% W. s9 }% Q: F
  6. );
    / K" F. r/ c  w+ Z% z; I2 w- v8 q
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认! E% m2 T- n1 E( p, s
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);1 ]# X0 Y7 t0 L
  9. echo '<pre>';
    8 g6 U; I* m" t6 e& y. `
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    + {1 c4 |, r; d: `6 U: X+ @
  2. $bulk = new MongoDB\Driver\BulkWrite;! |) D# D) i9 W, v+ N, [6 H
  3. $bulk->delete(['name' => 'JetWu3']);
    % j7 w1 N: T; d8 z; r0 f6 e1 V( a& p
  4. $bulk->delete(['name' => 'JetWu4']);$ _! _  b! H7 i  ?$ f
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    $ z- i) u" D- N& C
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    " h' s) D" u6 j/ b" @
  7. echo '<pre>';
    . h& o! {% V! Q, L8 O4 y& o8 I
  8. print_r($res);
复制代码

# ?3 e6 f1 t5 Z: ]0 J! L4 y$ w6 Y4 s9 ]2 Y  n. e6 j
' G& ?- r: ]9 z% k

: ~4 ?5 R! \$ R# Q0 }3 p
0 F2 t2 t; R: f5 V! I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:48 , Processed in 0.061597 second(s), 22 queries .

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