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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17003|回复: 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
    ! P+ ]  [4 D( `
  2. - H3 y' G9 U! L$ X8 {# N2 A  _& m
  3. use MongoDB\Driver\Manager;
    # s4 s' E2 d6 I1 o4 {
  4. use MongoDB\Driver\BulkWrite;! Y4 s& m5 w3 W3 N; D! e
  5. use MongoDB\Driver\WriteConcern;: E) T5 B/ Q/ c9 R: C
  6. use MongoDB\Driver\Query;
    , L% t& ~3 }  f5 k
  7. use MongoDB\Driver\Command;* Z; k, _4 J; d: k( p- Y

  8. $ f' Q+ h0 d1 }6 ?& m. R
  9. class MongoDb {- R6 w0 p8 s, ~0 H% R! x" m# z
  10. ! s6 K( G: a, W3 L. g: {* D/ [0 p9 J
  11.     protected $mongodb;
    ! i2 r5 B# R, {
  12.     protected $database;- m6 r: ?# h# `1 ]6 ]$ f
  13.     protected $collection;
    & z# i8 ]3 }9 @* P+ T1 g, n6 G
  14.     protected $bulk;
    2 E, P% u0 ]; g
  15.     protected $writeConcern;# e4 S. r6 l; h0 c3 r1 t% [1 W
  16.     protected $defaultConfig
    8 o" Y) A8 S5 s! F% @
  17.         = [
    2 u) H0 x1 ]! `6 b1 H# J* @
  18.             'hostname' => 'localhost',
    # _/ h/ W2 {7 u3 U/ T( ]* O8 t
  19.             'port' => '27017',8 ?/ F6 U4 n% R& b) E
  20.             'username' => '',3 c  |+ }- N; w! d8 t  H2 j) ^
  21.             'password' => '',
    : U% I- `1 A3 o) Z' W9 {9 N
  22.             'database' => 'test'
      u$ g3 ^* Q, u9 C/ ?
  23.         ];! e9 p0 A  [; w, L) ~: X
  24. # r6 e( @7 z1 j1 ^: b
  25.     public function __construct($config) {
    % F7 L3 D5 E& @$ [) G
  26.         $config = array_merge($this->defaultConfig, $config);. H2 R+ }( Z$ ^" D, ]
  27.         $mongoServer = "mongodb://";3 G; Y( o- h5 A, f
  28.         if ($config['username']) {6 e: H3 _9 f  F9 L# f# r& c/ ]0 ?: H; P
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    / M* ?3 L$ r3 E  E+ P
  30.         }
    % N7 _8 ^7 ^5 `9 W9 C0 j
  31.         $mongoServer .= $config['hostname'];2 Y: d* R, x3 U% W
  32.         if ($config['port']) {
    . \2 g* h/ |" w8 c' f. A" A- o+ T
  33.             $mongoServer .= ':' . $config['port'];9 X2 f  |9 m/ T2 n) K
  34.         }
    9 T" r* ]( f$ Y
  35.         $mongoServer .= '/' . $config['database'];2 x+ H( j; a: S% \$ D0 n5 q
  36. ; t) c8 E7 f+ O! U. j; b  }
  37.         $this->mongodb = new Manager($mongoServer);+ n8 d- q' X% w" v  z; B1 ]3 F
  38.         $this->database = $config['database'];
    . |# `3 ]: {9 _$ ^: U
  39.         $this->collection = $config['collection'];! f. `2 E/ w+ k  J
  40.         $this->bulk = new BulkWrite();' N1 m9 X# U2 B( R5 n
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);4 w( k+ n# i$ f
  42.     }
    2 w" A) `3 f( h4 I( O3 |% U" Y

  43. 7 S7 |1 @! y  {: @8 F7 r3 T
  44.     public function query($where = [], $option = []) {
    2 @- o7 t8 A' I) y4 U$ L# E/ C
  45.         $query = new Query($where, $option);  E# \0 e5 \: c7 C- G2 B1 f
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);* {9 T7 I# S* x6 e3 V
  47. # O% U% `6 l; A5 G9 h3 F
  48.         return json_encode($result);* H# U) g4 a4 w* Y
  49.     }3 f! d, G) w& ]$ X  d: Z0 f1 @# }

  50. 1 z5 a7 J/ @2 [7 b+ ]6 u; W. W
  51.     public function count($where = []) {! ~! M* m2 V* L3 k3 @* m! H! T2 J
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    . P' U5 E8 e+ N: C% f. p
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    + d0 H$ P6 |1 S9 f! j
  54.         $res = $result->toArray();
    7 ^+ G9 S% X4 \; Z% K7 i  q+ g
  55.         $count = 0;
    . ?) Z# n7 @* a1 b* r# d' K2 @) g
  56.         if ($res) {6 l# I/ l  W9 b( }: M
  57.             $count = $res[0]->n;
    1 K0 Y0 p0 K1 g" g1 {
  58.         }
    9 s( w+ ]# X  e5 |; J

  59. 7 R5 R# x8 _6 V. X8 D& j
  60.         return $count;6 [: p+ @1 r4 A4 ?# y
  61.     }
    1 E- ?' _" J! }& r. q
  62. : W  c9 ^9 e" M# K/ O6 E
  63.     public function update($where = [], $update = [], $upsert = false) {% V* p/ Z4 R: S: _8 ]( R) v1 U$ o0 E
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);, l; _) {8 \! T* _5 C$ h0 D$ s
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    $ B2 R% F: t5 d) Z4 n0 }

  66. " v( c( v( M# ]8 T
  67.         return $result->getModifiedCount();* F6 X; o; q  i. b- a
  68.     }
    0 o9 y3 y" ?3 y1 ]% L, X! b- l" m
  69. 2 w! m! M0 q  z7 t
  70.     public function insert($data = []) {
    - d0 ~+ Q( B3 C4 k/ s) S
  71.         $this->bulk->insert($data);5 @2 n# |1 J# d6 b* g
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    + A( h% i7 T7 m2 k* @0 t) v1 O

  73. ' q% `/ a, M1 r( \! i3 p
  74.         return $result->getInsertedCount();
    " R8 ~9 `! g+ M. o- @+ V
  75.     }# O1 k  R+ z6 f0 G* s
  76. 9 S3 @: ^) c' n, i) n  K
  77.     public function delete($where = [], $limit = 1) {2 u. X& b% @+ H: a
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    ! f0 |2 M' {. l- k! [. E: b
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);! N- d! D$ R! @2 J

  80. + _* Y: D" i$ p  C8 z; \& a
  81.         return $result->getDeletedCount();7 I5 B3 s& ^) U7 T0 z- X
  82.     }5 B. h  H0 f  s) M
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • : Y9 Q" C: N. p) |  s
  1. new MongoClient();
