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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12589|回复: 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()
    / ^; X3 S- ]3 M0 b# k1 D" l
  2. //参数1:一个数组或对象8 ]1 r" |4 @+ P* @
  3. //参数2:扩展选项
    6 ~  j6 }- d7 ?3 d1 M. `
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘4 B1 k0 k/ [) x# n! ^* H& X
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    9 O- y9 A2 i; A3 z) H
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    - y: y, N% `( }! ?2 k1 q  Z
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 d/ z- o2 X5 s0 k1 U! U
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)8 U: E4 T3 H$ [8 u6 _5 M  U
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    4 e5 n0 X' B7 F
  10. $db = $mongo->mf;//选择数据库
    % U- c  M1 i$ T
  11. $collection = $db->friend;//选择文档集合  Q! A/ _7 Y/ C+ ^7 ]' L
  12. $doc = [//定义一个文档,即一个数组
      v) ?  R3 h* J3 g6 S# O# a
  13.     'First Name' => 'Jet',. a/ F2 G, q  I" ?( p7 k$ j) }8 W
  14.     'Last Name' => 'Wu',
    3 n# v4 S" V7 S7 k: ~
  15.     'Age' => 26,, [# V. k: M8 g9 ~
  16.     'Phone' => '110',5 P# v; ]5 D" L5 D- R1 o/ c& b
  17.     'Address' => [* V1 ^& Y3 F9 p7 x% j$ u, P/ I; Q
  18.         'Country' => 'China'," B7 G0 L7 o9 z- o& P5 k8 Q
  19.         'City' => 'Shen Zhen'
    6 c# x# |6 T" P& z+ e
  20.     ],
    ! U5 e3 @7 @, w1 ]
  21.     'E-Mail' => [
    ( t* A( y; }# Y4 T6 h
  22.         '123456@qq.com',
    9 G6 a  ~7 Q; C! a2 q2 O$ L
  23.         '666666@sina.com',
    ; V* O% M1 I: ?- v3 `0 y
  24.         '8888888@qq.com',4 X+ c' C! ]; b
  25.         '77887788@qq.com'+ Q2 V7 v0 w8 d$ G* l, t. d
  26.     ]
    . F) K* J* A# y. ~
  27. ];. |# \) a9 i4 j
  28. $res = $collection->insert($doc);//向集合中插入一个文档; l& \( Z% m8 d( g* Y2 i
  29. echo '<pre>';
    , T5 i/ Z' a* v5 [: N8 }- J' }4 K
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()( r/ C4 E* g0 X, q; }) H5 h
  2. //参数1:搜索条件
    4 m! o+ D' a/ }7 |
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段7 h; Y/ E5 T  X. V' h
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    3 j* m7 K! A9 [* A& O, R* x
  5. $db = $mongo->mf;+ C4 }4 W9 {3 }6 N- M: o
  6. $collection = $db->friend;2 Z( I! N, w2 ~) {5 s& ?
  7. $one = $collection->findOne(['First Name' => 'Jet']);) b' S+ J( b0 T) l" I* W8 g
  8. echo '<pre>';
    / [7 q1 H2 u! C3 o1 v6 G, p' V. y
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()' t/ T. q; y& Y4 `& p3 E  G
  2. //参数1:搜索条件- w8 |! d& W% ^$ H& k* c8 u, e
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段$ Q: O) C& z& G" F
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    4 Q4 L9 b% ?% a& \
  5. $db = $mongo->mf;
    7 _% ^$ r  E/ z. i% p
  6. $collection = $db->friend;
    7 w, {: y( K) L5 X
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    3 _! c) q: j: R# k
  8. echo '<pre>';
    2 ?, a6 `- }6 u2 D* d; Z  ^$ K
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档! d9 s( F' w5 \  t8 d
  10.     print_r($doc);6 A5 {' R1 \/ k# L' J' J
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询
    6 u7 ~6 e9 N' p
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ( a" r% G5 ~/ z6 h+ F
  3. $db = $mongo->mf;
    8 r4 d( w1 S9 n6 M
  4. $collection = $db->friend;
    & \. e' a( y  f  Y1 b% {* L
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    # }: Y9 Z; W. Y
  6. echo '<pre>';
    + C& ?* q+ F/ m; q4 d4 K2 D6 }
  7. while($doc = $cursor->getNext()) {
    ) G" X7 }! {! p
  8.     print_r($doc);3 W4 J) _( w& |) P
  9. }
复制代码
  //查询某个字段的所有不重复的值
( D! u. _; O5 b" m  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    2 j9 ^6 A2 \& h5 K' f
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);
    " G. _2 E! P2 a# F* ^) O
  3. " [: C, e+ T& F" `, j
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    - W0 O3 b. |  U% U
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);7 c6 I/ Z+ J' O! ?6 T- }
  6. # d: I! B$ U+ D: D1 {1 T
  7. //$or:或查询
    8 y! i, w" V3 W! |# J5 H& E1 E/ ^
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);' q) s! u0 R' s  s- b! u/ o

  9. : J  N+ R" s1 J5 Z  W
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中
    4 F3 T' R: Y" h
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email3 ^7 ?$ L& q. @% X" D! f
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    3 N9 d9 f9 p% [4 K# W/ e
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个+ L) q) Y/ x8 ]/ b8 d$ ~, [; ^& y& {

  14. - H- N) b/ B; L$ g4 B8 X5 Q
  15. //$exists:根据某个字段是否有设置值进行查询, s+ T2 ~; K% @0 B; C1 z/ D2 y
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
    " I8 R/ ?) a  n8 z  ^* Z( q

  17. " Q( R/ J% h9 K6 [# A- V3 _# F7 x
  18. //正则表达式查询3 e( W& a, {( g' e, m/ ]
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序
    4 d/ f& @( L; q. \: s( j4 f
  2. $cursor->sort(['Age' => 1]);
    9 j0 s! v; P9 x! q4 b

  3. : R! y4 b  `  W$ W- V1 P
  4. //忽略前n个匹配的文档" W% ^9 _* K0 F' O+ P
  5. $cursor->skip(1);7 c" H/ ]: ?4 y: B* X2 d$ y0 ?, H
  6. 3 K! p, b& ~5 h# E: ~) `
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    / S7 X8 s5 H2 s% }, |
  8. $cursor->limit(1);
    : w& @1 Z9 ]3 E5 k: e( |8 X
  9. * ?0 e$ b- {+ Y. u8 z! q( x+ p9 D
  10. //匹配文档的总数+ s& U5 I. k% m4 C9 G" I) j& X
  11. $cursor->count();0 s$ a2 v- E7 y, b0 H

  12. ; {8 J8 E& Q9 S( ?) Z8 o8 ?
  13. //指定查询索引4 B0 e! F" P  g0 ]# u
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计
    % u4 e6 v* M8 E+ J
  2. $mongo = new MongoClient('mongodb://localhost:27017');& T# G- p5 S0 ^2 P" ~
  3. $db = $mongo->mf;1 {8 [4 g& W5 L8 ?# l
  4. $collection = $db->friend;
    ! r; ^/ p$ T" h: O/ k0 f
  5. $res = $collection->aggregate([
    2 ?' j; F  C1 {  F& N) S4 {- j
  6.     '$group' => [
    ' V% J2 A* s8 o' J0 N; W
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组* a0 |/ N8 j3 B6 O" q
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1( A! Z$ I" k, F/ k$ M, A
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值- W+ M  g. m' L2 M
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    ( K0 Z( X- n2 N' S) Y) V7 k" u( E
  11.     ]$ B( d3 ^8 ^8 m% P( ~, n# U
  12. ]);& [- G1 l! N& L& Q+ v, }
  13. echo '<pre>';
    - R$ U( c$ P# f9 \/ h" ^' {1 Z: f
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果) Z; t" b; O  m0 V) w! L
  15. 6 S2 `9 e3 D8 _( \9 }! R$ ^

  16. 1 R% j# W4 _" S1 L$ f
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序
    4 v& r" ]. d. N- Q+ V) |8 O
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。: i5 J( G, n6 g" l2 D- C7 E0 C
  19. $mongo = new MongoClient('mongodb://localhost:27017');& l5 @/ B9 q; R
  20. $db = $mongo->mf;# }- H. o; }" s. t
  21. $collection = $db->friend;' _1 v& S# p2 A9 E* M8 M2 D
  22. $res = $collection->aggregate([+ F! |* ^) O, T/ R) M
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档+ x) h3 E/ {; B) l1 }) ~4 ?
  24.         '$match' => ['Age' => ['$gt' => 30]]
    4 l4 l' j: S% I0 C" b
  25.     ],; f6 r. S; f3 \- v  V
  26.     [//指定分组字段、统计字段( S& K* f2 L! s  y  {4 G! ?6 W0 q7 a* S
  27.         '$group' => [
    ( m- a" X+ l; g5 b
  28.             '_id' => '$Address.Country',6 R% W: ?2 X# H# A' h
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和+ e# S2 c! W9 q0 h8 j4 }5 j
  30.         ]
    2 f; r% }# }) Q6 L
  31.     ],
    : _: ~( }2 w9 h  X- Q2 f
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档7 Y* n( [8 X9 x6 d
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。
    8 m% t2 i/ R  D& t# {. z$ }& O9 F; U
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    3 t! ~4 \9 D% [. @6 w! `2 K
  35.     ['$skip' => 2],//跳过指定数量的文档9 ~5 S3 M$ g: A
  36.     ['$limit' => 2],//只返回指定数量的文档
    # A4 G( w* V+ A4 n2 D4 @
  37.     ['$sort' => ['totalAge' => 1]]//排序
    0 D% L: I& {& b( J
  38. ]);2 Y; ?7 c6 P2 s: s& J/ [0 r; m2 {! i  f, z
  39. echo '<pre>';2 M! q8 Q$ J- w( [9 s
  40. print_r($res);
复制代码
! S9 v' E/ N$ ]
三、数据修改
  1. //update()4 b/ d- W9 _9 J, [& K8 l! v
  2. //参数1:更新条件,指定更新的目标对象。
    5 D) U2 R, W3 S9 _* O
  3. //参数2:指定用于更新匹配记录的对象。
    ( A/ B  W( \" S; Y& u5 W
  4. //参数3:扩展选项组。
    , ]  p# S% V- z( M$ @
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。1 Q% D: [+ c& t
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    3 U$ C5 G. T. ^% q- U: g
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    6 o. L' U8 n! e+ H# i4 m
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作$ l+ S: Q$ @$ J. c* a+ ?  V  T2 q9 p
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。, j* ?! ]8 F. H, Y  o# o
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    # A  |$ y5 L) K$ O. e3 K
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)+ F& V% S4 s7 U, _( `! i
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    1 D! v0 h9 A, o3 N/ d/ [/ ?/ D

  13. 0 h4 [  P9 x- B/ ^; s  k- m" P
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    0 `6 F! V. ^, O2 T* |1 Y
  15. $mongo = new MongoClient('mongodb://localhost:27017');& b1 ^# ~+ O2 E+ u2 I. l; V& y
  16. $db = $mongo->mf;
    . @, K7 P/ U- _+ x' e
  17. $collection = $db->friend;
    5 m  F, e+ O, E/ I# a$ o1 ?
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);" f: G! o) R! L. z$ q" L
  19. echo '<pre>';
    2 M9 k% \: o+ F, T0 P1 b* U8 s0 ^
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    ' X7 q" l- A" |9 O
  21. / G: T+ _7 M1 e4 u4 n- t$ n4 ~
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    + L6 o1 w2 f4 k) Y, C3 z
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);" h4 W* w* k. l( E9 d, f
  24. ; z" j, J8 ~$ W7 q
  25. //$unset:删除字段
    5 C! ]( C3 J7 r0 W+ G- A
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);6 b! z9 `% V" I# ?

  27. 0 m/ N7 c2 N% @9 F8 e
  28. //$rename:重命名字段,若字段不存在则不进行任何操作
    9 v& e( d; [+ `" {7 I1 L' [- a# S  C
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    3 N) s* @  s% j/ I
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。! q5 N. E5 i* i( g

  31. 8 l! P- ]- Y8 L
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * A6 D) R8 M( E7 @% x
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);8 ^' I+ D/ |$ [* ^
  34. % m% M" P, h/ R, O
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错* J6 J3 v# h4 A' f5 b) o3 _
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    / N( U; G) k& C* r/ A* A
  37. ' @! J' l2 y9 W
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错  n( E5 C" K$ M2 p
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);# ~9 h6 k9 H: [

  40. 6 r" f* C- W4 H/ y0 j0 i5 x  U
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    2 @+ y& o2 R" d. a1 [
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    / y% N/ e# x% ~4 C* d4 ]

  43. - n& s9 M+ k# ~0 \- M/ W) h
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)5 a5 X, J: M1 K, H- R+ V& l1 s
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);, o2 `- O5 u( @
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ' L% `& l3 t5 r! J. X
  47. ; S0 g7 Y& R! }) R  k1 R% g
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    2 e6 `! u* M1 e0 m/ e7 S7 U3 a2 S
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);0 a6 M3 k0 A* o* ~# K: p0 V
  50. 4 ~' ^( O+ w6 `9 K+ ?4 M1 r# Q
  51. //$pull:删除数组中所有指定值
    5 D1 W/ N) S, J' [5 l+ x, ?, M
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    $ Y: G5 h! x! r8 A
  53. ! L, r) `. H/ l' g
  54. //$pullAll:删除数组中多个元素的所有值
    ' N+ }( j! G4 u2 y+ D+ y
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()! W" i$ M' H" q% V9 O
  2. //参数1:希望保存的信息数组8 C1 `2 p, u$ |* K: t7 [
  3. //参数2:扩展选项
    7 ~8 n' e" V3 j7 d" {! D
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    / p+ _9 A% {0 J8 y! U) P
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    3 ]; e& K* w  B. |3 ?
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    9 U, c: k  j' v; p
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间; T, P  K; S; F% m2 Q# ~9 V+ o+ T
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)6 Y9 h& V# N: m6 F9 \
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。
    " j9 w! ~6 m# d, U5 `  ~. C3 r
  10. //若想更新则应该在参数1中指定_id键的值。; a8 _/ R" m# ^4 i; F3 G9 l
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    1 e) E! I  W" F
  12. $db = $mongo->mf;# I( i6 K% H, N; v3 B2 k+ w
  13. $collection = $db->friend;
    6 E* R. M$ v! R9 r. n/ z
  14. $doc = [//定义一个文档,即一个数组4 e9 s$ R) t9 O7 E0 ?* \
  15.     'First Name' => 'Jet',
    1 U. c( n8 j2 X. m# m  d5 q
  16.     'Last Name' => 'Wu',
    , H& Z1 V* y' W0 @; _
  17.     'Age' => 26,8 G; E  a6 n) ]% P0 S
  18.     'Phone' => '110',
    # n$ F  e( H1 |2 Z* X/ P
  19.     'Address' => [
    6 [8 L+ }# {+ c$ B% Z  ^( e
  20.         'Country' => 'China',1 V: e3 D7 Y0 O! g! T
  21.         'City' => 'Shen Zhen': Q8 ]' o. l1 {  ~
  22.     ],
    ( |1 L: X  K# V; M
  23.     'E-Mail' => [
    ; f6 `- T; W. v$ d& B
  24.         '123456@qq.com',
    , D% i' G; X$ f% L( j1 a1 m& P
  25.         '666666@sina.com',) t- r, Z* `+ c/ D0 `
  26.         '8888888@qq.com',
    * X4 W' W$ O/ L
  27.         '77887788@qq.com'
    ( L- o) D2 h1 d  i: U& [
  28.     ]) \7 o" b% s; k+ a- g, z
  29. ];) y7 d+ p. M: j& G, S0 C
  30. $res = $collection->save($doc);# _. ^8 h  W0 H/ \& ~: a* ?1 x
  31. echo '<pre>';
    * G: \: ]1 z" X0 Q7 c2 u) \5 |
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入: Y8 g3 w$ d2 P* e) h/ N
  33. % z" w0 N) z6 T% I4 o) u6 w2 R
复制代码
  1. //findAndModify()
    # Z5 `6 S/ `* f+ S
  2. //参数1:指定查询条件
    . u3 F" F* k- V+ |' l; Q
  3. //参数2:指定用于更新文档的信息) a9 Q6 y/ ^- W2 y
  4. //参数3:可选,指定希望返回的字段9 Y  `5 c) l" R, g
  5. //参数4:扩展选项3 ]5 P: z6 E5 u0 J! k8 K; z9 D
  6. //  sort:以特定顺序对匹配文档进行排序$ {4 C, z6 q3 H
  7. //  remove:若设置为true,第一个匹配文档将被删除
    6 j  D; I0 d# G  ~- F
  8. //  update:若设置为true,将在被选择的文档上执行更新操作; S" ~9 x% m8 ]. M$ l
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    / ?+ L/ Z# P1 Y2 ^
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档
    ! W. j1 }) k0 w  c( y( _3 F3 d* U
  11. $mongo = new MongoClient('mongodb://localhost:27017');5 R; a$ O4 G! r& p' c$ f
  12. $db = $mongo->mf;
    4 d  d- I2 o" O- S; a
  13. $collection = $db->friend;0 R! T6 t8 H- F2 Q+ B
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
    . o2 h4 X8 R$ ~1 X
  15. echo '<pre>';& H4 j/ [- w9 ?
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    ) L* J7 `# i0 v7 C8 I9 N
  2. //参数1:查询条件! c5 W' y: x5 M7 d
  3. //参数2:扩展选项) J! a- T' Y  ~9 B4 O4 ~7 W$ U6 U
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    " G! t1 H( c& ~. ~
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。9 T$ z  Z# `& |" Y2 P" J
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    ! u5 M: ]" r& P. Q' _& g7 A, f
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。9 G7 L" I8 j$ H- `. a8 l  ]" `
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间" x1 ?/ ~4 r/ P3 f1 I/ \. c
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    / G* x3 v& I* K2 g6 u; ?4 A3 |
  10. $mongo = new MongoClient('mongodb://localhost:27017');; }: F; v8 w1 F8 o' V
  11. $db = $mongo->mf;. F$ S/ I3 ]& M" Y
  12. $collection = $db->friend;$ n. F! B4 `9 m& @% O2 K, A
  13. $res = $collection->remove(['First Name' => 'jet']);
    , L; |' x2 }, T$ E" ^/ D
  14. echo '<pre>';5 r: C9 \0 C& j, V$ M9 X& p3 _' Q
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

; _( @% B7 ^& E5 R% L
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

$ C% P5 m( O2 Q/ ^+ I
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

: ?: S5 X3 D; }" |, u
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; ?7 M' C0 U" h7 |+ m! ~1 l0 v
  2. $bulk = new MongoDB\Driver\BulkWrite;3 w& i# I' b" r: Y+ s7 u" p8 N9 j
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    / G* P/ E, N% I# b) R+ G
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);- w  d3 x; F/ ^6 k' _& f
  5. ; c( ]$ C; _& k; j8 n# Z
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 y. W7 V& U: y* ~8 S% O. B9 x
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);. U; P0 a2 o" h$ ?4 j
  8. echo '<pre>';! \# n7 v/ s7 y1 I" l
  9. print_r($res);
