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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12868|回复: 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()# N5 w/ @! a3 V1 f6 \) N( l
  2. //参数1:一个数组或对象$ s4 T0 ]& y+ v  H. W
  3. //参数2:扩展选项
    4 O5 w. K! _. _4 W7 B- L
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘! ?% D% h- y+ E  B( w, G
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    % w& F: m! _$ ^  _4 ]
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    - m6 s/ X  p3 y, q& y$ U, n- k. a
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
      t' ?; e- D8 I% t' y
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    2 P! E3 C6 w' i. K
  9. $mongo = new MongoClient('mongodb://localhost:27017');; I9 Y, D# K: m% P& G" M+ Q7 ~
  10. $db = $mongo->mf;//选择数据库
    . C  n- V' c( }8 ?5 r! L- m: H) s
  11. $collection = $db->friend;//选择文档集合- ~: l) \* m2 k8 r1 x( X
  12. $doc = [//定义一个文档,即一个数组
    : l3 }' s+ t; z
  13.     'First Name' => 'Jet',5 {; |2 k" \: ^6 E" ~5 |% [1 |
  14.     'Last Name' => 'Wu',% A8 s( z, N. o$ Z
  15.     'Age' => 26,$ Z0 U( n) v5 Z# z7 W' {
  16.     'Phone' => '110',
    4 n# X0 z) f- p% V2 ~/ h, i
  17.     'Address' => [
    5 h. ?( v! N5 t2 K0 R9 ]6 R
  18.         'Country' => 'China',$ e6 z# X, ^# G( R+ R* m8 V2 r6 W
  19.         'City' => 'Shen Zhen'# f5 U- k$ f/ n2 L
  20.     ],; r- S/ l- G' k9 q; f
  21.     'E-Mail' => [7 s! }6 U' C9 A0 R0 C
  22.         '123456@qq.com',0 t5 C. b  a0 J4 O
  23.         '666666@sina.com',3 h: \7 x) p# j- g6 e
  24.         '8888888@qq.com',
    ) c# F- K/ m/ O7 w. I" n
  25.         '77887788@qq.com'! ~; G8 U* D) W9 ?' T( @6 H
  26.     ]& y; @1 B6 {3 k- j
  27. ];" G8 a6 z- i4 c8 s; J. f* |7 O9 u, t
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    : F$ {7 d- N5 O* M
  29. echo '<pre>';
    . X- O6 z4 K; K  j/ L
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()
    0 F$ ~- n7 K/ a
  2. //参数1:搜索条件% n* e0 `1 n' z( ]; r
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段
    ( N. J  U% n# W% ^
  4. $mongo = new MongoClient('mongodb://localhost:27017');5 Y3 l4 M  y: |* Y1 p# g. _
  5. $db = $mongo->mf;
    . Q/ c! {# P. n
  6. $collection = $db->friend;
    5 ?3 s, M2 H/ S( p  T
  7. $one = $collection->findOne(['First Name' => 'Jet']);
    7 w6 ~0 e% H* V- c* R
  8. echo '<pre>';" C/ [/ X$ c! n' m3 y9 O
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    + }, C9 Z+ s! f5 R3 S+ l+ }
  2. //参数1:搜索条件$ K4 [* X  t  V2 z  x9 l  @
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段
    ( |0 X& ]; `  ?% z4 F6 A
  4. $mongo = new MongoClient('mongodb://localhost:27017');) ?+ C/ F$ ?& g7 V3 [" N. ?
  5. $db = $mongo->mf;# g: F: W- L& g" W+ P
  6. $collection = $db->friend;. b% a' R2 `$ d4 P2 l9 x1 D" ]) w
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素% X9 J) J; l! c# K6 L2 ?
  8. echo '<pre>';
    " l& j9 c  t" |8 p
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    ) m1 f+ I8 \! A( T# X
  10.     print_r($doc);! L; f; q- E& P5 |$ v
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    3 @3 R4 ]6 H( c9 Q
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    * Y; m4 l; y3 _9 Z- M
  3. $db = $mongo->mf;
    $ l: |3 N: F) r  a* Z
  4. $collection = $db->friend;
    - A/ o) z+ e7 a, b" E0 z
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);) t2 @; U3 h# Y% i. C
  6. echo '<pre>';% k: s  t- F% k4 F0 ]  N
  7. while($doc = $cursor->getNext()) {: T, g. |; E' {5 m/ ]' N6 m+ ]
  8.     print_r($doc);1 |  j1 M; ]" F" h, A2 z% j
  9. }
