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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11548|回复: 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
    " F; i% v! K# F- G
  2. , B6 _# A  t7 I5 i! `
  3. use MongoDB\Driver\Manager;3 \  A+ i* H! ]  L8 P* o4 V! q
  4. use MongoDB\Driver\BulkWrite;
    : t/ T, u& T2 ?" e
  5. use MongoDB\Driver\WriteConcern;
    ) G* ]! O1 S" B% p; \
  6. use MongoDB\Driver\Query;
    - h6 Y; d4 k7 X# ~; [/ g
  7. use MongoDB\Driver\Command;& x3 d; w0 d* f" p* K' O
  8. . C% h/ f( f/ F! U' H. S) |
  9. class MongoDb {0 C# ^( A, f! ~0 _- M. R

  10. ) o2 G! I5 b$ V/ R1 g( l" V* x$ L
  11.     protected $mongodb;
    8 H8 m, o& T  z* J6 ~* B
  12.     protected $database;' n& U4 a) r8 H) o: v. _3 x1 }$ E4 g
  13.     protected $collection;
      h- Y' m* v. F% i5 F
  14.     protected $bulk;
    . \0 M, n8 x- f( I$ T
  15.     protected $writeConcern;
    * F  |' F2 ^0 N& [& ]4 w3 E
  16.     protected $defaultConfig, g+ B. k. B5 Z
  17.         = [1 b9 O; z% G7 P9 o% R3 M
  18.             'hostname' => 'localhost',, k2 ], k  c/ |/ N
  19.             'port' => '27017',) V7 s4 z1 y( S# R- y; R8 H, l
  20.             'username' => '',
    6 L" L% S0 S. B8 o+ m# z2 R) V
  21.             'password' => '',
    . m" Y. _% \: d* ?" s5 m/ h
  22.             'database' => 'test'+ f! s# V+ F5 z1 G2 Q
  23.         ];& {7 y1 v# Y( }% m7 K

  24. 8 k3 V  f  E; O
  25.     public function __construct($config) {
    % }+ g$ x, J% q3 y+ _
  26.         $config = array_merge($this->defaultConfig, $config);
    3 n9 g7 d1 W% Q: `$ _  ~8 [# D( |
  27.         $mongoServer = "mongodb://";" Q) @* ]2 ^! N3 K+ O6 ~- X
  28.         if ($config['username']) {
    6 `: [. f* [" q9 o8 J
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    1 h  l. O) V' n2 B5 b9 ], |
  30.         }
    1 N& T4 N3 x. P1 R" s
  31.         $mongoServer .= $config['hostname'];5 h. t- D4 V! N) ], _3 C$ _; |
  32.         if ($config['port']) {* P  ~: q$ Z6 f
  33.             $mongoServer .= ':' . $config['port'];' Y$ E* K/ X0 R( r
  34.         }" l' f$ O+ p0 Q
  35.         $mongoServer .= '/' . $config['database'];" K5 M9 K+ Y- |( W/ E! R" F; {

  36. $ O6 B1 p! G  J0 @9 {6 i
  37.         $this->mongodb = new Manager($mongoServer);6 v+ x( j. v( l; z* K; u& }
  38.         $this->database = $config['database'];
    & f) U+ c# M& m$ e8 F
  39.         $this->collection = $config['collection'];& I1 T  H5 C) _2 q+ n
  40.         $this->bulk = new BulkWrite();
    5 Q' u3 g, y3 \8 o' N2 I
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);# G7 K9 a3 L$ ~& M
  42.     }
    ) N, q1 c( _" Q. Z

  43. - F! y( k7 M" T( b5 H1 j" V9 v
  44.     public function query($where = [], $option = []) {+ y. F" H& K6 [4 ^3 f$ |
  45.         $query = new Query($where, $option);
    , G4 i2 }; P" b8 M
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);7 C% d: x$ f; {! m# \) _9 H
  47. 4 k7 w% a4 u- w7 {- R1 V, x
  48.         return json_encode($result);
    7 g4 i6 |1 M* \
  49.     }
    - d5 r( _3 f# @# E% c3 ]
  50. % R: Q- {: G6 m$ g: S3 o4 q/ z
  51.     public function count($where = []) {
    # n# X) a& `+ q% d6 c
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    ) |" N2 r5 _2 I6 v2 R0 k! ?
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    # V, t6 }; V* y  e7 [# ?$ o' E
  54.         $res = $result->toArray();+ J( n2 N* j0 B) D" P
  55.         $count = 0;5 r7 l) y; Y; z
  56.         if ($res) {
    5 F6 _3 y4 ~5 [) e5 _* a
  57.             $count = $res[0]->n;. U5 l2 a; r' y' ?+ G. ?* D
  58.         }4 Z" Y. X' L% _( V

  59. 7 B5 R1 f4 g2 N2 w3 F
  60.         return $count;& b4 r0 U  M$ X1 p
  61.     }
    7 Z6 G' u5 L- L. a* N: c5 Q5 M+ K+ s& ?
  62. - ~* k; ?$ L* [& _3 g
  63.     public function update($where = [], $update = [], $upsert = false) {' K) I) C: x) a
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    / q$ `" h! l: p! x& i8 F9 u, c
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    + l& F4 n7 T1 L/ M) G) K$ o& f
  66. # A: h* k. w# g- u4 C6 E9 Q8 j
  67.         return $result->getModifiedCount();6 ^- ]7 e% m8 P
  68.     }
    ) e3 g6 J! s2 l# C0 P

  69. + U- ?. P4 D- J$ S; ~
  70.     public function insert($data = []) {
    8 S$ c1 x  L+ K: b$ \( L1 z
  71.         $this->bulk->insert($data);
      Y8 T  D6 y3 ^8 p, y( R0 l# }" P
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    0 y, {7 t7 U  b' B' h& o
  73. % G2 e  {$ i# E. j! z
  74.         return $result->getInsertedCount();
    ! [8 A* {) O1 R/ C7 Y6 S+ G
  75.     }
    ' _- p" h. [( w( K8 ^( v

  76. 4 r6 X0 X  d  G) S. {
  77.     public function delete($where = [], $limit = 1) {
    ( m* k, y; F% P# t' d* I
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    - I  u6 I1 r1 q# |" V
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);7 H+ e0 W1 \! w* G+ J$ x

  80.   p0 U5 {+ w/ u! ]# G% K
  81.         return $result->getDeletedCount();7 o" A% d  o* N, D! ^
  82.     }/ t5 t( `5 d. v1 R; V5 z
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • ( d# T5 t: [% P' ~4 _5 Z
  1. new MongoClient();
复制代码
  • ; J6 \9 N9 {5 z( w8 T, u
  1. new MongoDB\Client();
复制代码
2.新增
  • 3 T- N2 A4 h# [( l" e* g. o
  1. $collention->insert($array, $options);
复制代码
  • 0 I: K/ r9 c" B! x' x
  1. $resultOne = $collention->insertOne($array, $options);//单
    2 K. t% c: i* I2 ?! M2 _
  2. $lastId = $resultOne->getInsertedId();) t% p& F* R! R& c0 {3 I0 ?+ O
  3. $resultMany = $collention->insertMany($array, $options);//多9 B0 ^( E/ t3 ^' ?- N6 \7 l( {
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • : i7 r! G7 n0 i6 F+ f( k! j0 h
  1. $collention->update($condition, [
    + r/ g: i; ~/ o& F
  2.     '$set' => $values
    % r) K2 K/ i2 v4 N& |0 p0 e
  3. ,[
    9 e8 i! f" D; h' s, t2 V% B& Z
  4.     'multiple' => true//多条,单条false, F- V6 w! L2 Z; T* N
  5. ]);
复制代码

  • 1 ~0 b/ A! Z  O/ C- a1 g
  1. $collection->updateOne(9 a, Y6 [6 u6 x, p
  2.     ['state' => 'ny'],5 g3 I- b) p, W3 p2 N+ c' T. E
  3.     ['$set' => ['country' => 'us']]
    . c. e5 d2 z; R# [0 |
  4. );& L/ J' J4 m+ I) W8 L  p" d6 o$ o
  5. $updateResult = $collection->updateMany(5 N8 n0 S# ?. @
  6.     ['state' => 'ny'],, j) y  g: x, f! k' s1 m
  7.     ['$set' => ['country' => 'us']]+ Y: X8 e6 ~  ]0 r4 n
  8. );* B! {3 k9 k2 G. u
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询
  • # A6 Y" h; x8 l, t$ U, X
  1. $cursor = $collection->find($condition, [
    8 n, ]# V2 D/ t# W" `% k
  2.     'name' => true//指定字段
    " @3 \* p* L+ x) J. t1 ^
  3. ]);/ s1 [3 h, h, g" |$ R2 S6 o3 [
  4. $cursor->skip(5);
    ! E* e. v% w! S) _5 x3 i) z' j
  5. $cursor->limit(5);; z! {+ n( A, w+ `# E: V$ g4 c
  6. $cursor->sort([7 I+ o! X+ U( V" I8 i
  7.     'time' => -19 ~* `9 Z/ J# T# _3 p, T
  8. ]);
复制代码

  • . o5 U) i5 D# L
  1. $cursor = $collection->find($condition, [
    ! f) z/ D" d0 h0 E
  2.     'skip' => 5,  V) X& L# j8 ^, L! S% [
  3.     'limit' => 5,# b/ T4 V5 S/ H
  4.     'sort' => [$ a7 Z: w& K3 ?$ S- ^
  5.         'time' => -10 Z2 t( c1 f' Q8 ^, z, d
  6.     ],//排序
      w+ A5 o3 u- j
  7.     'projection' => [- W9 M* Q0 A  b' e
  8.         'name' => 1//指定字段) p# B% P" u7 R
  9.     ]! H1 @' T4 i) i' {: O" h
  10. ]);
复制代码
5.删除
  • ; L: Z3 H& U# z# F3 r3 v! d2 @
  1. $collention->remove($condition, [
    / C1 T0 r. h: p! _* O0 \
  2.     'justOne' => false//删单条7 x& N/ Z3 F! z* Q: m
  3. ]);; F3 L& M7 P7 S" a/ y
  4. $collention->remove([]);//删所有
复制代码

  • - |1 j% l; a- D: p
  1. $result = $collention->deleteOne($condition, $options);, C  O% F! V  B+ g
  2. $collention->deleteMany($condition, $options);0 y* ]* d5 e2 b: ]3 c

  3.   ?; b  g( B: H! `- f
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([! C% h: e" S( [' x) f
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键; R4 R, l, J& X% H: S" Y1 F$ Q
  3. ], [
    , q5 y! ~, R$ S/ U& g
  4.     '$inc' => ['id' => 1]//自增
      R/ o2 x  B, \6 v& I$ e2 W
  5. ], [
    # {8 T. w  R, S; t8 i+ y& L9 H
  6.     '_id' => 06 L, \1 e. n% h; R
  7. ], [$ o0 |- b- Q4 c* u- l/ m
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    % V! N0 _# y5 q2 b/ p7 H  [
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([' l# N; r, x0 T& `" f
  2.     '_id' => $tableName
      k3 p4 M! e4 v6 Z
  3. ], [
    * o5 J. h7 j8 Q* G1 v. p# ^
  4.     '$inc' => ['id' => 1]& l! P- `" k" e8 u  e! O  v
  5. ], [
    4 ?1 ~. T' {$ B) t. @, j$ l
  6.     'projection' => ['id' => 1],! q% D  B0 k$ P% v! ?
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    - e- s8 O7 D+ n7 G4 R7 I- W* ?
  8. ]);
复制代码

# r% [8 V5 u- w; r) ]) `9 v" k2 @% ]4 _8 x! P+ m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 05:53 , Processed in 0.118555 second(s), 20 queries .

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