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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16095|回复: 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# t8 I( l" ?: @
  2. 9 n$ O7 M. b+ t; q2 r( o: w
  3. use MongoDB\Driver\Manager;
    6 G" A% T4 j; }6 g/ l7 J! g
  4. use MongoDB\Driver\BulkWrite;/ ^7 V3 I( e& `, q
  5. use MongoDB\Driver\WriteConcern;; n: |9 u% f  ?& ~. j' M7 q
  6. use MongoDB\Driver\Query;$ W1 n6 D" H( o) Q
  7. use MongoDB\Driver\Command;& A& v1 c% y6 z7 u; Q% ?
  8. ; z, X& S* p& a9 H
  9. class MongoDb {
    / L) h1 r3 P/ R7 J! Y2 h
  10. 2 J6 b/ s4 B% ?/ M) Y. D
  11.     protected $mongodb;+ j/ @$ W5 C4 l6 e  A+ W
  12.     protected $database;) g: M3 e5 g) ?% x
  13.     protected $collection;
    & t9 s( @6 W" `9 X7 I: R9 @5 s. b" r
  14.     protected $bulk;) d" @2 Q: {9 V3 d
  15.     protected $writeConcern;5 Q0 b& Z% P8 q* |5 X9 s
  16.     protected $defaultConfig
    6 X! _7 h" N7 C& {% q
  17.         = [) t& v9 X' E/ w( z
  18.             'hostname' => 'localhost',
    3 w, e+ b2 C3 V: H6 y3 y- T5 j& l5 A8 k
  19.             'port' => '27017',& E0 P, y0 z2 t' M% m& K* I
  20.             'username' => '',9 L4 d2 e, u4 v& _; }+ t
  21.             'password' => '',
    # h2 ]8 [' o" k0 r. d+ {4 R
  22.             'database' => 'test'6 v* w8 D" r+ q
  23.         ];
    . L; p; O6 W, E5 t: d# ]% d8 K
  24. * d' T3 P) k9 h# m$ O8 h3 ]
  25.     public function __construct($config) {
    8 l) M9 Q. d' A
  26.         $config = array_merge($this->defaultConfig, $config);
    ) i' b9 P. {5 k/ c( g. D: H" ^
  27.         $mongoServer = "mongodb://";
    0 U/ t" L4 i4 a8 W- j
  28.         if ($config['username']) {( B8 l6 W8 }0 p+ ?2 o
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    ( v/ S1 y7 u  P) Z+ }) ~" s
  30.         }8 P8 H6 h$ T$ ~' a% X: H$ K
  31.         $mongoServer .= $config['hostname'];! H* C3 y2 v" k2 F
  32.         if ($config['port']) {5 g2 O2 c4 x3 E: |6 |/ Q
  33.             $mongoServer .= ':' . $config['port'];) D; Y1 b' v; C$ q! Q/ ?2 r
  34.         }: S7 G7 {' L4 c% n+ s1 n# @# {' C
  35.         $mongoServer .= '/' . $config['database'];, l9 J  L- ?8 F! X! q" `+ Y" c

  36. ) n" r( n/ k6 j. @. B8 M( D
  37.         $this->mongodb = new Manager($mongoServer);" D' s) y, U, Y, I3 Z" K' v
  38.         $this->database = $config['database'];
    ( H" C$ y% @1 l* W
  39.         $this->collection = $config['collection'];1 b% F" N. J. ~' N+ N+ @, K
  40.         $this->bulk = new BulkWrite();6 k" k# p- x% U
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);9 ?1 W9 J1 l( l) c" L1 Q6 ?
  42.     }2 u' s/ x3 ?' i
  43. 7 |% z  c" j$ }+ z% I
  44.     public function query($where = [], $option = []) {
    - I1 U: f" `6 B: h- t
  45.         $query = new Query($where, $option);
    % E+ Y1 k6 u- X: q. }
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    . B7 g% j2 h0 G
  47. # D' S; s# b" l: Y2 u2 z! O
  48.         return json_encode($result);
    , }7 @3 l% W1 r/ H
  49.     }3 A- e# F" b# x# n& ]

  50. + s2 w/ m% I% ]* o+ ?  k6 M6 p
  51.     public function count($where = []) {
      s4 T2 K/ W8 Z( e: `! T" z, t, y
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    , x6 z% M# g# A7 d
  53.         $result = $this->mongodb->executeCommand($this->database, $command);9 v0 X8 K. t* l9 m' `/ B
  54.         $res = $result->toArray();
    & P  f$ g2 ?' B/ L( ]  F& y4 j2 u
  55.         $count = 0;
    # s1 K# B$ i3 H9 k  S
  56.         if ($res) {
    & l/ }2 _  n$ H3 R1 B1 W4 |
  57.             $count = $res[0]->n;
    ; n* f. A5 ^5 p! C- P7 n
  58.         }1 G( ^0 ^8 k1 b; {/ K

  59. % t  s$ \  L4 Y4 E) m# G( U
  60.         return $count;
    & c% W/ P- N8 c' J
  61.     }9 V6 L( O% L$ B( K% J/ ^7 f( {1 T

  62. 6 {9 g% e8 l6 Z  r9 U$ }+ r4 @
  63.     public function update($where = [], $update = [], $upsert = false) {
    * Y: g/ B0 L$ c4 r1 I  {7 Z
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);9 y) p* K  H! ?' F1 I
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);; H. c, U# Z& M
  66. ! \+ y: S* V' }: v; f* L
  67.         return $result->getModifiedCount();
    + m9 q; s( }: Z- @
  68.     }( L, E& X1 A" D) L. a( {
  69. , v% _1 S. v3 ?# _0 t& A
  70.     public function insert($data = []) {& C: D& n/ D0 x. R! i' o4 G
  71.         $this->bulk->insert($data);: d( O. [% ^; b/ Y
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
      H" `; m6 x( ^! U. R& I0 f$ ?
  73. , X+ Z7 O- @" k* x0 ]) c; [
  74.         return $result->getInsertedCount();/ q% e. U; J$ Y5 R, a, F
  75.     }$ ^" I! n4 f9 |2 J% J
  76. 1 ^9 K3 f" V, d1 h5 X6 Y( |
  77.     public function delete($where = [], $limit = 1) {- M; y! x, k% O3 ^
  78.         $this->bulk->delete($where, ['limit' => $limit]);
      N0 U. W+ `- k  l3 F
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    2 Y% s* S/ ~' e1 j) H) Q8 P* ^
  80. ; f& P% M" ]6 E/ q) D2 i& K& i' Z
  81.         return $result->getDeletedCount();
    2 F3 r% w* {6 I' s
  82.     }: F9 H9 ]) L# n% y6 E
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 0 s5 b4 n! y% }2 X7 m; {1 L
  1. new MongoClient();
复制代码

  • * |2 F& c* ^6 Q' o$ P3 g" m4 |: h
  1. new MongoDB\Client();
复制代码
2.新增

  • ; I" a0 X/ T8 ^  j8 T: l- l( }( p
  1. $collention->insert($array, $options);
复制代码

  • 9 _4 @; |7 \* W/ o+ _$ a! T' e
  1. $resultOne = $collention->insertOne($array, $options);//单8 I8 \! w$ m5 q/ w
  2. $lastId = $resultOne->getInsertedId();; z  D: P) V) Y8 H  j+ W3 m
  3. $resultMany = $collention->insertMany($array, $options);//多
    ( M4 e* z  p# m7 L6 H% Q2 ?- |9 g
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • . i4 ~# z- R; t" M3 B" A
  1. $collention->update($condition, [! X6 i# b2 x6 _9 B
  2.     '$set' => $values; {9 Y0 `4 K2 F1 d4 O' f+ y
  3. ,[! _3 y) B5 @0 ]* F5 V
  4.     'multiple' => true//多条,单条false
    % }) o$ k, Y/ {6 @5 O, \4 E: M
  5. ]);
复制代码
  • ' {6 a8 A+ h; k. v4 D$ i
  1. $collection->updateOne(6 r3 g# O" Y( J: ~# t$ r3 ?
  2.     ['state' => 'ny'],
    $ I$ K. F9 S) b' c
  3.     ['$set' => ['country' => 'us']]" r+ T9 p* M0 W% d) H. h! v
  4. );
    , c* o6 y! m7 d0 I
  5. $updateResult = $collection->updateMany(- z: O2 |  x) y5 D
  6.     ['state' => 'ny'],# v3 c8 j0 b4 n+ p
  7.     ['$set' => ['country' => 'us']]
    + V& v6 _) c: L6 ]: j/ ~, s! X
  8. );3 L" U; z6 R& q  c! i8 P. }' N
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • / D, L$ `: B  c: E
  1. $cursor = $collection->find($condition, [2 o6 A$ H; ^& ?5 _; \7 _8 u% I5 s6 P2 f
  2.     'name' => true//指定字段; A% p1 `+ s) {$ d( x
  3. ]);
    2 e: s1 a5 d5 ]2 x' \
  4. $cursor->skip(5);
    3 u' L( d! F! G! m8 @: b2 x
  5. $cursor->limit(5);
    . M+ k0 K" W4 w
  6. $cursor->sort([
    $ d3 L7 e+ A% K/ u! K6 T
  7.     'time' => -1
    2 a5 Q" P$ R9 e1 v5 o6 e- \6 c- P
  8. ]);
