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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13070|回复: 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()
    ; t2 m( M. K3 c4 r$ |9 C
  2. //参数1:一个数组或对象
    * H: Z- @4 V, O' a  z
  3. //参数2:扩展选项$ O0 O+ ]2 C& t
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    6 a; j+ r% s" S3 n" i  H  B; l
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    ; g, o+ G0 @8 i; G- p0 j
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认8 S, z( F( C/ {- N7 Q% W* c
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间, E! O! h" n; t2 Z% X
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)7 a. S3 G4 S1 {1 \' K4 C6 `+ W
  9. $mongo = new MongoClient('mongodb://localhost:27017');5 S; R$ a+ d  M! w# ]
  10. $db = $mongo->mf;//选择数据库& _7 {) y2 X( o9 k4 \5 P/ U
  11. $collection = $db->friend;//选择文档集合
    : c/ ^/ [2 `$ w9 J+ X, S
  12. $doc = [//定义一个文档,即一个数组* a; p' b, B3 a9 L
  13.     'First Name' => 'Jet',$ f9 [; d7 K! H- v) W  d
  14.     'Last Name' => 'Wu',' b% t$ Z7 E( }$ W
  15.     'Age' => 26,  J# D3 o* ^5 L8 ]8 z
  16.     'Phone' => '110',
    $ u3 A5 L" f+ S+ E1 S6 [' H
  17.     'Address' => [( M% [; e5 @8 }" `1 Q+ s) x, P
  18.         'Country' => 'China',( D* X6 s. ^6 t! x
  19.         'City' => 'Shen Zhen'% l: c$ [$ L; ?$ d
  20.     ]," ]- \( [8 k* R, K; `7 F1 A
  21.     'E-Mail' => [4 u0 e5 a% E8 V2 T/ v/ y8 t7 R
  22.         '123456@qq.com',
    & c( K: A! `& u& n" n. l
  23.         '666666@sina.com',
    ' F" b* m  E% p3 B, n) U
  24.         '8888888@qq.com',
    / n9 }, y  Q2 ~6 E, N
  25.         '77887788@qq.com'
    4 h, X2 g% [2 `% W; R  e& r
  26.     ]  {* ~; ]! x" @! x
  27. ];
    + u: u7 g5 Z  A/ I4 _6 S
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    , o. i3 @% |6 c; H6 H/ c
  29. echo '<pre>';
    " w  K4 i2 ]5 f+ N5 J
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()- M+ F4 D6 ?; B& O1 E
  2. //参数1:搜索条件, Z& ^: G6 X0 m1 C  Z3 E* O
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段' R6 [6 p1 C  r1 i( Z5 x- X; [$ A! Y
  4. $mongo = new MongoClient('mongodb://localhost:27017');/ [# f% e! c: o2 N
  5. $db = $mongo->mf;
    9 {" H8 f6 K: S! \# n" ~
  6. $collection = $db->friend;
    7 w1 Y8 s  I( @+ d5 R" L$ s
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    . ~9 M" G. r) B9 k0 y
  8. echo '<pre>';: h1 O- h- ]% w8 \- i# Z% X
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()1 ~5 @6 q* x( X8 q
  2. //参数1:搜索条件
    ! s7 L7 k' l& I; P' ?# @
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    8 q& b* ]+ Z" p+ ^+ ]8 q
  4. $mongo = new MongoClient('mongodb://localhost:27017');" K; h9 R% z- w1 \/ y0 B
  5. $db = $mongo->mf;
    3 z* m0 p/ S$ x: q
  6. $collection = $db->friend;
    " Z" V( w' o1 o. y, p/ C, {# \# ^
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素- `. l" J5 {# `- y; g1 S4 K
  8. echo '<pre>';
    8 X3 A. ~1 Z9 Z( X. h
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    3 D) a$ h# l: T  B6 f
  10.     print_r($doc);* S+ U$ U( ?3 |
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    5 T- S6 N# P3 n, p3 E' T
  2. $mongo = new MongoClient('mongodb://localhost:27017');& e2 t& F! ~  `* Y; o3 m
  3. $db = $mongo->mf;
    7 i# I. T- j9 Y, o" X
  4. $collection = $db->friend;
    $ W, g) H6 [9 r) d) f8 W
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    # x- U4 G6 R9 v0 }
  6. echo '<pre>';( }3 ?: D6 B- u
  7. while($doc = $cursor->getNext()) {  Z% b9 O* `8 I, ^" X  R$ \
  8.     print_r($doc);, l! G. {: q* O+ U3 L2 `3 ?
  9. }
复制代码
  //查询某个字段的所有不重复的值* t0 H% q# N% S& l! x4 R1 P- l1 Y
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个& |( s- J% E" N5 r
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    8 a! W) }5 c/ u- @2 v
  3. ; A* K: i" |/ Y% P! Q# ~# F' V3 q  C
  4. //$all:匹配多个值中所有值(用于数组字段查询)+ J8 t% W8 b/ \& W
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);1 P7 ^7 L! J, J0 z0 p1 f

  6. 3 D# ]' g3 J& E0 K  x$ x. k
  7. //$or:或查询
    ; K& c3 x. t7 |: D) \9 ]; O
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    $ T  U3 ^8 [/ k+ i4 ]

  9. - A) @) ]$ t3 Y( P7 X% O3 t- @
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中& f! Q( R1 A$ d; M& X7 p
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email) J% \; p+ r2 g& v8 o
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    # f2 F! n# n4 g
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个6 ~" T4 a6 X  V

  14. # R  j/ \& p* Q. f
  15. //$exists:根据某个字段是否有设置值进行查询
    2 q" `5 X: G1 T: t
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档' D& @, l2 Q1 V* P
  17. % ?: N7 c7 J+ k( i
  18. //正则表达式查询
    + H7 h5 K+ V& ^. i. \
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序  n2 k. T9 u5 e; }0 M$ o
  2. $cursor->sort(['Age' => 1]);
    2 v4 @" j! c# _# R& n
  3. . k: ~7 I( l  p, U9 t, @' n, z6 g
  4. //忽略前n个匹配的文档4 X' B% N; E% j  G2 ]/ y
  5. $cursor->skip(1);+ u% j( W9 \* G; y6 w' B
  6. 1 j; x+ A4 ~: G9 X8 S3 c
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)( `* M9 N$ u7 _) q( e# n
  8. $cursor->limit(1);# Y' ]- T! [3 x% }! n4 H1 i
  9. 0 C5 G+ R4 t( ?" o* c  F! B
  10. //匹配文档的总数  I- Z; @" K- ~
  11. $cursor->count();% E. H) [& q6 X+ r

  12. 0 {: K; ]3 n4 m0 [0 A) Z1 p
  13. //指定查询索引. q& `: z" q9 x3 d- _0 v5 S
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计& ?  z) O4 d; e. Z. t) v
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ) Z# s; p2 x3 @
  3. $db = $mongo->mf;5 I, C8 ?& ~; z" Q1 ]1 R4 }
  4. $collection = $db->friend;1 r  B; v5 ?' X; L& N0 {2 k/ m
  5. $res = $collection->aggregate([
    3 l" F' R  }- t0 a& j, @/ b) b/ T0 f% h
  6.     '$group' => [3 {. g' D) E8 T1 b" i
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    . d5 B* u7 I; J7 m
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    : n7 M9 T( a& I* Q  Y* ~
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ' {% \0 I" `& e9 S8 I
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值/ b  j# {* c% ?+ i. M# `5 T
  11.     ]
    - ]' B! k* h% {/ ^9 A6 F: \1 B( p; @
  12. ]);
    7 W5 k4 e$ N  Y2 ~
  13. echo '<pre>';0 _9 c4 ?8 g) J' G' U9 S* o
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果4 K7 l/ t/ l, O" M
  15. : d0 T2 o9 K4 M/ Z5 ?/ ^1 T- F
  16. $ F6 }5 L# ]2 f. i' F* M
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, Y# b# I/ W* {' V; Q. C' r* [
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。, t6 b$ {6 k, L4 s1 V8 i# o
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    * I; q" H# I9 A, k  B3 c) c
  20. $db = $mongo->mf;1 K# S: B  k1 i! f- N
  21. $collection = $db->friend;
    " G0 h2 K' w0 @7 j+ ?
  22. $res = $collection->aggregate([+ C( \6 K0 P: W  c- f5 [
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    9 [# K  q. Z" l# t4 Z
  24.         '$match' => ['Age' => ['$gt' => 30]]
    8 Y* R, g3 k" z- G
  25.     ],
    . }2 E$ W$ X5 ]5 }! ?! _
  26.     [//指定分组字段、统计字段& P, Z2 W% w5 o% c( N4 @
  27.         '$group' => [- a% e/ _% C0 N9 H: o0 f
  28.             '_id' => '$Address.Country',
    5 U" p5 r9 y+ E+ }
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    2 F% `. {  A' ?4 R; j' `
  30.         ]
    " R+ @" N. p2 c! W0 N
  31.     ],0 a, X% ^" Q$ a# R: j2 P9 ]
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档) [8 [) {* N8 P+ O; |
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    3 `- Z6 ]9 t- V8 f7 p" i
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名( c5 F* B; Y; c. |: R
  35.     ['$skip' => 2],//跳过指定数量的文档
    ! Z, f+ M2 K$ Y% ^; J; }7 X
  36.     ['$limit' => 2],//只返回指定数量的文档
    $ W+ \$ i2 z7 M+ b$ S4 w- c
  37.     ['$sort' => ['totalAge' => 1]]//排序
    5 A2 R! C" d( e: U( i
  38. ]);0 t6 k2 c$ C* Z, P4 u. f4 A
  39. echo '<pre>';
    ' q( f' X- j' ]# |7 D
  40. print_r($res);
复制代码

. d; ]  ^# p" W
三、数据修改
  1. //update()
    / ~/ `" C* x& y
  2. //参数1:更新条件,指定更新的目标对象。/ [: H. G; d- t: X9 j- ]
  3. //参数2:指定用于更新匹配记录的对象。
    : d" k) w/ a- a+ f0 \
  4. //参数3:扩展选项组。; H, v8 q+ A! ]! a( s' t
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。8 ^# |' N$ c' F+ A2 {$ X4 b2 x
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    - \& p  @& @8 B5 K! O& B
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& }1 P2 Y. L! `# s, t! A
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    # _* e1 H" i& J& j* L5 ^# t
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% b$ ^$ ^; e6 X' a
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间6 ]& I, @; \* y5 i
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ' h3 O/ j6 j; A1 |
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    ! x: `' V) H) y/ Q% A
  13. 3 F) x8 |1 h! @6 k4 W
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    / ^: u4 S  ^1 T% u  S4 {
  15. $mongo = new MongoClient('mongodb://localhost:27017');5 A# q5 H& ?! I6 J1 D8 Z( o& C
  16. $db = $mongo->mf;, j# k6 X: s' l) b
  17. $collection = $db->friend;
    & ^' n3 m. C* u- _9 X+ T+ v4 Z8 b6 C
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);: \7 s) }6 z( |' j- _+ G( s' |  l
  19. echo '<pre>';
    , G2 G9 W, h; H; q% \* L5 c
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    9 v  P4 t: i+ ~; J" m

  21. , o0 z  x9 L9 C) X$ f. T% l: R0 e
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值0 J) m/ e1 W% h- \# n+ Y  B) ?
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);+ U6 f1 }) {8 q5 H2 Q+ H4 I

  24. 1 V: g# F4 `7 z  I; T6 @
  25. //$unset:删除字段1 H1 e2 Y! |' F: q
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);& \4 C0 A7 Y% q

  27. * w9 W! N" _! Z- f% k
  28. //$rename:重命名字段,若字段不存在则不进行任何操作3 o% {' S! d% s0 x( O. R
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);6 i& x; r! g- C
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。1 Q6 l' P8 y' B% Q6 n2 S5 \! L
  31. 1 x- P( E9 Z' K: ^+ K5 i) B' T
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的" w/ X6 c3 t9 I" d. g
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    1 G5 m5 R" O0 l5 N( x

  34. # Q& }! y9 W$ m$ K' U: u
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    % _+ H6 J4 F: [# Q6 `, w9 T
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    % ~( y0 ~! V; C" c2 Z4 M
  37. 6 c3 u3 j/ }% w
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# q" n! a7 K+ D1 q9 D* j5 a& Y
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);: E. @/ e" k* i+ |+ l5 l* C3 V! k

  40. 8 N, ~# W1 T) m; ]4 }
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错: a3 j3 w  h6 s
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);( w" b! @8 E9 ?0 z3 K
  43. " o0 ?+ [: q2 x" s0 E- C5 s
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)/ _& U4 g4 k) j  F' D
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    6 m' J/ A; J5 U1 u* H- E
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);% t6 |. _, m$ y

  47. ; Q9 D  @! Z2 l: N; O% m
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素). ?# c5 a5 M) h* {  w( a
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    4 j( @1 A; j; }
  50. ' R4 d) ]* D0 ]# b+ K9 s/ T
  51. //$pull:删除数组中所有指定值$ `1 N# W- {2 M& c" s2 P8 I
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    5 w  i1 P9 R; R- P# M- ^

  53. ! p! O' S8 ?% }
  54. //$pullAll:删除数组中多个元素的所有值. }- l1 o. y: Y! i( h( u
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    / h0 M3 \& L, p. s/ G
  2. //参数1:希望保存的信息数组
    ! N2 @: ?/ \+ I" q- d0 L. w7 q
  3. //参数2:扩展选项8 }4 t# }: H4 [6 q# o5 Z6 ~2 G/ |
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。5 u5 j+ a2 U0 `- @
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作! c& H- [' m/ n
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    9 R' f! U  l5 M/ m  m4 B! L
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    - Y" h4 S% M/ m: g4 K7 b, l/ h. _
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    % S0 ?; n3 Y- o! `. C) t
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    2 T+ J* Q: E- T$ d
  10. //若想更新则应该在参数1中指定_id键的值。5 e$ H0 H' I9 m4 g
  11. $mongo = new MongoClient('mongodb://localhost:27017');4 ], j: p9 |( G% t3 H; S5 g
  12. $db = $mongo->mf;
    $ {' y& g; P# g: x
  13. $collection = $db->friend;
    1 P* o5 U7 g: Q) ]0 M
  14. $doc = [//定义一个文档,即一个数组) G4 M1 M( M' m/ j
  15.     'First Name' => 'Jet',. C7 w& k; A, H: D& E  a
  16.     'Last Name' => 'Wu',5 z9 x$ |. E% O# y1 T3 ]3 A& d" r
  17.     'Age' => 26,
    ' r3 f2 ]' b1 s- {9 z7 Z. X1 k9 F
  18.     'Phone' => '110',
    # j8 C) M" O# T4 {
  19.     'Address' => [( u6 p: n; H* D- G* ^6 Y9 E& `
  20.         'Country' => 'China',
    ) s5 _4 c# X2 s! T" t
  21.         'City' => 'Shen Zhen'  ]# W+ m( D/ j+ J4 `0 o  i
  22.     ],5 Q2 }: e3 X) d  g- o6 m. F7 E
  23.     'E-Mail' => [
    2 a$ z7 u! X" ]: u3 {
  24.         '123456@qq.com',
    8 \. Q) I( S/ J- {& l4 L
  25.         '666666@sina.com',
    + t5 U: T; N3 a3 a  W8 M
  26.         '8888888@qq.com',
      ~" d0 P, `+ E& y+ W; k
  27.         '77887788@qq.com'
    - ^4 `& ]4 r+ m$ G' [
  28.     ]
    # ^% h* V  _& C% w) I1 o
  29. ];! r" x3 p( g4 {! Q
  30. $res = $collection->save($doc);
    8 J+ D/ I1 f% u! s  }6 j
  31. echo '<pre>';) R: [+ T9 Q- O5 o- r( P2 W, U
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入  E" W0 q% I8 ], s1 {

  33. ) n- P7 ~" D) _% u$ d3 u
复制代码
  1. //findAndModify(): h: ?" S) p# L* d4 R+ P& @8 u
  2. //参数1:指定查询条件
    3 f( w' t. ?0 A: A/ o0 p! N
  3. //参数2:指定用于更新文档的信息' V: O5 S: M8 o% U$ o
  4. //参数3:可选,指定希望返回的字段" g& J7 _: d' C. q& I* ]7 O$ W
  5. //参数4:扩展选项
    # P' E$ z% D6 l; L$ U1 d
  6. //  sort:以特定顺序对匹配文档进行排序; o1 r# k% f$ p) k3 |. I
  7. //  remove:若设置为true,第一个匹配文档将被删除
    3 z  m, Z! w, y, @
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    2 d$ s5 @! C* x+ R7 t+ r% R
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    ! M- p; @* l; C+ x5 |9 @
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    . W' D7 z6 z1 j. `
  11. $mongo = new MongoClient('mongodb://localhost:27017');: C4 R* I! m+ e2 y
  12. $db = $mongo->mf;5 q$ t) ^, G) p' }. W
  13. $collection = $db->friend;
    3 G* K9 N1 _; o2 j
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);! J# J2 f9 c/ s) e* H  I+ a+ j
  15. echo '<pre>';
    9 ?( k, O) o- B, X/ r
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()/ Y$ A: ]* b# p( _! `8 _; S
  2. //参数1:查询条件
    1 h  E9 N3 ]6 P3 b+ X4 v' w
  3. //参数2:扩展选项
      r( i; V) _+ k1 A% W4 t& f
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除' N3 t! Y( a7 n
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。+ E6 ]) F6 ~6 u/ {$ `5 d$ s1 s9 J
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    8 z, [  w5 d' A4 w$ ~9 F6 h& a
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。+ a4 {* G& L' f  I6 e# p
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    2 {8 ?: h8 ~8 X+ `0 K+ o0 ]
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)- c( F! q' G3 i- k' @' W$ e; n
  10. $mongo = new MongoClient('mongodb://localhost:27017');/ c& n& R# g; K, P% K- L
  11. $db = $mongo->mf;
    ; o+ \5 H8 Z' j9 D2 E/ j4 l& e
  12. $collection = $db->friend;
    ; L& R1 t- w) Y, I
  13. $res = $collection->remove(['First Name' => 'jet']);
    ! b. G+ g( i2 C! A& e
  14. echo '<pre>';1 W& v" v0 w' W1 p2 I  i# w
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

( ?, E: ^1 v- ?$ K* f
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

! t/ ]* a& P' V% l( I
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

2 G8 B$ f4 G+ H6 K9 c: \1 f
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    8 `5 |  Z- _3 h& B
  2. $bulk = new MongoDB\Driver\BulkWrite;8 u/ l/ X( O# a) M+ B% I- L2 ?
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);+ }9 `, r# c2 B' E/ `- W
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    7 m4 O4 Q6 n; g) p7 @
  5.   f& h5 f' x: l# _
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    - M. d" ?. V; |  {% H
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);# v8 O  |+ c* d! [& g$ u
  8. echo '<pre>';
    - {( a! u& e  N) ~
  9. print_r($res);
复制代码

3 @; f7 ]# e% E0 v1 Z) F. u
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    / s; r/ X+ R1 f5 D
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);; S& H6 t( d8 {# i  ?8 @7 @
  3. $cursor = $manager->executeQuery('wjt.friend', $query);9 B) ?& V' S/ f

  4. . F# ]6 M( e( H% g
  5. $data = [];
    + l2 E5 D0 r+ X: E
  6. foreach($cursor as $doc) {
    - L0 R7 z# W2 b8 R  {9 H, X
  7.     $data[] = $doc;
    . c$ g  W* W. P6 `
  8. }
    ' K; W' {" Z. n$ C" l! K* v
  9. echo '<pre>';" {- v' x0 J6 d" c% N) |
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ( q% P/ n' }$ Q" h0 ?
  2. $bulk = new MongoDB\Driver\BulkWrite;2 W4 a9 q/ f& T/ L; j# k5 Y
  3. $bulk->update(
    % i& l7 e* _' ~: ^0 H) J! Y# Q! R
  4.     ['name' => 'JetWu5'],
    3 P6 E" I* L# _$ F
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]' o$ B  D0 F7 ~$ F  h8 K
  6. );
    " O4 c' I% F* v0 A, n/ u1 x+ p- B
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认' r( R+ N& R& a: Z( H6 a$ x) f1 T, ^
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);2 v" X( ~7 J. \: C3 E, M5 v# p, _
  9. echo '<pre>';0 a) O& X  Q$ \
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    # p" P; S, k% k# n+ i  Q7 }( B: G
  2. $bulk = new MongoDB\Driver\BulkWrite;; g0 ~' N) R6 H% ^- e: I
  3. $bulk->delete(['name' => 'JetWu3']);% j* i) {# a  E! C: Y
  4. $bulk->delete(['name' => 'JetWu4']);
    ; C* l  {/ A! g
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认$ T& ^$ K& ~7 }. C1 |
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% x# J! [4 Z8 @
  7. echo '<pre>';
    ! b6 w  E( F9 y& t' {  m
  8. print_r($res);
复制代码
% ?" F7 G0 l" v; P8 e, X; ~
6 p+ A( c8 r( W1 e* o1 c+ H# o

4 l5 W/ i/ Z' ]$ K$ N

3 l6 f; W) E9 L' N7 S& `* I5 b% k+ a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:13 , Processed in 0.056942 second(s), 20 queries .

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