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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17614|回复: 0
打印 上一主题 下一主题

[php学习资料] 升级PHP7操作MongoDB

[复制链接]
跳转到指定楼层
楼主
发表于 2019-3-19 14:24:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储很方便。在 PHP5 及以前,官方提供了两个扩展,Mongo 和 MongoDB,其中 Mongo 是对以 MongoClient 等几个核心类为基础的类群进行操作,封装得很方便,所以基本上都会选择 Mongo 扩展。
详情请见官方手册:http://php.net/manual/zh/book...
但是随着 PHP5 升级到 PHP7,官方不再支持 Mongo 扩展,只支持 MongoDB,而 PHP7 的性能提升巨大,让人无法割舍,所以怎么把 Mongo 替换成 MongoDB 成为了一个亟待解决的问题。MongoDB 引入了命名空间,但是功能封装非常差,如果非要用原生的扩展,几乎意味着写原生的 Mongo 语句。这种想法很违背 ORM 简化 DB IO 操作带来的语法问题而专注逻辑优化的思路。
详情也可参见官方手册:http://php.net/manual/zh/set....
在这种情况之下,MongoDB 官方忍不住了,为了方便使用,增加市场占有率,推出了基于MongoDB 扩展的库:https://github.com/mongodb/mo...
该库的详细文档见:https://docs.mongodb.com/php-...
MongoDB 驱动
如果使用原驱动的话,大致语法如下:
  1. <?php
    0 S0 y  }3 V# ^" N) }

  2. ) d2 I% M1 q6 v" s
  3. use MongoDB\Driver\Manager;
    # m- d* H% d, r2 ?4 ]) b
  4. use MongoDB\Driver\BulkWrite;. i: w% A1 _" u) z( p, {+ `8 \. z+ j
  5. use MongoDB\Driver\WriteConcern;
    5 N- |7 |, V4 g% p
  6. use MongoDB\Driver\Query;
    6 |8 g& s" }8 a/ x* q7 v" n) q: ~
  7. use MongoDB\Driver\Command;' W1 ~9 m2 O0 Q( w

  8. : D' q5 l% B7 Y7 Z
  9. class MongoDb {& H2 m) @# M. ~' Q) }! Q

  10. 9 y  F# d" f! f9 H; A. J% y
  11.     protected $mongodb;* J  v# h9 f- y2 _" ^* l
  12.     protected $database;. `$ D5 d0 v' A; t+ R8 u% _
  13.     protected $collection;
    ; ~$ ]4 E+ T3 u# ]. l% X  `
  14.     protected $bulk;( W' S8 C- w; o2 Q3 B. g4 M* K
  15.     protected $writeConcern;$ _5 w6 v- b2 Z9 R1 _( g; ^# a
  16.     protected $defaultConfig0 U; U1 `$ S) r8 Y8 X8 b4 r
  17.         = [
    8 K7 w% B+ K9 I, c% H
  18.             'hostname' => 'localhost',3 [6 \  c  T# |: A) u
  19.             'port' => '27017',
    / l& ^" ~6 u. }5 o' @2 B
  20.             'username' => '',
    8 O. i7 m- i2 m
  21.             'password' => ''," ^2 z/ M$ g9 l3 L1 ^/ d6 V
  22.             'database' => 'test'
    7 x3 r. Y7 ?& L9 p; _3 E
  23.         ];6 I4 @! x4 u. r

  24. . ^# @: O8 G3 ^& u% h( T! x
  25.     public function __construct($config) {
    # o5 N, v$ H4 H9 D
  26.         $config = array_merge($this->defaultConfig, $config);
    % m  ?2 D2 R6 }$ S# ]6 y
  27.         $mongoServer = "mongodb://";/ L# I8 `: e1 Z; a8 r  R! l
  28.         if ($config['username']) {
    " j/ X7 ^" V$ P9 h3 ?1 Y  }
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    ! Y" f# f' ]6 t% p' A
  30.         }
    5 e4 e1 C0 d1 f6 x2 H# ~
  31.         $mongoServer .= $config['hostname'];
    5 d2 l3 A/ a, ^3 B
  32.         if ($config['port']) {
    " M2 x+ _$ [3 F" t& K. q/ i
  33.             $mongoServer .= ':' . $config['port'];1 }; g: G1 c. U0 b  @9 X* Y
  34.         }
    & N  e" ~0 Z5 M7 m, C4 S( k3 Y' u' c
  35.         $mongoServer .= '/' . $config['database'];9 U3 ]& s4 O. x+ ^

  36. ! A; Q5 r9 e- H3 q# i: V
  37.         $this->mongodb = new Manager($mongoServer);6 ?6 t8 j( ?! k4 B
  38.         $this->database = $config['database'];
    # `. h1 _0 K% m: U, F; W8 y4 k
  39.         $this->collection = $config['collection'];
    * W' C! _% q  _, }$ W# N
  40.         $this->bulk = new BulkWrite();* ]6 z3 P1 [' z( A
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    ' g" U4 |6 A/ I! y6 W9 A8 X
  42.     }. ?) T& K& e& B6 D, y" C6 a! b; Q

  43. + J  t$ Y9 _- Y
  44.     public function query($where = [], $option = []) {7 b$ Z6 ^4 L5 L+ [4 W8 k$ Z
  45.         $query = new Query($where, $option);( G2 W' w0 f$ N8 M  {
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);& d: B* n" k+ G" k' C* X

  47. / y+ O9 j* @; i0 A  z( x, V
  48.         return json_encode($result);
    6 X1 }4 H" K8 G/ t
  49.     }6 g: j0 V( _) Y7 ?7 I
  50. $ Y0 r! q0 p& b* E* {$ T
  51.     public function count($where = []) {4 W8 q" z; j7 Z- d) j% {" C
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    6 i1 e! B" D: M7 E$ Q$ [
  53.         $result = $this->mongodb->executeCommand($this->database, $command);& Z" [- J5 L- F$ n
  54.         $res = $result->toArray();
    : P+ T5 G+ }% g  i% m
  55.         $count = 0;
    . E' Q* i$ u  k8 t+ y) Z, X9 w0 G
  56.         if ($res) {
    3 d/ h9 ~2 t3 ]
  57.             $count = $res[0]->n;
    & ?% Z- N  u1 ~4 J, l3 R
  58.         }, \2 Q( {1 A$ a- j1 x& n: \
  59. + w6 C9 \; N1 l
  60.         return $count;
    6 V$ J, w9 G2 Y* H& j
  61.     }% F0 o2 }; S2 k& k6 b# M

  62. + u" Q1 G; `' [
  63.     public function update($where = [], $update = [], $upsert = false) {7 l" F5 P. V& w! h
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
      p9 ^6 S; u& \
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);1 ^$ r6 \" o0 O* i6 B/ p
  66. % S, n) Q% Z" |( r
  67.         return $result->getModifiedCount();
    ; }9 o3 Z; E" n) F" F
  68.     }
    . i, w" q5 _$ D' P* K/ r% i
  69. + Z5 Q' J" l. c, N8 `( v
  70.     public function insert($data = []) {0 `2 `6 M# f: [* m. B0 s# }
  71.         $this->bulk->insert($data);; o3 w  p5 p& V6 u8 q5 q
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);% P2 N" c( w7 R! }! X1 @1 @

  73. . n: a3 |3 H5 ~3 W  a
  74.         return $result->getInsertedCount();
    * \- e, m* E- N# W
  75.     }
    # c* x" H. [' o8 ^7 H" t: h
  76. 6 P5 L$ Y" O: x  z
  77.     public function delete($where = [], $limit = 1) {1 I$ h5 O. H" o) n% I8 d% ^, N
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    - }. ?- S* s% Y7 A$ ?
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);3 P$ h# H7 s$ Y  W2 C

  80. ) [- \: O3 B: w& f- u6 m$ S  N
  81.         return $result->getDeletedCount();
    ' P* Y8 N8 O4 C( w/ [( b7 k- H
  82.     }
    ! V3 p8 N3 h9 w; z. W
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • & W  a, P( D2 J
  1. new MongoClient();
复制代码
  • ( `2 M, n% t1 F
  1. new MongoDB\Client();
复制代码
2.新增
  • ) \/ D2 W4 ]+ g+ d5 g
  1. $collention->insert($array, $options);
复制代码

  • ; G6 ]" f- e8 _; b
  1. $resultOne = $collention->insertOne($array, $options);//单
    - H, Z+ s4 P+ S' g  a
  2. $lastId = $resultOne->getInsertedId();: r  h5 ^6 l5 @' r2 `
  3. $resultMany = $collention->insertMany($array, $options);//多! }4 P' f3 O8 ~' y) M+ ]
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • ; k& f5 e8 f5 a9 `
  1. $collention->update($condition, [8 p! k' _+ h+ B3 r* i! k: ?
  2.     '$set' => $values- X6 K) h7 f1 W% i* O1 }
  3. ,[7 z- p) i/ Y) _2 \. H8 e5 {
  4.     'multiple' => true//多条,单条false
    . F: `/ b2 V5 w' {: y
  5. ]);