复制代码

  • * Q* j$ R( L$ h
  1. $cursor = $collection->find($condition, [1 p! C- k; _8 ]# e6 x* G. i
  2.     'skip' => 5,. r7 a( b* P( r2 B$ m; q
  3.     'limit' => 5,
    1 j& ~" g3 N) h2 {! ?
  4.     'sort' => [- n. F) Q9 i+ U( a$ Q4 T
  5.         'time' => -1
    + k" E0 P8 u- N' D) S, }: J1 \
  6.     ],//排序. H. k2 A. y* q. i3 B( R/ f" T/ {
  7.     'projection' => [
    . Y- `  [6 g1 ~9 N
  8.         'name' => 1//指定字段, q* i& s& t2 B2 K5 D/ m4 }
  9.     ]
    / j, ]- U, A, F9 M0 E) s
  10. ]);
复制代码
5.删除

  • ) b! B1 y: Q7 R+ P$ ?. J' ]
  1. $collention->remove($condition, [
    3 R0 _7 \" F2 O: y# E& ^2 R  g, y
  2.     'justOne' => false//删单条) a) G6 S, I" `9 {) M
  3. ]);
      j& i5 R) Y! S6 K$ t
  4. $collention->remove([]);//删所有
复制代码
  • / B2 ]% N& ?' U  [0 H
  1. $result = $collention->deleteOne($condition, $options);% M6 Z5 T: _7 d- _, a0 l! E3 N. z
  2. $collention->deleteMany($condition, $options);& n5 }. n5 h' I% S$ l$ k8 u+ L6 O

  3. 6 y( t/ l; Q+ b. h6 F- T1 n
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    . N' P0 x' P; @
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    - r4 U' T# h3 ?
  3. ], [
    : [: o6 e" }" B7 r. D& o: v4 P
  4.     '$inc' => ['id' => 1]//自增5 a* S! t" o7 W0 b
  5. ], [  i* u# ]( C- r8 u# O. O  o
  6.     '_id' => 0" |) X: D1 G- R% v& l4 h( y4 q1 {
  7. ], [
    0 K7 [+ H; i; i1 i: h) h4 ~
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    : d& u2 ~7 t5 m, L; S2 ]1 P( }% N( k9 V! B
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    & y$ v8 f# `1 L% E, Y+ V% |! R1 o) i
  2.     '_id' => $tableName
    4 q; b. m3 |4 x
  3. ], [
    - E) P* P$ y: S, l( z, E. @  F
  4.     '$inc' => ['id' => 1]4 X$ }( V. D* ~1 P& H4 z
  5. ], [4 i* E, K9 E7 ^) P6 e1 B7 u
  6.     'projection' => ['id' => 1],
    # }6 J( G3 {6 h
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    - P4 m5 B5 \3 _: s2 R9 H& C
  8. ]);
复制代码
8 n) a( K% ~# Y. Q
/ m. X' ^2 D5 }7 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 21:50 , Processed in 0.056523 second(s), 19 queries .

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