复制代码

  • 7 u* u4 S4 t! o* M% ?6 }; I
  1. new MongoDB\Client();
复制代码
2.新增
  • 6 U- E! u- Z! F3 W4 p
  1. $collention->insert($array, $options);
复制代码

  • ! ?; ^  Q3 A0 B. ^1 k9 x; e
  1. $resultOne = $collention->insertOne($array, $options);//单
    " m3 P/ f6 i: B2 a
  2. $lastId = $resultOne->getInsertedId();: r! s5 l' v, I% z  u
  3. $resultMany = $collention->insertMany($array, $options);//多
    8 W5 u; k  N8 d
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • 5 X8 d, t$ y2 a8 e, c4 ^3 Z
  1. $collention->update($condition, [
    : b0 Y2 s" P) k$ I9 _
  2.     '$set' => $values; [, g- M5 X9 F( r6 w: j) h- _# \
  3. ,[
    3 U1 ^/ A. `" a& B% k
  4.     'multiple' => true//多条,单条false
    7 U8 C) v1 x' ~6 r- v# h" K9 ?$ a
  5. ]);
复制代码
  • * p- s) G; d( z8 R: T: v
  1. $collection->updateOne(5 W' C0 ^1 a' k4 ^- o3 a8 e  _
  2.     ['state' => 'ny'],
    # }3 M. X9 q5 g. a- A8 g1 s  u5 R. t
  3.     ['$set' => ['country' => 'us']]
    0 k9 [7 O2 C: Q3 y
  4. );
    8 O! \- _, d# F" H4 m4 A
  5. $updateResult = $collection->updateMany(3 X& Q( f9 A& m' I, w
  6.     ['state' => 'ny'],; l; m2 }( I- m. }
  7.     ['$set' => ['country' => 'us']]" R, k7 \2 B$ [) U
  8. );
    4 Z! g0 \) i6 _% O! N  {& |
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • * [/ U1 F( y/ }$ y' {3 l
  1. $cursor = $collection->find($condition, [
    ) m$ H) l( X6 P: q
  2.     'name' => true//指定字段% Y* k- q$ M: V$ [  O7 K5 v" U
  3. ]);$ Q+ E; p: y* L3 [- Y1 m
  4. $cursor->skip(5);$ Z5 i: p7 v4 Y' `. W: X4 @/ j
  5. $cursor->limit(5);1 _# H& I6 C% ]0 p
  6. $cursor->sort([# _: Y3 x* H1 R
  7.     'time' => -1
    . j& b" t. v* T& L3 ?8 M
  8. ]);
复制代码
  • $ h# }. ]; e6 l
  1. $cursor = $collection->find($condition, [# L, K* ^  O- x. I; d9 j
  2.     'skip' => 5,
    - D" {) v2 F- Q, w6 H; k* Y1 H
  3.     'limit' => 5,
    * P4 {, Y, p5 F4 U6 A. o
  4.     'sort' => [
    # X' Z; z6 |* E8 j3 B7 {6 Q
  5.         'time' => -1$ p- c5 A1 Y- u- H$ t; F$ H5 G
  6.     ],//排序
    % V# ^% j' \& {2 g1 J7 o
  7.     'projection' => [) U$ J* D9 }8 g
  8.         'name' => 1//指定字段
    ( F! K  I8 G) Y3 v
  9.     ]
      B# W) g- L9 S& s* z! F+ Q
  10. ]);
复制代码
5.删除
  • % `4 A8 J: i( Z9 Y4 k  e6 \" c
  1. $collention->remove($condition, [5 ?) D  i1 E' Y' l
  2.     'justOne' => false//删单条
    ) N0 X8 Q; s  B2 B3 D& }4 D
  3. ]);+ v. O0 I# v5 Y+ Q% A. j
  4. $collention->remove([]);//删所有
复制代码

  • . [% d7 x* F4 ~, [
  1. $result = $collention->deleteOne($condition, $options);
    ; {3 D- h0 [4 `- Q* K: Y2 l% I
  2. $collention->deleteMany($condition, $options);/ k- R9 W9 A% I2 g, q+ E
  3. ! j" H% m* h! `3 h7 w! x
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    6 Y# y5 N3 V' N, U5 g
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    3 f7 z1 ^" j6 M2 h1 n+ J
  3. ], [
    $ d4 c, d2 d$ r# }9 g2 _. _
  4.     '$inc' => ['id' => 1]//自增
    + K; G/ J2 x* u$ K8 ^. u# g, l
  5. ], [6 Y9 q8 e; j- V# n( Z1 M8 X
  6.     '_id' => 0( d+ K/ I% o  U
  7. ], [
    , `' P2 V# R$ t7 U
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    $ ~0 C( c( l5 Z# R0 Z
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([+ {9 F: \- |: m6 M
  2.     '_id' => $tableName- Y! a" d- v$ S, R! Z
  3. ], [
    ! l% T2 ^9 A- A
  4.     '$inc' => ['id' => 1]
    " ?  i  u9 Y0 X! D3 g
  5. ], [
    ! m& }" A/ ?( P: Y( \
  6.     'projection' => ['id' => 1],0 V$ x/ E0 r) R) X; i1 _: k) y5 {
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER3 l* m! f' }! c# ]8 y' h: D- ^9 W7 Z& Y
  8. ]);
复制代码

& \  w& Z% R% N+ g; ]: \( u7 Q) H2 W! l. W7 F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:47 , Processed in 0.057115 second(s), 20 queries .

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