复制代码
  //查询某个字段的所有不重复的值( M1 y  K. C9 k
  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    3 F/ Y9 Z4 N1 g
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);7 s* S' N, r; r( i$ s2 V1 `
  3. $ H5 x; H& }) x5 s0 a- f
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    $ t+ G* `  U8 ^0 {+ u  I* x- `
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);+ |0 Q6 X& D( Q+ W' S# P; \, g  }

  6. 0 _& Q; k; u4 Q$ X4 M# T+ Q
  7. //$or:或查询
    $ y; s- h9 J) G$ g2 v) p
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);7 y8 z% x2 x& v9 b  I8 c

  9. " z  Z- M) Q& d* a4 c7 u7 Q  `' z
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    * x& a. ?6 l- S( s, Q* H# X
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email2 N4 i+ @5 F) a+ o! j1 m
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    9 B( E9 j& I/ E+ j5 Z
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个- Z3 [' U4 ~6 L  N. p

  14. # J8 X) r) h' ~# F, o8 S# o
  15. //$exists:根据某个字段是否有设置值进行查询0 y2 j; {0 J: W. g" G4 y
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档4 G. s' z% [7 o. }8 p4 h
  17. . [( C' t4 O" d4 ^% C
  18. //正则表达式查询
    6 m# ~: ?# v7 e/ ^
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    9 R1 I) J& b, Y
  2. $cursor->sort(['Age' => 1]);3 }/ _$ \* k8 Y0 Q6 \2 b

  3. ! w; Y, s# e  W) N5 j. e8 r* n
  4. //忽略前n个匹配的文档; d& g: W. p9 e! x
  5. $cursor->skip(1);
    8 j- T  T/ X5 ?6 U1 C1 n

  6. 1 }" i9 y( O# w
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    7 u; s, r2 ]7 Q1 w( A; \( h
  8. $cursor->limit(1);
    ; s7 Y% u/ u2 Z% W' s

  9. $ J# P. q; I9 e* W& V& ~
  10. //匹配文档的总数7 G, s, ]) L* M
  11. $cursor->count();+ K' Z4 d% T1 k$ y: r
  12. 0 V# }" d# E/ O! B
  13. //指定查询索引5 a8 B1 s" M: w6 o2 |, |
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计# W9 w2 ]) b/ @' w# c
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    + S' H8 e8 W& o: Y9 t3 o
  3. $db = $mongo->mf;8 S( {8 v: Z; W" G! B  M' ?
  4. $collection = $db->friend;+ n+ ~" _" h+ n4 z/ f1 z3 ~+ m
  5. $res = $collection->aggregate([/ I; s3 I( X% ~# J) H: z
  6.     '$group' => [
    ! k% ~4 b  N/ ?6 d$ Q% R# l, }# r
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组6 X( J: M- \, z: J
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1
    & @# [$ h( K0 s+ f, ^: T
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值( h+ h2 M1 ]2 _. p* p) G2 a
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值7 y- _; |% _. g. V, }
  11.     ]
    ! W% M  _  ]: r  j2 \
  12. ]);  E$ b6 y+ i) W  O5 R
  13. echo '<pre>';7 u; w7 u- k& J( [: P. t
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果3 O( @( `, d7 v; C
  15. 3 V+ A$ B. K7 H  W$ c

  16. # D- k+ h! k& G6 W
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序8 t  K  U: [9 |' P, W
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。5 o$ v; B7 y- c- l9 b! {
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    7 X  k# G  T& u& v
  20. $db = $mongo->mf;
    9 S% h5 x6 K( {# C9 Q  ^# }
  21. $collection = $db->friend;
    5 h) A, d& P  d3 e5 p9 ~( h' b
  22. $res = $collection->aggregate([4 W* }. R# s4 R$ Y
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    ' K' B" E7 e9 ~" N* N/ Q
  24.         '$match' => ['Age' => ['$gt' => 30]]
    , O" {7 S0 F9 U9 N8 q" q3 _
  25.     ],  Z% L* G0 ]: J8 R
  26.     [//指定分组字段、统计字段$ p+ c2 V2 K/ s4 L8 C
  27.         '$group' => [9 P; a" t% B  v& T3 K2 B
  28.             '_id' => '$Address.Country',
    ( n$ B6 _3 q* l8 q( C3 k" U) {2 Y
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    ! T! E) e, p& g: z# d# D' N
  30.         ]9 u3 z& W$ i. a) @
  31.     ],
    ; m5 z3 y+ }1 @# h8 i
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档* C9 q% D! s: s3 a' @6 t, c
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    ' f2 n) G$ i0 ?0 @- R/ v6 t
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    . P% d9 n  ]+ ?5 N$ c. P
  35.     ['$skip' => 2],//跳过指定数量的文档
    5 G. z+ c7 h3 U% s) ]' v
  36.     ['$limit' => 2],//只返回指定数量的文档
    / u% G4 D* c: }9 u8 p  I; M- }
  37.     ['$sort' => ['totalAge' => 1]]//排序
    $ O) B7 t( ?& u; M: f
  38. ]);# k, k( u7 A9 h* T
  39. echo '<pre>';
    2 M# N8 p5 a. a6 Z6 B9 t: F% A
  40. print_r($res);
复制代码

+ g* |$ o" T/ J/ ^2 }6 X4 U
三、数据修改
  1. //update()
    ( e+ m  s8 t0 p1 @8 {6 M
  2. //参数1:更新条件,指定更新的目标对象。1 z/ Q5 ]2 {4 Z$ N9 e
  3. //参数2:指定用于更新匹配记录的对象。
    & c: f7 _0 s+ U* K; `9 t
  4. //参数3:扩展选项组。
    6 l3 o" u" d/ V) `2 c: a
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    ! t4 v' @3 _. m3 A, |; ?+ o, K: R
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    5 t: Y" H% D% H; j( D
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    , s* \1 `9 s8 G* S- x/ w4 w
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    0 G. K+ @% w/ W( R6 b$ \8 y3 c
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    : d6 h3 }) U9 ^. C+ `* h
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ I5 B- e, Y) @* V+ ^
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 }6 e4 n& N4 s& g9 B
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    3 J1 a! j' s+ K9 C9 }% R" M  w* k0 x

  13. - G9 v/ F2 R2 x) h5 l
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    1 b. J& b6 S3 h6 {$ Z
  15. $mongo = new MongoClient('mongodb://localhost:27017');) I9 p% |8 L# L- N( D6 Y1 P
  16. $db = $mongo->mf;( J" ~8 Z+ f9 ]7 ~
  17. $collection = $db->friend;. e* o" y5 G6 H6 a
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);
      G$ Q* R" Y0 ~9 f
  19. echo '<pre>';
    ; y' f, c5 M6 L% _: {) |9 f% L
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    # r7 j8 |+ y+ c

  21. 0 U* c( s/ k( r; F/ h1 \
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    8 B/ i+ G. L& `8 u; b" \* i1 d9 M
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    5 f( ~6 F; h/ d. o4 q! I2 m5 S, d

  24. 8 a8 ]- \9 K* {: F/ g
  25. //$unset:删除字段/ f7 j( K" a/ N  }0 d
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);
    : W8 P8 u) ^( Y. U# E, \

  27. ' B6 `) Y4 M: l$ @' E3 d# q
  28. //$rename:重命名字段,若字段不存在则不进行任何操作: i( s, A  e( j. B$ i
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);9 q. y4 F, Y' y. _
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。8 j3 o& k: V% V

  31. 0 k8 A+ Q" T) y9 K; g! G( l0 P: ?
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    ( Q5 L6 @" `6 S' Z! E
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);+ n  s3 }+ R* H  d0 s3 {

  34. 4 u3 [8 x2 U' ]1 T# z
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错% c7 m. Y2 s6 N. {( v% X
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);, {& O& W, Q% C% B; w

  37. * I1 z0 @& Q; G
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    7 k& b4 B! v% ^0 q% z
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);
    ! [# ^8 \2 y% z
  40. " d7 ]4 l3 p. |" E7 E
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    , Q3 `9 N5 R9 |
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ! @8 Z" g: p) h+ S9 C3 g
  43. & @9 X- h$ S2 o9 {0 _
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    , a1 j% \/ `+ c3 ?# D7 d$ U1 X
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);' G; x+ ]" T3 M4 V
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);0 T* b& L+ ~' U* W$ N; T

  47. - [$ K' d  g! f2 g2 ^% j
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    & X5 U5 N  i! e0 d/ v) X" q% U& O
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);2 t+ t1 q/ [+ F5 M- a- y

  50. 0 _# c! l6 ], U! x6 D
  51. //$pull:删除数组中所有指定值* _; }* ?0 o1 F8 g1 K6 L
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    7 }: \% j0 B, D. C

  53. ' \& y* z, S4 v" |1 K5 \( R: }
  54. //$pullAll:删除数组中多个元素的所有值
    3 E# m  _1 ?" T* u
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    1 e' E# {  `4 B  A6 n
  2. //参数1:希望保存的信息数组
    % n! v$ V  ]& a" r
  3. //参数2:扩展选项
    ' i2 j1 ^* H# Z- Y7 ?! p; }9 e
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。3 O! j' Z0 _7 d! Z
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    , _" X7 g" s! X" }
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    & c# l% p$ ^; |# U- u
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    3 t0 A  G) l! W
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)# `1 m- ?& z9 \( Y8 Y1 o
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。% E- y- ]' ]! v  D2 ]
  10. //若想更新则应该在参数1中指定_id键的值。
    " u& }$ P" L! b
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    4 R8 J5 M* x7 c- w# e' g2 ]) S
  12. $db = $mongo->mf;# m( \% b0 X% [# g8 V) I
  13. $collection = $db->friend;2 d- ], u8 l% y+ [0 o
  14. $doc = [//定义一个文档,即一个数组
    4 D* h: }1 N- S1 Y+ R$ {$ B+ c
  15.     'First Name' => 'Jet',* _% y0 q' `7 @. ^; n
  16.     'Last Name' => 'Wu',0 C. p) _! ^6 ]1 h
  17.     'Age' => 26,
      F6 e( K+ k; P( B, J1 t) N, ]
  18.     'Phone' => '110',
    - ?! m" a/ {/ x& v0 j3 }
  19.     'Address' => [
    - j8 H: g0 _% M" w4 u
  20.         'Country' => 'China',% S/ D5 d# g: }  F8 r  {" V
  21.         'City' => 'Shen Zhen'
    0 M" B- a7 }% C' ~" X5 v
  22.     ],
    ' q+ Z, M& p7 L/ A. E
  23.     'E-Mail' => [
    - o" Q6 R& y- x, m- L! K8 v( |" m
  24.         '123456@qq.com',$ y2 Q9 ^7 {8 M1 A3 d7 p( v
  25.         '666666@sina.com',
    6 s# U; X7 i0 I4 Z' O0 O
  26.         '8888888@qq.com',
    $ g$ q# `" ]$ f" n
  27.         '77887788@qq.com'
    6 T: N. z  e  p, ~- [" x" {
  28.     ]
    ( k6 }/ y  N7 L  B( j0 g5 G0 \
  29. ];
    2 ~5 C: y. m  ~/ S  D
  30. $res = $collection->save($doc);
    . M7 n/ z, \- p/ X  H
  31. echo '<pre>';
    3 z0 W/ V+ Q' @1 B4 ~7 X. F: V) B
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    4 ~$ ]+ Z3 |3 Z% ?$ J6 v' F6 ?) o
  33. , r6 X9 Q4 Q' }' C9 g4 i
复制代码
  1. //findAndModify()5 M, d2 W% \9 J+ E! w
  2. //参数1:指定查询条件
    0 U' T% c) Q7 x3 Y5 p( h: N
  3. //参数2:指定用于更新文档的信息
    ) c) s4 O2 N/ V
  4. //参数3:可选,指定希望返回的字段
    1 S9 [3 A6 s' g2 s
  5. //参数4:扩展选项. b% {* [; r  y5 L# d/ K1 s% s7 k
  6. //  sort:以特定顺序对匹配文档进行排序! i5 }6 T* c! u# P
  7. //  remove:若设置为true,第一个匹配文档将被删除$ W2 O( |( N7 o/ D$ a/ u2 R% [
  8. //  update:若设置为true,将在被选择的文档上执行更新操作
    ) |, p+ t" f8 D2 B" n  ?) F  u
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档2 P5 S7 x, A3 {) Q1 X
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    ( P5 C3 d6 ]. J% c
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    0 G% j, |+ V# H7 \6 A. W( z  z8 @
  12. $db = $mongo->mf;. Q; W, \1 P) N% H8 N  e/ O+ i
  13. $collection = $db->friend;
    ; P* N5 {" F) a4 W
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);* s% d$ h' c& u
  15. echo '<pre>';: J% N2 w. O; B7 K0 h) B' M: I
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    % }/ T7 k% q8 @; l
  2. //参数1:查询条件& l5 X* l, Z6 N, Z% K
  3. //参数2:扩展选项9 o. O: \- N; x* k, D
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除) y; K) {# L1 _& g! J/ O
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& O' X# _* s/ W# N" Z1 g( y
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作% z; q0 c, t5 O" X: Y5 d
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    - m4 z7 R, b2 I2 J
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间# C; t9 O! k- U& R& Q2 i4 I( E% {3 `
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    9 b+ u3 G) i1 T: V) w$ o
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    8 r  c" j% v; w4 _) m9 B& C5 k! H! F
  11. $db = $mongo->mf;
    $ r4 N' I' X# [) A8 b8 L9 S2 D
  12. $collection = $db->friend;
    $ }8 {, r( j- }( Z& A
  13. $res = $collection->remove(['First Name' => 'jet']);8 y+ S; `" t, N" j+ T% e! k
  14. echo '<pre>';
      n2 p1 g4 g; s" _0 ?
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

& M6 K4 s, M! C* ~* Y/ l& K, c9 }  e
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

$ h( O6 A0 W& l8 l$ Q
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

0 _% S' W8 D; ^! u/ D
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    & b# X4 ]7 O  E2 F6 y  m: ^. i
  2. $bulk = new MongoDB\Driver\BulkWrite;, k( e( b  B% j2 m. A* t7 Q
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
      H+ p$ R, ~& J0 V. q
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    6 d- Z* [) v+ N9 X" w

  5. ! I3 a5 s+ Y" Y& a9 d
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    & D5 J' ^) S  M" m2 z  I: L
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);% ?" D6 }  g8 \3 l- A
  8. echo '<pre>';
    6 V! C5 X5 ^5 B* N  L3 C* D9 B3 y
  9. print_r($res);
复制代码
3 X; t. p# s% x/ G2 j5 p9 T
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    9 H* ^6 V1 a  R7 r! W
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);) P, D% H9 |% e1 A7 [
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    ! Y+ b7 q8 V7 k/ _9 _3 m: A) H; T
  4. / j5 }+ A. K9 Z2 {
  5. $data = [];) l  R5 a$ y' K! N
  6. foreach($cursor as $doc) {6 T4 [* y& Q0 f8 G
  7.     $data[] = $doc;# p$ j9 S3 i- q2 r0 F. w0 j/ a
  8. }0 R& @* W5 e2 |' v9 M% M  \; r# I
  9. echo '<pre>';
    0 ]- @4 b3 q; e& r# {7 ^5 a" k8 P  h
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ M8 `& E! e  V- Y* b. B( N4 z
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 o  \# @( X* \1 I) b
  3. $bulk->update(9 Y$ h$ n/ A( O5 W* C6 q2 e
  4.     ['name' => 'JetWu5'],
    2 g! C: K  m3 C1 d% D9 b3 T6 ?
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]' \: T$ D8 h4 E$ p5 R9 L& \
  6. );
    $ T0 p. p9 ^' {* }1 D
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    ! n7 y, ^. `  U: G1 n2 B/ `
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);8 s6 U5 d, P7 @6 l: {6 z
  9. echo '<pre>';
    ( I  N, M( W6 M0 N
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');* r, d9 g+ a0 B2 s, w1 _' q
  2. $bulk = new MongoDB\Driver\BulkWrite;- ^* J, |6 p' \# l
  3. $bulk->delete(['name' => 'JetWu3']);
    6 E5 l6 }2 S' W/ M9 C
  4. $bulk->delete(['name' => 'JetWu4']);
    " c2 E4 `6 I( y# Z1 p
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认3 t6 t: z1 M( d; n' \3 Z
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);0 G# |0 J" A. y( f2 y$ V
  7. echo '<pre>';  P# \) O$ ~. @/ i- m) q
  8. print_r($res);
复制代码

9 S/ S2 m. B& M- `2 K$ @. o9 _( J# L' C5 B5 l
( o+ ^( \2 J0 S; ^

  l2 M8 ?  g: i  c$ {, c- _5 C3 [) F, }( H/ \  J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 12:52 , Processed in 0.068795 second(s), 19 queries .

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