cncml手绘网

标题: PHP操作MongoDB(增删改查)php7.0以下 [打印本页]

作者: admin    时间: 2019-3-5 13:50
标题: PHP操作MongoDB(增删改查)php7.0以下
  MongoDB的PHP驱动提供了一些核心类来操作MongoDB,总的来说MongoDB命令行中有的功能,它都可以实现,而且参数的格式基本相似。PHP7以前的版本和PHP7之后的版本对MongoDB的操作有所不同,本文主要以PHP7以前版本为例讲解PHP对MongoDB的各种操作,最后再简单说明一下PHP7以后版本对MongoDB的操作。
一、数据插入
  1. //insert()" j- f- I8 G- R' O2 o5 D
  2. //参数1:一个数组或对象4 i+ T5 A0 J' u9 P# b6 y
  3. //参数2:扩展选项  I* G/ q  t6 k5 |+ e* S, `
  4. //  fsync:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入硬盘/ _: W  I# a% W3 k/ x; X
  5. //  j:默认为false,若为true则mongo在确认数据插入成功之前将会强制把数据写入日志( O1 B5 e" h- Q3 v% K; @1 _' k
  6. //  w:默认为1,写操作会被(主)服务器确认,若为0则将不会得到确认,使用复制集时设置为n用于确保主服务器将数据修改成功复制到n个节点后再确认
    - S0 E: ~/ g, U( f+ Y/ u3 |/ [$ a
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间- j" j2 j( c& E
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)& b1 F1 [* {' r0 r4 C) M
  9. $mongo = new MongoClient('mongodb://localhost:27017');
    8 x2 X1 F' X7 g' x  F: H  w- `
  10. $db = $mongo->mf;//选择数据库
    4 }: O3 t$ q% f/ J+ P; J3 b
  11. $collection = $db->friend;//选择文档集合
    ! G5 o8 \  E; ~1 p2 ~
  12. $doc = [//定义一个文档,即一个数组
    / |  l5 w/ n5 i4 y
  13.     'First Name' => 'Jet',3 N7 S0 L8 Y1 i( b/ I% T2 M
  14.     'Last Name' => 'Wu',
    9 W: V! \+ v1 h2 u
  15.     'Age' => 26,
    ! q& E! O' r3 G, {6 \; a/ H6 n( r8 p
  16.     'Phone' => '110',
    6 A) P2 x8 a! V% D" a) R8 s
  17.     'Address' => [
    & J* z% P' i+ [; _" L8 \
  18.         'Country' => 'China',! X+ ], @# A) ^  c3 Z
  19.         'City' => 'Shen Zhen'; V% \7 ]4 `, d1 G& E/ l1 H4 \3 n
  20.     ],& V9 ?# }- j/ d$ s9 {
  21.     'E-Mail' => [: ^8 v4 y  U* K4 G) l5 c
  22.         '123456@qq.com',
    9 V0 g9 |4 H2 S; R% t
  23.         '666666@sina.com',- N& @. |! z) |/ d1 `
  24.         '8888888@qq.com',
    0 H. U* D" J+ I0 o
  25.         '77887788@qq.com'$ m) _6 ~5 E& t9 `
  26.     ]' \  ~. O! z" f6 L( h% ^5 j. x! t
  27. ];
    1 c8 I. p1 C" S- f) B; @
  28. $res = $collection->insert($doc);//向集合中插入一个文档
    4 K! t" e9 r( E1 p% S. o$ H$ ]
  29. echo '<pre>';
    3 l, B( v, h2 z; s
  30. print_r($res);//$res['ok']=1表示插入成功
复制代码
二、数据查询
1. 查询单个文档:
  1. //findOne(). b8 ]* a- v: _3 L9 T1 l
  2. //参数1:搜索条件: ]4 d) _# u# D
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非在第二个参数显式加入'_id'=>false。不设置则返回所有字段( W) F: i8 V- Q1 f8 \
  4. $mongo = new MongoClient('mongodb://localhost:27017');
    3 D& R+ z6 d" S! _" R5 q
  5. $db = $mongo->mf;3 e& g5 Y- X% c* i
  6. $collection = $db->friend;+ Q3 v) `2 f; K) E4 s7 c+ Q1 ?9 C8 [1 j
  7. $one = $collection->findOne(['First Name' => 'Jet']);' q" J, @' |8 h* \
  8. echo '<pre>';( q7 W) Y) ]' m( X$ W) F4 Y
  9. print_r($one);//返回一个数组,查不到数据则返回NULL
复制代码
2. 查询多个文档:
  1. //find()
    5 }6 E* b2 R( u+ n: ]
  2. //参数1:搜索条件, p' @& q6 |* K* j) E
  3. //参数2:指定返回字段,array('fieldname' => true, 'fieldname2' => true)。_id字段总会返回,除非显式设置为false不返回。不设置则返回所有字段5 G7 q% s6 X$ ~  J# h5 o
  4. $mongo = new MongoClient('mongodb://localhost:27017');/ {9 r% n1 r% Y6 r6 J( y$ G/ Q
  5. $db = $mongo->mf;, H9 p" R, j* E( A' z  ^* o
  6. $collection = $db->friend;
    : ]% U$ U1 t( b
  7. $cursor = $collection->find(['Address.Country' => 'China']);//使用点操作符查找数组元素# c1 ~- z! }3 M- T( m, {" ]
  8. echo '<pre>';4 N7 F9 l/ M' n# ?# O# Y
  9. while($doc = $cursor->getNext()) {//循环读取每个匹配的文档' f8 x2 V# b% R, B- j! n
  10.     print_r($doc);# I. h. l/ H5 t# Z% g4 o& O
  11. }
复制代码
使用各种条件操作符定义查询:
  1. //mongodb分别使用$lt(小于)、$lte(下雨等于)、$eq(等于)、$gte(大于等于)、$gt(大于)、$ne(不等于)表示<、<=、=、>=、>、<>,用于整数字段查询' H; x8 w. w8 s& X) F
  2. $mongo = new MongoClient('mongodb://localhost:27017');
    ; P$ N7 W4 ^+ ^; C0 ~  V" X, y
  3. $db = $mongo->mf;
    5 F6 C0 i4 ?, F, A3 \
  4. $collection = $db->friend;' O% c2 w- i) Z- p6 ?* D
  5. $cursor = $collection->find(['Age' => ['$gt' => 30]]);$ P  C8 M* Q0 ~4 }
  6. echo '<pre>';
    ! f6 D& d! b; I1 J! Q
  7. while($doc = $cursor->getNext()) {3 q  m# e# ]. t' E5 ^3 _
  8.     print_r($doc);! g& D, p- r, G' ?3 f2 g
  9. }
复制代码
  //查询某个字段的所有不重复的值
8 v  e; z  ?/ `: m& u  $res = $collection->distinct('Age');
  1. //$in:匹配多个值中任意一个4 y! J9 ~+ v& N6 g& s. ^
  2. $cursor = $collection->find(['Address.Country' => ['$in' => ['China', 'USA']]]);8 A8 l/ \; {9 X$ I, t0 h

  3. ' g/ M& E2 l; P" ~, q" f1 O. H
  4. //$all:匹配多个值中所有值(用于数组字段查询)* O: S$ u2 L# Q5 `$ x/ m" L
  5. $cursor = $collection->find(['E-Mail' => ['$all' => ['123456@qq.com', '77887788@qq.com']]]);* r( Q* e9 M) T& ~. X6 D3 b
  6. + q" H! V( X' c& o
  7. //$or:或查询
    - j; B/ r$ ^3 C$ o6 s9 v3 R6 _
  8. $cursor = $collection->find(['$or' => [['First Name' => 'Jet'], ['Address.Country' => 'USA']]]);
    : E: m% p2 o0 g; O" ?' s' K

  9. 6 V4 ^" [. A7 T; J
  10. //$slice:获取数组字段中指定数目的元素,位于find()函数第二个参数中8 w0 P. K; n. H
  11. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => 2]]);//只返回前两个email- y3 c1 f% [& ^( m4 H
  12. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => -2]]);//只返回最后两个email5 R! |6 {9 M* ]6 q1 u
  13. $cursor = $collection->find(['First Name' => 'Jet'], ['E-Mail' => ['$slice' => [1, 2]]]);//忽略第一个,返回接下来两个* b- u( H" O7 V; a1 ?4 D

  14. ! s# z5 h9 o: C4 u3 o! w, O
  15. //$exists:根据某个字段是否有设置值进行查询
    $ Y. g$ d) x3 p7 `
  16. $cursor = $collection->find(['Hobby' => ['$exists' => false]]);//查找Hobby字段未设置值的文档
      W+ l" F# y: Z" I
  17. 1 ~7 Y# \- b+ \1 r& k. ?8 c
  18. //正则表达式查询5 g6 x' a; D9 e, Y
  19. $cursor = $collection->find(['First Name' => new MongoRegex('/^Je/i')]);//查找First Name字段以Je开头的文档,忽略大小写差异
复制代码
使用MongoCursor类提供的其他函数:
  1. //排序:1升序,-1降序7 _4 s3 T) a- D
  2. $cursor->sort(['Age' => 1]);. z' U  d8 f4 I4 \) Q; ?

  3.   j8 `$ ?7 ]& K' {. K) E  ^7 J, i
  4. //忽略前n个匹配的文档
    + E" P: R; ?- P* O3 J. r. F
  5. $cursor->skip(1);* v' M. `% g/ @) a; W3 d4 G

  6. / K  P  ]- E1 ^$ ^8 u% ]& c0 p
  7. //只返回前n个匹配的文档(limit()与skip()结合使用可实现数据分页功能)
    1 o" C0 {6 n' b' h. V. ^% n% n8 I
  8. $cursor->limit(1);
    . F5 [8 ?: h& I+ `
  9. 5 Q- I8 V* X( s8 [0 ^: g* z- _
  10. //匹配文档的总数% U0 L) u% u0 y2 U
  11. $cursor->count();2 A  ^& D% y  k. j9 \+ ]( c

  12. / q/ |% ]. q4 P% X+ a0 A) |
  13. //指定查询索引
    6 N6 \% @2 F. K9 a3 X) N
  14. $cursor->hint(['Last Name' => -1]);//若索引不存在则会报错
复制代码
聚集查询:对数据进行分组统计
  1. //聚合查询:对数据进行分组统计* I* d) ]; X% N
  2. $mongo = new MongoClient('mongodb://localhost:27017');; z# \( |' A9 u$ v( ~2 |- R
  3. $db = $mongo->mf;
    , G  l: V2 ~2 C9 K4 j8 F: f
  4. $collection = $db->friend;
    $ Z" i" b& s" w9 P% q6 g2 H
  5. $res = $collection->aggregate([5 m# h  A8 D0 r+ i# B% S
  6.     '$group' => [
    $ E4 p* s$ `- V$ E) Z
  7.         '_id' => '$Address.Country',//分组字段,注意要加上“$”,这里是根据数组字段某个元素值进行分组
    + d5 t1 l* }9 p
  8.         'total' => ['$sum' => 1],//求总和,表示每匹配一个文档总和就加1% i  h' W5 e* C# Q, Q& E
  9.         'maxAge' => ['$max' => '$Age'],//分组中Age字段最大值6 K' X/ p) ?! K- }+ U/ W
  10.         'minAge' => ['$min' => '$Age']//分组中Age字段最小值
    ' \* A. t7 ^; f  [5 e5 w# k+ c' t" q
  11.     ]
    : C) \7 W, w% @6 v
  12. ]);
    + G; C% Z4 Q. D+ A( n: H+ e
  13. echo '<pre>';
    + d' }; Z& {7 K+ y
  14. print_r($res);//返回一个数组,$ret['result']为数组,存放统计结果! I  \* `: o2 Z* O, q6 Y) ?' y+ g7 R

  15. . {" |* y; k- V, C7 ]% ?. i8 S6 X
  16. . u) @# T) E  k' P% b
  17. //存在其它操作的聚合查询:多个操作之间执行先后顺序取决于它们位置的先后顺序, m( g+ {2 S; }9 M. j5 c$ C$ b
  18. //聚合查询中的所有操作,包括'$group'在内,都是可选的。
      b( `  {+ n6 H% T+ n' a
  19. $mongo = new MongoClient('mongodb://localhost:27017');; C4 X$ s# S, F( l/ @8 P
  20. $db = $mongo->mf;
    ' R$ J9 m# a8 z* h( `2 }$ G
  21. $collection = $db->friend;
    / u8 Q4 h! X0 N# K
  22. $res = $collection->aggregate([
    8 z3 D# M- C: x, c8 e$ k5 b! i* {
  23.     [//过滤条件:只对符合条件的原始文档进行聚合运算,若是放在'$group'之后则是只返回符合条件的结果文档9 Y+ O0 U0 D3 e# K. {' N
  24.         '$match' => ['Age' => ['$gt' => 30]]
    8 D& }- t' c. i9 ]2 ^  o% U9 K; V( }  q
  25.     ],1 c2 q% x+ r3 d8 H6 V8 A
  26.     [//指定分组字段、统计字段
    % u- m! r% F3 ~) T5 c: d% w4 c
  27.         '$group' => [* D2 G5 y, n( _* n. ]3 o
  28.             '_id' => '$Address.Country',: u5 v) @" U% n: N- N( x
  29.             'totalAge' => ['$sum' => '$Age']//计算各个分组Age字段总和. K( T6 Q" f9 r7 }
  30.         ]  u% I! f! S5 }
  31.     ],# \$ m* j6 W) ]+ J
  32.     //以下操作若是放在'$group'之前则在聚合前作用于原始文档,若放在'$group'之后则在聚合后作用于结果文档! j: w  }% B2 x$ w' i4 `' V
  33.     ['$unwind' => '$E-Mail'],//将包含有某个数组类型字段的文档拆分成多个文档,每个文档的同名字段的值为数组中的一个值。) o" h# b3 f0 ^$ `& C8 {
  34.     ['$project' => ['myAge' => '$Age', 'First Name' => '$First Name']],//指定返回字段,可以对字段进行重命名,格式:返回字段名 => $原来字段名
    7 |1 y0 O; J4 @9 A7 M! r) `5 T( x
  35.     ['$skip' => 2],//跳过指定数量的文档, H- Y+ u  y+ s4 l- z; a
  36.     ['$limit' => 2],//只返回指定数量的文档
    2 N1 h2 D4 z/ c8 p. U) B
  37.     ['$sort' => ['totalAge' => 1]]//排序4 N  @* {+ ~. I, t9 \8 ^) s
  38. ]);
    % A9 s9 a; t3 Z% i' e- U
  39. echo '<pre>';4 M5 Z4 Q8 @0 k1 u& d9 r# e1 R
  40. print_r($res);
复制代码

; H- a8 Z6 F! p" @7 W6 G" s0 F. V
三、数据修改
  1. //update()
    & H" m" |/ s; t8 T, Z0 H0 h& i
  2. //参数1:更新条件,指定更新的目标对象。
    + A; G$ X% c$ P$ {0 d6 U
  3. //参数2:指定用于更新匹配记录的对象。
    + H, h/ L: x  J& \% L" h
  4. //参数3:扩展选项组。
    3 ]3 W: R" a% F; W
  5. //  upsert:若设置为true,当没有匹配文档的时候会创建一个新的文档。: O/ d. v. @+ {8 ?
  6. //  multiple:默认为false,若设置为true,匹配文档将全部被更新。* D; u/ a6 m8 J7 P, L! a( z1 Q
  7. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    : z. G; }/ M; V6 o4 |
  8. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作
    . v! D* y0 @6 \' u$ {  y* e
  9. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    ! j7 d' b9 C! [* f7 x3 `
  10. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间+ L" U& S" Y. U! A& y
  11. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)
    4 c; y1 w6 E% v" Q' X; O4 ]
  12. //注意:若不使用任何修改操作符,则匹配文档将直接被整个替换为参数2指定的对象。6 S2 _# G3 Z. s4 [9 t+ ^. {1 v

  13. + f: V1 P  i  F5 ~* H
  14. //$inc:增加特定键的值,若字段不存在则新建字段并赋值- t. b6 o0 \& U/ ^( O2 ]7 X0 X# h1 `/ s
  15. $mongo = new MongoClient('mongodb://localhost:27017');
    $ a7 X0 T; @# H
  16. $db = $mongo->mf;( C0 y, J' V8 D) b- ^+ c( ^
  17. $collection = $db->friend;6 V" _# H  h9 X6 v4 H/ C, h
  18. $res = $collection->update(['First Name' => 'Jet'], ['$inc' => ['Age' => 2]]);4 _- f% B+ A) Q+ K
  19. echo '<pre>';
    1 E7 f  a! g# S+ r/ v( G9 g2 f; v
  20. print_r($res);//$res['ok']=1表示修改成功,$res['nModified']表示修改的文档数量
    / P/ _- R! `0 K
  21. * _4 c7 B0 r* M$ H% X5 {
  22. //$set:重置特定键的值,若字段不存在则新建字段并赋值
    , z5 k1 K- Q* D: p6 i5 m
  23. $res = $collection->update(['First Name' => 'Jet'], ['$set' => ['Hobby' => 'pingpong']]);
    4 k* \; O/ X! \% S4 @' l1 C  O
  24. ! k. O/ f1 K$ g) U2 k
  25. //$unset:删除字段2 ~* V) p% z6 a1 e% x
  26. $res = $collection->update(['First Name' => 'Jet'], ['$unset' => ['Hobby' => 1]]);; _6 H+ w0 J5 h/ Q" p$ o

  27. * T1 ]3 h2 _0 M$ V
  28. //$rename:重命名字段,若字段不存在则不进行任何操作! ^, y! h! T2 {( ^5 p! v
  29. $res = $collection->update(['First Name' => 'Jet'], ['$rename' => ['Hobby' => 'hobby', 'Age' => 'age']]);
    - R2 o$ J3 F4 F2 R
  30. //注意:如果文档中已经使用了指定名称的字段,则该字段将会被删除,然后再进行重命名操作。& ]" O. }- W' }  l$ U' N' |. l; v
  31. + T9 @( r, k( ]; Q) w9 o
  32. //$setOnInsert:设置了upsert为true,并且发生了插入操作的时候,将某个字段设置为特定的' m0 l3 \. b4 g7 u; O: I
  33. $res = $collection->update(['First Name' => 'jet'], ['$setOnInsert' => ['lang' => 'English']], ['upsert' => true]);
    ' Z$ k- k& j( x! x) V

  34. ! ^( ]/ \4 f4 I3 p% J0 `
  35. //$push:向指定字段添加一个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    7 ?& M% y/ C$ \/ Q" J& n# `
  36. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '123123@qq.com']]);' `9 M8 k4 }- g$ b
  37. 2 u5 e3 M9 L$ w& s; S' [& B9 a( j
  38. //$push:向指定字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    5 h& w! |! ]' \* x1 i6 \6 c
  39. $res = $collection->update(['First Name' => 'Jet'], ['$pushAll' => ['E-Mail' => ['666@qq.com', '8888888@qq.com']]]);; f3 i% O$ `! F) h- p

  40. & B8 S( _0 i4 J% \0 Y
  41. //使用$push和$each向某个字段添加多个值(作用于数组字段),若字段不存在会先创建字段,若字段值不是数组会报错
    5 j/ B; B/ M. G3 ?" I' j* [/ v
  42. $res = $collection->update(['First Name' => 'Jet'], ['$push' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    " z- \5 f. H/ w' k2 ^
  43. . U0 ?! H: }2 c, r3 t1 d. {1 a
  44. //$addToSet:将数据添加到数组中(只在目标数组没有该数据的时候才将数据添加到数组中)
    0 E8 \: a! L! h
  45. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => '123123@qq.com']]);
    / y+ P, S9 W# X8 B% o  O  C
  46. $res = $collection->update(['First Name' => 'Jet'], ['$addToSet' => ['E-Mail' => ['$each' => ['123123@qq.com', '666@qq.com']]]]);
    ) g( d5 ^/ C4 ~6 ~5 d+ P, s
  47. . }- @, W$ i/ u7 f$ B. P$ h3 X
  48. //$pop:从数组中删除一个元素,-1表示删除第一个元素,1表示删除最后一个元素(其实负数都删除第一个元素,0或正数都删除最后一个元素)# M4 J2 |7 B  n) U$ i5 V& V
  49. $res = $collection->update(['First Name' => 'Jet'], ['$pop' => ['E-Mail' => 1]]);
    - y! f( Y6 X: r) F2 W
  50. , ^$ x2 z! {8 z  z
  51. //$pull:删除数组中所有指定值
    & z: n# F( S3 F& m5 \. M- X
  52. $res = $collection->update(['First Name' => 'Jet'], ['$pull' => ['E-Mail' => '123123@qq.com']]);4 d) t* J3 T. X6 T

  53. 0 J' J1 v! [( N6 [8 q4 l
  54. //$pullAll:删除数组中多个元素的所有值
    ; _: m- D* I8 A) s. Q' r
  55. $res = $collection->update(['First Name' => 'Jet'], ['$pullAll' => ['E-Mail' => ['123123@qq.com', '666@qq.com']]]);
复制代码
  1. //save()
    , L+ h" L' x( h% b* _
  2. //参数1:希望保存的信息数组/ Q8 e* {; b' s. k* |
  3. //参数2:扩展选项
    ) v" b) A& Y: W  O9 |# M
  4. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    2 ]1 y! F" U6 C8 Z" w! P
  5. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作' t8 ^5 G6 Z5 z( c+ t
  6. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。8 F$ h  X5 O5 Z. C8 u; H
  7. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间
    $ S( ]# ]2 i+ _  i" L$ y7 }
  8. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)% w9 Q8 U1 y$ C+ f/ H
  9. //注意:若已存在则更新,若不存在则插入;更新时使用参数1指定的信息数组替换整个文档。4 C7 o# i5 s# A* v$ H* S
  10. //若想更新则应该在参数1中指定_id键的值。# B0 T7 C" t1 o6 w- S, c
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    . t5 t9 @3 X7 D7 Y
  12. $db = $mongo->mf;) K( b7 @1 p# G( D$ \
  13. $collection = $db->friend;
    ; ]$ G2 _6 o4 `! \0 `/ A
  14. $doc = [//定义一个文档,即一个数组9 @. R( }+ l; ?; Q: m
  15.     'First Name' => 'Jet',/ m  F& {7 N  a$ D  J6 F
  16.     'Last Name' => 'Wu',% A! O4 X; E8 Z* h6 C9 E0 z
  17.     'Age' => 26,
    1 A: y6 X& |6 @6 G2 E0 T) `
  18.     'Phone' => '110',
    $ I9 w! ^/ g% x6 J2 Y2 M; k4 x
  19.     'Address' => [  |! B& s" i- E$ l3 g: |% E
  20.         'Country' => 'China',8 Y3 u6 t+ a0 i) j5 v. M# j
  21.         'City' => 'Shen Zhen'
    . A( }8 N6 b$ |( L  _, X& E
  22.     ],
    ( X( c% Q3 `, s3 e
  23.     'E-Mail' => [
    + Z& p) q6 i+ e7 B! j7 z
  24.         '123456@qq.com',
    . ]1 [( y/ X& Z, W5 g. Q
  25.         '666666@sina.com'," f6 ]% P( ?( E! `  d
  26.         '8888888@qq.com',
    2 N1 J2 f; }" V2 P7 Z- r
  27.         '77887788@qq.com'
    ( C3 e+ q+ |) _4 E. r8 T8 ~; T
  28.     ]7 g; Y) O! S. l4 z6 U1 j: V5 k
  29. ];) A; e9 T2 b9 P, y3 k9 U: E) y$ U
  30. $res = $collection->save($doc);
    - j) ?2 K8 |* v. }5 Z( P. u# u
  31. echo '<pre>';
    5 p- a. g4 t6 F! z% G/ m
  32. print_r($res);//$res['ok']=1表示操作成功,$res['updatedExisting']=1表示更新,$res['upserted']=1表示插入
    ; e7 R+ A1 T' M' R
  33. + G5 G& ?* q* ~( z$ m
复制代码
  1. //findAndModify()2 J, f7 x: w6 M
  2. //参数1:指定查询条件
    # V; ~( d2 g2 ^5 u8 c
  3. //参数2:指定用于更新文档的信息
    : C$ X1 ^( }  z4 N2 x
  4. //参数3:可选,指定希望返回的字段, R9 |; G( G- F" H" U3 k$ ^! D
  5. //参数4:扩展选项& {# b( ?8 Q; c8 \) Y3 u4 R' Y
  6. //  sort:以特定顺序对匹配文档进行排序7 U& s5 T, P) f/ l8 }& p8 r3 |  D9 a- {
  7. //  remove:若设置为true,第一个匹配文档将被删除
    ; C" [" `4 n, Q0 j8 d% ~/ J
  8. //  update:若设置为true,将在被选择的文档上执行更新操作# o6 V4 q# o. [( C) L
  9. //  new:默认为false,若设置为true则返回更新后的文档,否则返回更新前的文档+ H' c+ ?1 [  a6 v8 ^: Z
  10. //  upsert:若设置为true,没有找到匹配文档的时候将插入一个新的文档- z) h+ H; p/ J
  11. $mongo = new MongoClient('mongodb://localhost:27017');
    4 g2 L9 f% r5 O8 M% o" v+ J+ _
  12. $db = $mongo->mf;
    % ~! U. Q, T2 w, i* a$ V
  13. $collection = $db->friend;
    ) _  c# R6 r9 M; T( r
  14. $res = $collection->findAndModify(['First Name' => 'Jet'], ['$push' => ['E-Mail' => '111@qq.com']]);& [% ^0 g1 q) J* n$ [8 }2 ^% x. B7 i
  15. echo '<pre>';
    0 Z/ W$ f- N, J$ l6 F7 R
  16. print_r($res);
复制代码
  
四、数据删除
  1. //remove()
    - z. C6 J6 ^  D
  2. //参数1:查询条件, _+ p* \" \! U; @, `+ E8 f1 ^
  3. //参数2:扩展选项
    * E# w2 _1 S3 b
  4. //  justOne:若设置为true,则最多只有一个匹配的文档将被删除
    2 ~# @  L5 l0 }8 G' b% G5 t6 ~2 c
  5. //  fsync:若设置为true,w参数将被覆盖为0,数据将在更新结果返回前同步到磁盘。
    ' @, K& @9 Z( N6 @- A+ R
  6. //  w:默认为1;若设置为0,更新操作将不会得到确认;使用复制集时可设置为n,确保主服务器在将修改复制到n个节点后才确认该更新操作- G' K( V5 g1 Y( b4 s
  7. //  j:默认为false,若设置为true,数据将在更新结果返回之前写入到日志中。
    * P' |% }0 Q: q0 o  F# U2 {: p
  8. //  wtimeout:默认为10000(毫秒),用于指定服务器等待接收确认的时间3 F5 v7 `( k9 W) P% |5 W0 c
  9. //  timeout:指定客户端需要等待服务器响应的超时时间(毫秒)2 p; d, ?; Q8 ~5 J, [8 S
  10. $mongo = new MongoClient('mongodb://localhost:27017');
    9 d8 o& z3 s% d& e7 I
  11. $db = $mongo->mf;
    2 C% H' W( X4 k  ^4 @
  12. $collection = $db->friend;
    & s+ t3 s' S* C0 r" y, }8 {
  13. $res = $collection->remove(['First Name' => 'jet']);' A' X, ^+ O* O$ K) L( i
  14. echo '<pre>';
    9 j* H) ^9 u3 R6 `  e4 Y4 `
  15. print_r($res);//$res['n']表示删除了几个文档
复制代码
7 S7 @+ U& j8 r; A& R% Y# L$ D
以上是PHP7以前版本的MongoDB操作,下面简单介绍PHP7以后版本的操作。

$ W& N+ O+ w0 j. a/ @
-----------------------------------------------PHP7分隔线---------------------------------------------------------------------

* b( Q0 j, O1 G; ~% ^, c9 G  Y
数据插入:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    ) e0 m. J' |& C; ~9 m6 v
  2. $bulk = new MongoDB\Driver\BulkWrite;
    6 y+ y/ H4 f: l& Q
  3. $bulk->insert(['name' => 'JetWu5', 'age' => 26]);
    0 D0 \# w" B( ^2 l# X7 ^8 f
  4. $bulk->insert(['name' => 'JetWu6', 'age' => 26]);
    * K7 f# R$ Y% |) G

  5. , J6 F/ p/ e. S! Y
  6. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认" Z2 j0 {/ G/ w5 `" F' `8 |7 k& H
  7. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
    " v! K- Q+ Y$ G& v& f( r% S, M
  8. echo '<pre>';6 u% R9 |. I+ I6 x2 ^
  9. print_r($res);
复制代码

2 `# x7 k9 S) E" k! d8 E
数据查询:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');$ Q! g( f( X" s' v. p9 q
  2. $query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
    # {( {0 F- J( K4 s. |. q# r; }
  3. $cursor = $manager->executeQuery('wjt.friend', $query);, e* Z2 s' c/ B/ p6 s/ a

  4. & _9 W% e# k1 y
  5. $data = [];
    0 v, w( P$ ~9 w; A6 y6 {* i
  6. foreach($cursor as $doc) {! F2 }- K1 Z1 X0 w
  7.     $data[] = $doc;
      V! T/ A( a* V+ ]! j, L: l1 K
  8. }& V2 a1 j0 N, f- y: }
  9. echo '<pre>';8 @" Y# v- y( P$ x# }* T
  10. print_r($data);
复制代码
  
数据修改:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');! e# ?) b. _: n7 z: B
  2. $bulk = new MongoDB\Driver\BulkWrite;
    + A' }% K. q$ F/ y7 F& D
  3. $bulk->update(
    6 Q6 b5 h3 G* t
  4.     ['name' => 'JetWu5'],$ b4 t2 l0 |! Y* m+ q2 j/ C6 E+ U
  5.     ['$set' => ['age' => 30, 'promise' => 'always smile!']]  L  g7 j) k0 O3 j; J! q# P2 f
  6. );
    - F2 G, [7 b* k
  7. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认9 ?# u9 m; J8 r$ [, K& q
  8. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);! b; l% H. Q  G& E& n
  9. echo '<pre>';
    : J4 `2 V2 E% A8 ^) M# y
  10. print_r($res);
复制代码
  
数据删除:
  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
    , G2 t) }4 \$ x) p7 l
  2. $bulk = new MongoDB\Driver\BulkWrite;
    4 H! a# G. D3 I/ p* Q. g
  3. $bulk->delete(['name' => 'JetWu3']);
    ( X0 v7 K% I7 u5 I& L& o
  4. $bulk->delete(['name' => 'JetWu4']);$ F2 b0 o/ _# w! ^) Q4 t( [- n
  5. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
    3 e; X2 T/ W7 n4 k- M8 e
  6. $res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);, s5 e) I% m& m) I% a% v/ ~
  7. echo '<pre>';; d. w% a& ]+ k/ C
  8. print_r($res);
复制代码

  E; d' p5 \! D; k1 t- K& e' m% r( ]$ ~: A  Z, H
. |% i* M3 @3 V( |. C) u" z
' z* y, i6 ]! p: c( p+ Z6 _

+ Z; x7 a' Q2 i& K2 k" Y1 Q




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2