复制代码

; k' s; s) p* E
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');- z; P- M9 w  \' h6 a4 a. s& _
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    ; [- y* P( }- m* g' n6 r$ {
  3. $cursor = $manager->executeQuery('wjt.friend', $query);
    0 ^- n. [4 w7 d6 S
  4. : _6 u$ l3 I" i! `1 V4 E& D# l( I
  5. $data = [];
    ! X1 u; ?! W! t2 P, a- Q9 g9 {
  6. foreach($cursor as $doc) {6 k; g- l2 \8 t
  7.     $data[] = $doc;
    5 d+ M8 q3 d+ I7 H, i0 u
  8. }
    6 c5 P8 g5 M/ |/ ^4 {( h
  9. echo '<pre>';
    % b8 N- e: k* ~' [1 M* e2 s4 D
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');; E' g$ O0 q6 x% I4 t
  2. $bulk = new MongoDB\Driver\BulkWrite;
    / x# b% Q- _3 Z" @+ X3 ?
  3. $bulk->update(
    ; z2 \) N! Q  S
  4.     ['name' => 'JetWu5'],8 e$ m  p' a& X/ W2 c
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]. e0 s+ s* [9 d5 ^
  6. );9 Z! l% ~& {$ q. s+ Y
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认0 K" R! G  C; z7 @: o+ \' l
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    1 r- f8 \7 Y2 e* g" n
  9. echo '<pre>';
    ; s' X6 E; O% A( x. L2 T( a. \# k6 h
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');- C, R, ]# I* M( A& m
  2. $bulk = new MongoDB\Driver\BulkWrite;
    2 @1 t$ u% U- A6 r( Z2 S
  3. $bulk->delete(['name' => 'JetWu3']);
    3 ^6 L# C5 ]; h$ k3 `
  4. $bulk->delete(['name' => 'JetWu4']);, i- {  p- s. |) q* D2 ?; X! x
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    0 y, T8 C" ~, f- T) h( q# E! W
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    3 S8 E# a6 a! I+ @
  7. echo '<pre>';
    " |) V, x& _4 y0 j* O1 w# N4 r
  8. print_r($res);
复制代码
% v0 ~+ V( d& P+ \( J$ I
+ w/ D5 ~* t7 a% Q: J2 Q

& b& I" m9 w7 [

* W7 Y" @* v% a# P7 b6 V, O3 @5 l! b! M* v6 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:12 , Processed in 0.061330 second(s), 20 queries .

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