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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13077|回复: 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()% H4 l5 h+ u3 L& s6 P7 {
  2. //参数1:一个数组或对象. Q0 s9 x. z( d; ?
  3. //参数2:扩展选项* i8 F4 @) T& J  A# _
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    0 O' |8 C, ]: H$ L/ X
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    9 j' @5 f: }9 d. n  r8 ?8 _" H6 u/ ~
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    - `3 K" D" P* W9 s
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    / l1 O) ?$ U4 _* V
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    & x; l% M6 k- E
  9. $mongo = new MongoClient('mongodb://localhost:27017');! R/ b' c- U, u2 o% `" E. g7 R+ U
  10. $db = $mongo->mf;//选择数据库# e) _/ @' J' a5 A. i
  11. $collection = $db->friend;//选择文档集合
    6 A$ s9 V1 T" @7 v
  12. $doc = [//定义一个文档,即一个数组* G. V* x5 H0 W: |5 V/ L
  13.     'First Name' => 'Jet',
    1 G! Q8 l  K! g, d
  14.     'Last Name' => 'Wu',
    ) e3 J. h2 F+ O( s' Y
  15.     'Age' => 26,1 }6 o; `4 I7 |0 }7 z4 [
  16.     'Phone' => '110',
    ' X6 n* \$ a& N* C* Z
  17.     'Address' => [4 }3 F+ I9 I+ D' H; p
  18.         'Country' => 'China',
    7 {" ^/ Z" k6 s- X
  19.         'City' => 'Shen Zhen'
    " G8 w4 C* o' o" C8 E( {& N8 [8 @
  20.     ],
    9 ?# [2 n2 N' r2 Z+ u
  21.     'E-Mail' => [2 j( Z- o" K: t  v8 L7 I
  22.         '123456@qq.com',9 p5 p0 ~5 Y( i' ~; y# K- Q
  23.         '666666@sina.com',
    / _% J9 O+ n  b  K
  24.         '8888888@qq.com',
    , E8 e% F/ f$ p! S3 v2 P
  25.         '77887788@qq.com'# [. D7 O: B: Z+ R7 V$ I: L
  26.     ]9 ^! y6 t" C6 N7 K
  27. ];
    6 n. G& Y3 \  g  ?# F8 ^6 S  i. q
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    6 P8 v% M' f9 Q2 t. Q: g& T
  29. echo '<pre>';
    : M' Y. l+ ]) Z" F# Z
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    7 B8 g* g+ h2 A; r: ]
  2. //参数1:搜索条件
    & b# \1 q3 f- f# l1 L9 a" c, Q3 S
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    3 _7 D' T6 N# h( m% q  {: q( ]
  4. $mongo = new MongoClient('mongodb://localhost:27017');  Y- ^0 P4 s2 }$ v5 }8 d8 A
  5. $db = $mongo->mf;
    , N3 @+ z) E: e8 I
  6. $collection = $db->friend;; m& ~5 |; F0 d% I! A3 P
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    1 K1 a. Z# I, Z# }3 m
  8. echo '<pre>';
    * t5 q* ]6 \" o  ~8 z
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()4 S, s7 R) M$ v2 T# k/ B
  2. //参数1:搜索条件, T0 A) d: _7 B7 a9 F
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    . n# @$ J# Y  g( B3 `) U
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    ' Y4 f! q9 w9 e( m- w- ?: |
  5. $db = $mongo->mf;
    % a' `5 d6 |- z7 Z/ Q7 h
  6. $collection = $db->friend;3 E- A# j7 d1 R% ?2 |
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素2 q$ o4 b: E0 J. B$ O
  8. echo '<pre>';
    ! Z7 X: {* {- u$ N  d+ A
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档& S) b, N& v% C! V3 A) f
  10.     print_r($doc);
    2 R1 ~# R9 g/ c3 r2 m) F; E/ Z. _/ J
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    9 o8 ~& ~& n: Y; A4 F
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    " G4 k; m' |* y) A! X, f
  3. $db = $mongo->mf;$ J# D) e( ?7 N& \( V
  4. $collection = $db->friend;; u5 e1 s- O- Q' a6 |* ^
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    6 @: P; C) p; e9 N5 d! g# j# ^
  6. echo '<pre>';
    8 z' @3 f- g% F2 p% j
  7. while($doc = $cursor->getNext()) {7 i2 |( m- F* T$ |. t
  8.     print_r($doc);- @8 F; O9 C' M) ~! K3 e
  9. }
复制代码
  //查询某个字段的所有不重复的值- F* Z) O) p. q8 R4 b" u" @: ]
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    % l0 s( A8 x1 d  b0 s
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);: [2 r( f; {6 ^$ P, H

  3. - U- u) M7 H) \
  4. //$all:匹配多个值中所有值(用于数组字段查询)- Y: H2 U0 B& n) T
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);
    * v0 e9 Y2 a2 [
  6. 1 h3 u, a0 ^% k" k6 V' P# h# {# x
  7. //$or:或查询1 Z. V' l% }. F' G) D
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);2 a. e- ~0 H3 x9 U) X- ^2 }2 u
  9. $ o* P# A* Y  X: l% Z1 V" ?
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    % q* T0 j* e" S& I0 i
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email7 @8 X' p" a. d+ |" M. x  S+ i
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    , }4 K4 p. x, T7 ~
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个
    6 y/ P" H. B$ I! l; D

  14. : {/ k6 [: M2 S
  15. //$exists:根据某个字段是否有设置值进行查询# Z& @! c% l3 z" D9 w6 ~
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档" |1 j7 \" i* s$ `% j

  17. 0 x5 r! w" c0 i# y% `
  18. //正则表达式查询
    0 [0 Q+ J" S/ I+ k( y
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序% H$ j* F! g: X9 Q$ y: J& H; f$ G( T
  2. $cursor->sort(['Age' => 1]);
      j& |# O8 Y3 r" p

  3. . |0 d8 z8 ?0 F" P. u0 Q
  4. //忽略前n个匹配的文档4 X: y2 |( c& ~2 S1 l& S/ @+ [
  5. $cursor->skip(1);: D# y/ I7 v9 `: o; t
  6. ( Z2 l1 l1 q8 [  W7 p) t6 i8 R7 x
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)6 D' F! e2 U/ E' M
  8. $cursor->limit(1);
    : c- b# |( b2 B/ O3 S0 ?, I
  9. 5 ~$ k2 M: |( H% i
  10. //匹配文档的总数" N+ V+ m! \2 Y: U- C
  11. $cursor->count();- H# \' {' t: Z4 ~
  12. 4 q. K. M/ W/ u) \: G: h
  13. //指定查询索引/ m7 k3 P! q! a; c+ b8 H
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    7 E: _* ]: o! V, z) |7 e
  2. $mongo = new MongoClient('mongodb://localhost:27017');3 T% Y7 g& P. j9 e5 X: b
  3. $db = $mongo->mf;/ m: r. N5 \* O/ Z/ F& X
  4. $collection = $db->friend;
    2 a: ?; m- V! }0 Y
  5. $res = $collection->aggregate([
    / n2 u+ X' E9 Q% O: n+ z! k' ?
  6.     '$group' => [- `% a6 H) b' Q! n7 ?
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    ( \9 c! @: K- c$ j% [: L& E
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    * O6 \/ n" i5 k/ ^4 l2 B
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值9 v! J4 b& Z: B$ x5 ]! a
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值$ q+ o" o/ i" H" o) }  i
  11.     ]( ?. O/ m/ n" A) e7 P
  12. ]);
    . H' d, m5 r/ [; R" e. `
  13. echo '<pre>';6 [2 F; ?. h; C( C( X! E! D8 T
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果; \9 k2 @* V- w

  15. " L: f2 b7 i2 s: C# m" i

  16. ; y4 e7 T6 _! G- ^
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    . F) C3 S6 ~1 F) E* V  p( a
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。% W( d! P7 u& ]
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    2 D" o* M+ o0 P3 A/ K
  20. $db = $mongo->mf;
    & d; u! [) Z' s) M* K0 V% J. g
  21. $collection = $db->friend;  e& S: l" \1 c0 `9 M% N  n
  22. $res = $collection->aggregate([' s% |) r' u4 V# }
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    $ d+ }- q% @3 y
  24.         '$match' => ['Age' => ['$gt' => 30]]
    5 D8 a1 r7 M3 }* T8 q+ Q( j
  25.     ]," _& ]" r/ m7 Q, J0 t' X
  26.     [//指定分组字段、统计字段
    + _, A0 \, o6 v6 U! V" [8 \
  27.         '$group' => [
    1 x& F4 I3 S0 R2 E
  28.             '_id' => '$Address.Country'," q# u  a2 f3 t9 j9 |/ c! P
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    3 H$ U( V% W, [9 k7 L
  30.         ]
    3 j! F; B3 N/ q! d
  31.     ],
    ! |1 S0 M/ v! U* f5 U) [
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    6 i4 c& o6 Q9 p% e# a6 E+ z' v3 v
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。% r, ?5 A2 g! Y8 Q# w8 Q& K  U
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名# @1 y# d' Q% e9 k3 z, T
  35.     ['$skip' => 2],//跳过指定数量的文档! m: X% j" O- r
  36.     ['$limit' => 2],//只返回指定数量的文档
    / a6 m8 L9 p; g2 O! M
  37.     ['$sort' => ['totalAge' => 1]]//排序
    : R: j8 u7 H$ ^7 T' f% h
  38. ]);
    2 f4 Z* o1 `& O7 e( w( e
  39. echo '<pre>';
    * p, N9 L8 H" g! [9 g) N6 Q5 [
  40. print_r($res);
复制代码
# D5 H# D  b+ Q" r& d
三、数据修改
  1. //update()5 h) E/ N; t4 G0 M/ g% C; |
  2. //参数1:更新条件,指定更新的目标对象。
    $ W5 k' V# w: Y! R9 o
  3. //参数2:指定用于更新匹配记录的对象。% k; z  F) H3 L4 p( \/ h# G3 Y( p# e! _
  4. //参数3:扩展选项组。3 O3 y! R# {& }7 n6 P
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    . H1 U/ }. @. D) a; M* E( C
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    * g' \" d5 O% g: R
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。1 `; `5 c4 r7 {
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ' K8 f/ ^$ n0 n* Q7 h& e
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ) o5 Z5 j) [/ l* B* V9 _7 W8 O
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    7 h  e0 \* {! d4 Y' x
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    : J0 ]/ \$ x2 z7 r2 u; S
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    ! g2 q. ]% ?  x  l2 A) J4 Z8 p
  13. $ y  U* q. H- ?- Q; ~0 j0 R
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    1 [* H' O0 r3 y% t
  15. $mongo = new MongoClient('mongodb://localhost:27017');7 a, t8 Z" M- u5 z
  16. $db = $mongo->mf;
    0 \( ?: u" ~) O8 v8 {- D2 {
  17. $collection = $db->friend;
    1 H! z! F1 ?& O9 h
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);& @! j) K% Z6 A& |/ c
  19. echo '<pre>';
    # p: w( s7 r4 h( |3 R
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量6 [0 C- g9 X9 b+ }2 ~2 Z

  21. 0 w! u/ e6 v! B( |! [+ X" p
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    # W) W9 C2 H) J
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    - S/ P7 @1 K; G* T

  24. $ m# ~1 q' A! G
  25. //$unset:删除字段# Z1 F6 A! S' f; A
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    : ^& l; W' }" C" F
  27. 0 k- e/ K6 c7 S( @
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    3 j4 y2 d. p+ k) Y; G4 F
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    , ^+ K7 M# y. \
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    ' i( g: k, X4 m+ Q# `, a# W
  31. # w- x6 J/ X6 u& s
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    ; M1 g# a$ B) e5 @, o. R5 a- G
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);4 g$ w$ r7 s' K: a' {" `! D1 y

  34. % t% f/ c8 d. k6 ^' w
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    4 U2 d' t( r8 P+ b& M7 A
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);! y8 J1 C' z  [  P

  37. 9 W, k! o' X) R: ?* F6 f( w
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错, L$ C' X2 Z; v; y4 g; p
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    $ k" }2 M0 }% t

  40. 9 ?/ W, \2 |& f, x8 E
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    ( _" d! K6 o' `/ U- H
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);9 D& }; D) N0 Z+ d

  43. 6 q% H5 e0 |" W$ j
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 w4 p( D, F2 w4 q7 h/ n
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    5 E4 h4 W7 G: m2 U
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);, p3 l6 j" Y0 Z0 j! L8 b
  47. + t/ N% a: {8 e  z4 D  z5 o8 I
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)1 L: [6 R1 K5 ]
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);' K; N. O$ O: {& A; h

  50. 0 m0 y+ c" x5 z
  51. //$pull:删除数组中所有指定值1 w, R5 X2 {( h: |* a; c& |
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);/ V; K& A4 s6 F' |5 h# t

  53. 5 ^# ?8 n  x+ M3 \
  54. //$pullAll:删除数组中多个元素的所有值
    / U! N0 N. W# T
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    2 D$ `9 g; @6 J$ `4 ]! }2 C2 J
  2. //参数1:希望保存的信息数组$ C! P% M8 {+ N  ]
  3. //参数2:扩展选项$ c2 O( I. _( n1 l- ^4 q
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。/ v7 D0 ]7 w1 [# d6 ]/ t, J
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    4 I5 c) a) T; ?# d. j6 G
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ( d  A  H) u. N9 Y: A- [5 ^$ _4 X
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 x" c0 d8 U5 I# o- s  `+ }3 t
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 K6 A9 j8 C# C. `! s2 x. a
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。6 j9 X/ w$ S/ Z5 V' D* U
  10. //若想更新则应该在参数1中指定_id键的值。
    2 P/ F8 e# I% B# V! g5 J# X3 h
  11. $mongo = new MongoClient('mongodb://localhost:27017');- T% ?# `& h/ N. T' h! Z
  12. $db = $mongo->mf;" Q+ g" w  H- b3 j. U
  13. $collection = $db->friend;
    9 q& X/ q' m/ f
  14. $doc = [//定义一个文档,即一个数组
    2 g5 z6 A& e  _+ I) V! W' Y
  15.     'First Name' => 'Jet',2 ^* J# B1 C7 K4 u, g; h. C3 [
  16.     'Last Name' => 'Wu',
    - z( I" Y' J2 n; ]! O' A
  17.     'Age' => 26,
    + X! Y7 \4 S' p3 P+ B8 n
  18.     'Phone' => '110',
    ( D" l4 D: R9 B
  19.     'Address' => [
    3 k+ K$ |% a; s  N
  20.         'Country' => 'China',
    2 a, x5 Y8 a# {9 O
  21.         'City' => 'Shen Zhen'- G9 K0 D8 J' c' V- B6 s
  22.     ],
    ' ], J  M9 Q- b; @" e
  23.     'E-Mail' => [
    8 Z. w% b4 |/ T
  24.         '123456@qq.com',+ d: v$ Z  d' D
  25.         '666666@sina.com',
    5 @- N  g2 e8 ^2 S2 O# m" f
  26.         '8888888@qq.com',
    : q$ @& ?! |2 Z# a
  27.         '77887788@qq.com'2 m# c% f1 ~$ I
  28.     ]
    4 ~8 i* o, Z8 m; ]% r
  29. ];
    , h. x/ K2 Q$ t5 i2 o
  30. $res = $collection->save($doc);/ \. j1 [8 n% E1 Z$ P0 e$ G* `
  31. echo '<pre>';
    ! O* z, U7 N4 C: P9 e2 @) b
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入; n& ?2 P0 {" x9 |
  33. ! E+ `5 s# h7 T. H
复制代码
  1. //findAndModify()/ q/ l2 p! R2 G: ~6 S
  2. //参数1:指定查询条件
    7 Z9 I# y  d% l8 U6 f5 \
  3. //参数2:指定用于更新文档的信息0 t6 p1 G0 V, S4 b
  4. //参数3:可选,指定希望返回的字段
    + \* f4 S# z5 s- F* m
  5. //参数4:扩展选项6 c& J0 q7 A0 X+ y3 k
  6. //  sort:以特定顺序对匹配文档进行排序# p( H/ S! |$ J/ E" C
  7. //  remove:若设置为true,第一个匹配文档将被删除, `" m5 M3 E: \# e1 F$ i
  8. //  update:若设置为true,将在被选择的文档上执行更新操作, P2 y9 a, r/ Z+ ~' E2 x7 E
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    . q1 O& [4 `* b# N3 f
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档- [2 R9 w9 I7 v
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    1 X. F: h$ k4 w: C# G4 M& I' I
  12. $db = $mongo->mf;
    * [* B9 {5 z" ^- E2 }& o  n
  13. $collection = $db->friend;: i( g8 [8 O- I8 B9 i6 F' K# Z+ L
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    % l/ ]4 c) R  d5 i8 h5 e
  15. echo '<pre>';
    ) b+ N8 p( w7 [) |" `
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()9 q& q/ H  V) s; e$ s; {1 r6 a: F
  2. //参数1:查询条件
    ) N6 t7 T' z" Y& v4 x* h# `8 y
  3. //参数2:扩展选项5 g8 p0 U$ C$ f) F9 ]
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除2 g6 R; |9 V  }3 B
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    # G% T2 }9 n7 |6 z% j- t" K+ y
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ) j4 l, |( M) y, N: |+ b, ?/ N. x& w
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。) j9 r% d5 L4 l0 t3 k% N" U/ I
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    + j: E) V5 N. H6 p$ {* E
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    8 ]8 K6 l: o& G. |7 Y6 E. A
  10. $mongo = new MongoClient('mongodb://localhost:27017');' y6 J- |( l( J# ?: l& _
  11. $db = $mongo->mf;. z3 p+ X1 t7 a) Q, T$ s
  12. $collection = $db->friend;* ?, Q# Q- b& ?" {3 c6 Z
  13. $res = $collection->remove(['First Name' => 'jet']);
    $ d6 r' [7 b3 L" r2 @$ {# B+ d* y9 {
  14. echo '<pre>';
    7 L7 V0 G* N- ^+ x+ A  |
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