复制代码

  • ( e1 F( H) ^0 D2 S) o1 N4 L
  1. $collection->updateOne(
    , P9 n# m2 i8 a& j8 g0 R6 z; d. j* s
  2.     ['state' => 'ny'],9 q0 [# Y! `& `2 t
  3.     ['$set' => ['country' => 'us']]
    , M+ r( |' y4 Q5 o2 z% I2 F
  4. );* g1 ]/ y" I4 L2 I' |
  5. $updateResult = $collection->updateMany(
    : Z% c& B' Q0 F5 C  n
  6.     ['state' => 'ny'],4 `: Q9 r/ R8 z$ Q
  7.     ['$set' => ['country' => 'us']]
    0 k: {$ b+ y  V( ^# T. d
  8. );
    1 d9 s# z: X0 o
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • - ~8 U" j' D9 w3 m
  1. $cursor = $collection->find($condition, [7 @4 f: l. Q# x4 v1 o+ w/ P
  2.     'name' => true//指定字段, t4 `% N( M* k& e4 {
  3. ]);6 q2 T6 h; n* ^/ F" \& e
  4. $cursor->skip(5);
    5 y4 h/ k( |; o1 ^+ z3 J: N0 c
  5. $cursor->limit(5);" Q5 d8 n; R% _4 b
  6. $cursor->sort([
    * ]7 K% H( g% J3 J5 x- t0 t! U
  7.     'time' => -1
    * ]0 M. D" o# k+ g$ a2 E
  8. ]);
复制代码
  • , A* b9 g( L. |1 Y, \
  1. $cursor = $collection->find($condition, [
    ) c" }! u+ E# g7 a, _* `, V9 Q, r
  2.     'skip' => 5,. v; ^% E* |* K3 h+ V
  3.     'limit' => 5,! }; N8 W! ]6 ~/ T& B7 R' J
  4.     'sort' => [
    1 Y) J) [) ^* D& a$ P
  5.         'time' => -1
    7 j! s; s! h  c) ~2 z& ~' X! s6 |
  6.     ],//排序
    & s: l, q9 M# ^& j4 l, ]
  7.     'projection' => [# V6 B) ^4 e& P8 P3 s
  8.         'name' => 1//指定字段
    . L+ N# J* y! m& d3 k: A
  9.     ]
    ; B1 h& f1 s6 @: g
  10. ]);
