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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12598|回复: 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()
    7 [$ Y, K0 u3 q2 X
  2. //参数1:一个数组或对象7 o: J0 R# h$ T
  3. //参数2:扩展选项
    # A9 U3 Z# x, G1 ?5 i
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘
    : M% A1 j9 i; A3 R1 w& V0 ?
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志
    ( C  {& X$ u' T' W) p
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    2 M. t: ~2 ^  p9 e
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    . q. c% ]7 _, B: l' c6 S" M+ O
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)' X  W* \7 _! a* q9 w0 L/ M
  9. $mongo = new MongoClient('mongodb://localhost:27017');/ }1 g( {3 W& C& w" G  F1 P
  10. $db = $mongo->mf;//选择数据库1 E" ?! U0 M' n9 I8 y; M( Y
  11. $collection = $db->friend;//选择文档集合
    6 R* P/ ^2 M! ]+ S) [2 M
  12. $doc = [//定义一个文档,即一个数组
    4 c% J. K* p2 f7 g: C
  13.     'First Name' => 'Jet',
      x: G" j1 i$ ^3 X# G3 |
  14.     'Last Name' => 'Wu',4 Y$ ?' {  H9 }
  15.     'Age' => 26,
    1 {  W5 N3 n4 `8 F- W
  16.     'Phone' => '110',
    , t/ o! R/ N: R, C$ B" F9 A
  17.     'Address' => [3 G7 }" ?/ F4 M+ y  h3 w8 Z; U8 g2 s
  18.         'Country' => 'China',
    + \& g  B# [/ i4 G* P! Z
  19.         'City' => 'Shen Zhen'2 C+ T7 \9 t! B6 v5 W
  20.     ],
    / L4 S2 W* [8 f( y, N+ ]7 N7 b
  21.     'E-Mail' => [
    # F9 s2 b& N$ k' D
  22.         '123456@qq.com',* C6 B4 h2 w4 v5 K5 b5 s. A) K3 y
  23.         '666666@sina.com',4 F( s. s" v7 j# m- a9 e
  24.         '8888888@qq.com',
    2 H( M2 d5 G  N5 _# @/ K' _6 R
  25.         '77887788@qq.com') T  A. N2 D, U  ^' u  l! l- K
  26.     ]
    + P5 F1 k, Q6 E' J; p! ~
  27. ];
    ' t" y7 _5 b6 ]8 {
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    5 _3 p- f7 _( m7 Z! A" a
  29. echo '<pre>';
    . u% H7 M' }0 I; ~( G( l
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne()# k. N4 v7 e; D" w8 P, a8 c
  2. //参数1:搜索条件; W& j7 [4 h( {. A9 j2 K
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段- p4 R+ }; g3 m. Q$ f  u3 }8 J# v4 w( L
  4. $mongo = new MongoClient('mongodb://localhost:27017');# F* H! T1 ^/ V  B# O
  5. $db = $mongo->mf;* V9 G  h, G: i9 D
  6. $collection = $db->friend;, r+ t- i3 h) T% [# a
  7. $one = $collection->findOne(['First Name' => 'Jet']);$ q1 t3 K0 ?$ {0 I3 F/ ?
  8. echo '<pre>';
    2 k7 y- O( I9 u8 i) l% |) p
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()* c( T& O) V* A7 |! \: l
  2. //参数1:搜索条件$ l( C& b5 v7 F/ C
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段8 _6 |+ o# A9 E' W
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    % l7 \% z. @; ]) f( j
  5. $db = $mongo->mf;( Q7 W  M7 t" B( `9 ~( H; l  H  G
  6. $collection = $db->friend;
    ; ^, a) _7 \: \6 {
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素
    ' R4 G( W  ?" X
  8. echo '<pre>';
    5 _6 H. G0 Q4 V9 y2 M
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档
    " n! H2 ^: _4 D0 q# H. X4 F6 w: g
  10.     print_r($doc);9 \. S1 ]7 B; K( r: f3 d3 }
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询) C+ \8 g7 Y; S) V% k
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    , K! T' M6 R! I; l
  3. $db = $mongo->mf;- ^: x: f9 U3 w  ~, ]; d
  4. $collection = $db->friend;( F) z% V3 r8 o! H; W
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);
    5 E  W/ P2 `/ z+ I+ ]" S
  6. echo '<pre>';
    + w- w3 C7 ?7 ]( @  v$ V
  7. while($doc = $cursor->getNext()) {
    $ y5 e, g* _5 c' S
  8.     print_r($doc);) p, f: G; e$ y
  9. }
复制代码
  //查询某个字段的所有不重复的值
& |6 ^0 \# @- t2 `" c- d# ^" |3 X  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个
    & n% y) q. p) g+ t) x. z1 w
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);/ {8 f- Y" ^/ `. |2 r# Y; t3 ]

  3. 5 ~6 n: E/ Y6 R# f
  4. //$all:匹配多个值中所有值(用于数组字段查询)
    , C% g- Z" o5 ~! g% U4 C0 _
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);+ H$ y1 c/ a# J9 B

  6. 6 Z' B) y+ d; _
  7. //$or:或查询' b$ a, l- j: _2 \# z
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    1 n8 O( E) t5 Q: m3 L5 @
  9. 5 J6 e7 B4 I" M3 S9 u# a2 A
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中1 k4 w$ ~( C0 P. I0 H/ A
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email
    & G  P: ]  B* f+ g
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email
    , ~+ ^& B# l9 ?2 j3 E6 [0 h
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个* c/ a2 D1 y7 b  P) W' B: ]9 W' l) \
  14. + o* H% ^8 E; [1 j! Y0 O2 ~. }! i- S
  15. //$exists:根据某个字段是否有设置值进行查询
    7 N% [- Z2 \( @5 F
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档2 A) U6 O9 g- @
  17. 0 n; [4 N$ O+ e& d
  18. //正则表达式查询  a$ H' v5 z# h. D! J& Y
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序; e) P& J+ {6 J! S) |
  2. $cursor->sort(['Age' => 1]);- l7 b1 X$ o8 J3 S; [* v
  3. 6 S$ H7 l+ |" K; r
  4. //忽略前n个匹配的文档9 K0 R% s3 B7 l9 ?" g1 H" G
  5. $cursor->skip(1);
    * `1 |; P# o# G# O0 O
  6. * `# \# J. _: Q* s1 n! E
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    2 q) K$ C9 o! U* \
  8. $cursor->limit(1);
    " S9 j' r" x- M2 k( P) f& i! W

  9. % I% ?% H& k. M7 D% B  `
  10. //匹配文档的总数; F/ @2 v4 W4 g9 {2 C8 a
  11. $cursor->count();) t$ {+ L9 s' ^5 A" W9 n

  12. # A' U- h2 Y/ F$ c3 I! b: W
  13. //指定查询索引% W) u, H  k( G: w+ U
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计% n/ z8 f* ]' f, r5 p
  2. $mongo = new MongoClient('mongodb://localhost:27017');) V4 d6 L' s$ z) Y6 d
  3. $db = $mongo->mf;% I$ M; }; X- e2 \- e# T
  4. $collection = $db->friend;
    " M% j; l( ?% t3 W) F
  5. $res = $collection->aggregate([
    % B# n. F2 H9 w( r. B
  6.     '$group' => [  l  B1 e2 U8 l
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组9 w8 R" \, l1 E2 g/ S& S" [5 [
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1) C) m' R" h* |: c# j8 [
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值
    ! a3 b4 g' n+ v
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值5 l' L3 @8 v8 Z2 P& m
  11.     ], s% @, f% c4 W( d0 z# h8 N/ b
  12. ]);
    + j$ u, E9 E, b" \  m3 K
  13. echo '<pre>';
    7 _" @/ l4 e4 V+ {1 S8 J+ Y
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果, o6 \7 D: J& b8 y% K8 ]' h$ B3 j1 d
  15. 1 x) t/ p4 y  g) A

  16. / s: S' z; u1 @* c
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序) \7 O; s& U( w# V% d, I
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。4 m" H% q7 C1 B7 c: F7 }% ^* H
  19. $mongo = new MongoClient('mongodb://localhost:27017');
    + P1 {) E7 `1 y0 K! {' [+ e
  20. $db = $mongo->mf;
    1 _( H4 r* u2 t1 L
  21. $collection = $db->friend;
    1 i% S7 h0 `- _+ `' K$ S( V' `4 l/ J; T
  22. $res = $collection->aggregate([
    0 Q( C6 C9 u, |' j3 o; |" h
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档
    + _  q. t" i0 b. a6 |
  24.         '$match' => ['Age' => ['$gt' => 30]]
    % H6 c2 p" ~/ R' T# J1 ^/ I
  25.     ],% k' S! P. D3 D/ t& B! ^! t6 ]
  26.     [//指定分组字段、统计字段% |& E9 y* f) f
  27.         '$group' => [
      G$ M! p; K/ L* C
  28.             '_id' => '$Address.Country',! L, }0 D2 t1 O) ?0 S% m. N
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和
    8 w+ N) X% l3 r( A) B, ~$ u& @, W
  30.         ]1 x$ L; h/ c, c  V+ s0 B
  31.     ],2 [$ g6 o. {3 o4 R5 ^; E
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档
    , r: t  P& C) @* q
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。5 d- J$ R. }% k" c  v3 S
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    - G/ o2 M0 ^' ^
  35.     ['$skip' => 2],//跳过指定数量的文档1 Z/ e5 R( p" P# l! P
  36.     ['$limit' => 2],//只返回指定数量的文档9 y! h8 I  K, z8 ]
  37.     ['$sort' => ['totalAge' => 1]]//排序! h1 N7 i! |  g. t# T! v6 ]
  38. ]);1 d- y3 U3 ~! _; {
  39. echo '<pre>';& k* x( [* e$ i$ i% ~
  40. print_r($res);
复制代码
& F% X$ c- {; n6 V( F& Y  V( w
三、数据修改
  1. //update()
    * y* p# ]2 |# O  g! m2 K; L* {
  2. //参数1:更新条件,指定更新的目标对象。* M+ q3 l3 `' I$ p
  3. //参数2:指定用于更新匹配记录的对象。
    " ]- u# l: X% J# W1 p
  4. //参数3:扩展选项组。( H2 j. L& I- r3 @5 F0 f
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。
    ; ?) B' M# k% }9 x
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。
    % H9 r  c: A6 F' q& B1 f0 |
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。0 ~5 W5 j/ `) z5 r" n
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    # u. Y* P8 D. A" c
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    4 `* z) B/ j, O; P
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间. V3 d. W' X$ N" h& J2 f" `: K
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    - z$ P* U! Y$ O. H
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。
    7 f. C: T$ s8 K& i# |
  13. 7 E6 U4 y# D. c7 _
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值
    8 [% G, z' ]- `" x
  15. $mongo = new MongoClient('mongodb://localhost:27017');  m1 A3 A# ]) @& `5 A" I
  16. $db = $mongo->mf;
    & @, ?$ L& s* }
  17. $collection = $db->friend;, Z) A' \. W' a+ {; E) m9 v$ o
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);4 o6 x2 c$ K, c1 b/ R, J( e9 [
  19. echo '<pre>';
    2 o4 W: H6 T* f% s# v
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量4 Z% q9 I0 x% E6 E' K
  21. ; ?; z- p  d7 H$ y* p) M
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    : ?; T$ `$ }6 ?& R
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    " W1 d4 i' o! @, k8 b2 }. K4 \: x
  24. 9 K( ^0 k5 R6 f9 [8 M: D
  25. //$unset:删除字段
    ) j4 S! i' p: \+ P& a
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);- ?3 f0 J' Y9 ]; [0 `# W

  27. 0 |. d0 F& G+ G0 H5 {5 g8 Z7 D( G3 i) r
  28. //$rename:重命名字段,若字段不存在则不进行任何操作+ Y  Q2 Y' D' I/ |
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    3 f' B+ C$ H( t& ?, p) B  h
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。
    3 c0 W3 |, z3 A
  31. , r; g$ A# z- d! x: e7 O' A
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的
    * q  K0 I. D  t0 T; {1 ]$ a  E
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    3 p8 @0 z4 H, _5 n& ]+ q

  34. 0 X- X4 V+ `; c8 j8 Z- z
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    , h, U& d; o4 c. w* r( Q
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);
    7 n, L0 E' y0 n6 U- n

  37. 3 \. s0 L: r0 |6 L
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    : M& q* A9 o% B% @, D( s
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);8 }3 F( t, e* r9 {. r8 x5 l  i
  40. " k# {" Y4 b8 T) O- J
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错# \; k! v: ]6 G% {2 k
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);" i1 j; {* ~8 W8 x( [1 A! P# F3 ]
  43. 9 J% g9 E$ a9 ~3 V& ]
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)! j  q4 }' m2 ?+ n' M0 u* I
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);4 S7 I7 d/ Z* y2 s; y
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ! j- V6 P4 _1 w2 a" _
  47. $ j& G# H/ h# t9 S! A2 ]
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)
    : j9 s1 }, V( l# \
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);/ M  @. o( O( I
  50. 9 \0 n+ S1 W% Y8 g5 H" Z3 K. x
  51. //$pull:删除数组中所有指定值
    4 v# l7 c. \5 R  `
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);
    ; u9 v! h( p! [
  53. & J* ?8 Q( g* n! p1 D, l
  54. //$pullAll:删除数组中多个元素的所有值
    & `, a  I! m" L; a5 ?3 a5 t( B/ T
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    6 `- [" `2 R) {& ]$ G5 c; L* ?' |
  2. //参数1:希望保存的信息数组7 x1 d4 j& f  `2 L& w2 e
  3. //参数2:扩展选项
    & V, C" X) T$ v% z! N6 t: |
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。& h; y) `6 z( t1 R0 a8 w
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作8 R  n5 {' Z- b( Q
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    2 b& d1 ~& |) X7 Q& [  L9 a" l1 }
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间7 E$ v/ V* z+ n
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    ( x# n( L1 K- ?! C9 p0 l" K( P
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。) m4 E$ `% G# p+ ^4 u/ N6 i
  10. //若想更新则应该在参数1中指定_id键的值。% K  V/ u/ d& j% B! E
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    - T, c/ `' Y8 M7 Q0 h* y
  12. $db = $mongo->mf;
    " x4 Y; G1 h; p+ D$ P
  13. $collection = $db->friend;
    0 R, s# E0 ]: ?+ |9 z! i$ {
  14. $doc = [//定义一个文档,即一个数组
    & _& p$ V& O% J  x3 a5 _
  15.     'First Name' => 'Jet',
      s! P/ `/ U0 K
  16.     'Last Name' => 'Wu',
    8 {- h% G  b7 i- T* C5 T
  17.     'Age' => 26,
      d" t# e: M# g1 U9 r
  18.     'Phone' => '110',4 @1 I$ r3 ]9 d2 }9 f, ?0 g
  19.     'Address' => [) c! i! I$ }' t- C7 D
  20.         'Country' => 'China',
    7 I) @) X9 k; [! ]; D% z2 ]
  21.         'City' => 'Shen Zhen'$ g, U! k3 A- c: m) l' p
  22.     ],
    7 u  H9 c. A5 l3 q4 r
  23.     'E-Mail' => [) X6 H  [$ F5 Z$ v! n7 Q- S0 A
  24.         '123456@qq.com',
    * G+ w' k" D& A, o0 [0 H
  25.         '666666@sina.com',
    / R* m6 t& q$ \$ d7 z% u
  26.         '8888888@qq.com',
    9 H7 b5 J; M, A
  27.         '77887788@qq.com'
    - y" n( ]* F- S  F! F
  28.     ]
      @5 \4 b# f% \- k* H) {
  29. ];
    ' m5 C! m3 L5 h$ [  o% G, e
  30. $res = $collection->save($doc);; @2 J/ T1 H- G% k
  31. echo '<pre>';2 V5 Q, j2 ^2 _7 c+ n, ?, @
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入/ O5 Q, c+ R4 E/ |

  33. 4 f8 ]5 U5 W  r% c/ P2 V