& g# \9 s5 s; F5 h  O" B
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

% l7 X* s! h/ w0 K4 Y
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

% M1 c. ]$ z4 O. f) R
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');# @8 I( B2 }! `% `
  2. $bulk = new MongoDB\Driver\BulkWrite;( I" k9 b8 Y, a0 [
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    / X3 y% t! V, ^7 m$ B. H1 U
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    ' ]+ j  [" o% I7 O1 a3 ^+ K8 |& {
  5. " h3 {! S; j% F3 a9 o
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ' ?& ^* t0 p) g! Q+ `9 c
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);/ e  ^# u5 J6 G2 C# [0 M4 K
  8. echo '<pre>';3 B, o; `8 C' M  w0 N& {8 o
  9. print_r($res);
复制代码

8 [: c! t# p" j6 l
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');5 W/ @( J# v+ A8 s7 E
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    6 T# w/ h- J: y6 }% w, }
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    - o0 t3 C3 L5 S" Z7 t

  4. " Q  D8 E- [  N7 @
  5. $data = [];
    7 y3 K, |/ j  @5 J3 t" C: j8 c. I
  6. foreach($cursor as $doc) {- t" I( E5 ]( q5 w! F( \7 J  c$ l" p7 Y
  7.     $data[] = $doc;
    4 ^1 _& g  H9 _9 a# ]) X8 O: f
  8. }% U0 Y# P$ K" d
  9. echo '<pre>';
    7 L  R4 N! k1 p: X
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    # Y; [: ]3 U4 Q9 W& w  s6 ]( u
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 ^% \4 v7 m2 c; v$ J1 c  _5 [1 D9 [6 @
  3. $bulk->update(
    8 e  w9 V+ H* f8 ~1 {; T+ \& ^! M5 y
  4.     ['name' => 'JetWu5'],( P- \+ y( E; \' ]+ A2 p
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]$ _2 S6 v4 ^) a: d, s
  6. );
    8 R' |) w8 ]! U/ k8 X, d
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    1 G* k3 T) M) X5 Q
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    * B; w; Y/ B2 ~% ^' C
  9. echo '<pre>';# g% |9 q& }4 q! D
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    9 J0 h1 x4 M, U3 S
  2. $bulk = new MongoDB\Driver\BulkWrite;2 r: K$ J5 l$ M1 Y1 p
  3. $bulk->delete(['name' => 'JetWu3']);
    & O& k7 M' \, f
  4. $bulk->delete(['name' => 'JetWu4']);
    ( }1 x" n  @2 e: m2 }, n* e
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    % w# q! J  y. W8 h# u
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ' T5 O4 v6 m3 B- }7 Z
  7. echo '<pre>';
    2 h& D0 b+ l$ u0 C# O
  8. print_r($res);
复制代码
/ L( _# s  |7 c$ j& ~

8 i* F/ d" P9 `* G3 @0 B1 {- F# Q6 \( l6 i
. B. Y- n+ k7 Z) q' q/ [
' c" ~9 ^0 ?! Q) w: K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 04:15 , Processed in 0.091272 second(s), 19 queries .

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