复制代码
5.删除

  • $ Y3 o' Y+ `* I
  1. $collention->remove($condition, [- @: ^# Y  I% t8 {
  2.     'justOne' => false//删单条
    " S$ f% Z6 z! f3 _. w1 x
  3. ]);
    4 D) V; D9 F* \9 G* v
  4. $collention->remove([]);//删所有
复制代码
  • & m8 u6 ]+ e* q$ J1 i) a% H) y
  1. $result = $collention->deleteOne($condition, $options);/ T' J6 U. Q1 F1 t+ O0 |
  2. $collention->deleteMany($condition, $options);
    2 X5 r: F0 C# ]3 R4 r; H

  3. . g. V- y: ^: k
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    0 D( r+ {4 i) T: o) y
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    5 P- i( v: B2 Q& d$ A' a/ F* @
  3. ], [
    % `7 {6 d! C0 R0 O
  4.     '$inc' => ['id' => 1]//自增) d. Y, y/ |6 B+ i% L0 d8 _
  5. ], [
    - m8 o  W. O7 f2 H, |  [, g* G# P
  6.     '_id' => 0
    # r$ S( z. C5 k9 k2 v* K
  7. ], [
    1 J1 q  \* x4 K* Q  V/ o
  8.     'new' => 1//返回修改后的结果,默认是修改前的& x9 `0 Z& C/ r" j. `
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    . f  z+ C, V0 Q. N# ?' w
  2.     '_id' => $tableName
    & J; u/ J9 v! ~' u) O# p, l
  3. ], [
    $ C; y) A& O: K& f$ F0 G
  4.     '$inc' => ['id' => 1]( r: K7 R% ?/ f
  5. ], [! z- d: @) W8 _1 g1 o
  6.     'projection' => ['id' => 1],9 X% J0 T5 z: P& U& }2 O
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER; _' g7 `. G) ~4 @5 A
  8. ]);
复制代码
: e$ }) ^+ I5 V

6 @5 b; f; o, d3 t4 {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:19 , Processed in 0.053746 second(s), 20 queries .

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