复制代码
  1. //findAndModify()
    ' K; @3 f3 n) c0 L9 U0 e! W
  2. //参数1:指定查询条件
    6 U8 A& G, w$ A0 D
  3. //参数2:指定用于更新文档的信息
    2 q! h' L* c8 g$ K9 W
  4. //参数3:可选,指定希望返回的字段; p( D% s# R7 P1 i0 Y0 E
  5. //参数4:扩展选项% t; I* J# Y, M, ~' o8 R, X1 Y
  6. //  sort:以特定顺序对匹配文档进行排序0 }( w1 r6 S0 i& S, T2 w
  7. //  remove:若设置为true,第一个匹配文档将被删除: X) \& n8 v) J- [8 X
  8. //  update:若设置为true,将在被选择的文档上执行更新操作: K( t7 z* b3 ~4 i# z% M2 L
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档
    * R, V( S7 [) q7 e# t* @( @
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档# f6 I2 ~* @" H
  11. $mongo = new MongoClient('mongodb://localhost:27017');+ M% t7 d% a4 m: ^
  12. $db = $mongo->mf;$ s& R9 F" J$ M: D1 O* E2 o
  13. $collection = $db->friend;
    6 i* k$ B! k* {) r
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);
      k6 z2 S& e& t
  15. echo '<pre>';
    * i5 u6 P" G: p$ w: m
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    5 c8 E( v. [9 f+ Q: M& B
  2. //参数1:查询条件
    + f+ d4 Z$ {  {; @, H
  3. //参数2:扩展选项
    # H: i) u" f  s
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    / o: K! T' j( r
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。9 N0 M9 A+ @1 ?3 ^/ }# P) D
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    $ M7 v# o# R8 p/ p* s' m! [5 J
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。% Y! z7 t3 C; H0 w( ~. s( H: M
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    2 B  y* @1 z$ W
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)  O3 ?) i6 S4 q
  10. $mongo = new MongoClient('mongodb://localhost:27017');1 ?5 c5 K: H$ J. i4 L
  11. $db = $mongo->mf;
    # R/ L# H( k, F& H
  12. $collection = $db->friend;
    - p2 M) H5 [3 `/ l& F: @' m
  13. $res = $collection->remove(['First Name' => 'jet']);& c7 h# ~$ A# F% A
  14. echo '<pre>';7 U5 |2 y8 j9 k/ K8 x& b& q; o# ?
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码

6 x- ^2 ^% z, A. x( D
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

0 ~0 O; ?2 A( G* l! R
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------
4 P( s4 a2 O) z
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    8 T; Z1 s1 q0 l9 S" T
  2. $bulk = new MongoDB\Driver\BulkWrite;+ B7 X% }6 Z  W" _
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);4 J* P: N/ m2 D
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    6 {' T2 z' q6 B
  5. ' v2 H% U* M4 g
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认7 C% {" }+ D& z8 A; [' A; t. g
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    ( @8 K0 T9 R0 B3 g3 i0 g
  8. echo '<pre>';. O0 _! Z- j' V8 p: N: L
  9. print_r($res);
复制代码

3 Z! C9 I. J9 x# @1 ^% k: l
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');+ h( D0 o$ ~! ?* m9 u* z$ [
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    , q0 g1 I- {. m! H: K8 T' B
  3. $cursor = $manager->executeQuery('wjt.friend', $query);( Q! h  B. H4 ]; H

  4. 0 |7 w9 D, e$ Y  p( y2 ^7 Y
  5. $data = [];5 z! w3 y0 e! S
  6. foreach($cursor as $doc) {
    7 T, L8 B2 H% E& I) w
  7.     $data[] = $doc;" n! G5 l5 n1 f. B4 W3 i7 F, F
  8. }
    ) }# T1 O" d/ z- j* W0 q
  9. echo '<pre>';
    5 b" Z" E: ~" `- Q8 L# @; d
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    4 }% X  R& J& n
  2. $bulk = new MongoDB\Driver\BulkWrite;
    5 P  w6 u, t" P5 X
  3. $bulk->update(
    & H$ c3 q5 S# V6 G6 c% }' I2 i$ [
  4.     ['name' => 'JetWu5'],& G: ?1 N' J0 v4 T' B4 ?8 e8 C
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]
    + E4 t: x* Y3 A$ b" D
  6. );
    8 g9 \5 `- r( s$ R: _* s1 ]8 ~+ `
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    , _) v% X* h1 Z! ?* K% i
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    . s) Y; S" s! v0 f/ s' w. C
  9. echo '<pre>';
    6 g9 k4 A9 M$ E" A) y+ |. [
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    % ^4 m4 F: t5 M8 }1 y
  2. $bulk = new MongoDB\Driver\BulkWrite;
    0 c7 @4 C0 g: K
  3. $bulk->delete(['name' => 'JetWu3']);+ n3 A' j+ @; Z) J+ ]
  4. $bulk->delete(['name' => 'JetWu4']);( B5 z0 J" g5 G: k  Y0 U
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认8 b9 k3 N1 p8 a2 y+ s) T( Y
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    & G6 Y5 ^) [' N# o9 D" ?4 h3 l* p
  7. echo '<pre>';
    + {7 L. O% Z" U: h* i' C2 g
  8. print_r($res);
复制代码

0 M. s0 j) a6 E" K. _; s6 d1 P( `
2 r" g# U! Y9 ]7 I* t0 o0 X4 i" J
% {. u! O6 o: d3 ]
6 |/ W9 ~5 l; w; |* j
. U1 w! b% p* P' K  s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 21:04 , Processed in 0.071245 second(s), 22 queries .

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