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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13252|回复: 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
    & A, R2 u/ M6 _  N4 k
  2. 5 ]4 Y, |( C# o2 X# o- N
  3. use MongoDB\Driver\Manager;
    1 b& N9 ~- j4 X  _2 I- D
  4. use MongoDB\Driver\BulkWrite;
    % f% L. ?' L$ R4 H
  5. use MongoDB\Driver\WriteConcern;
    9 e' @, b+ _# ?& N# u/ @/ y
  6. use MongoDB\Driver\Query;0 E" Z& d  {& [
  7. use MongoDB\Driver\Command;, ?" R- f# B; X" Z' _

  8. : f! J6 d. S# p! i
  9. class MongoDb {  A( n8 D. ~2 _1 u8 y

  10. 5 Q0 C7 M  V) Q6 J
  11.     protected $mongodb;, z2 \7 g" _( m+ I# ~" n- F
  12.     protected $database;8 Y) D& Z: W8 n' f' z# Y
  13.     protected $collection;
    # }" P* ^4 F4 F  Q- s
  14.     protected $bulk;4 o) Z7 h9 l+ N2 o+ F, ?6 f
  15.     protected $writeConcern;' f8 Q+ Y0 f& Z) L  }4 D! ~
  16.     protected $defaultConfig& W+ P1 v' b# |! g3 d
  17.         = [
    9 Z# Z/ Y& `0 @6 H* Z. G) g
  18.             'hostname' => 'localhost',
    ( J7 u$ g3 C; T
  19.             'port' => '27017',5 I$ d8 U  t% {4 s" r( R5 J* G
  20.             'username' => '',/ V9 B# v7 }, h" f6 F, ^
  21.             'password' => '',
    ! y) F" @8 ]# y7 l5 C8 N! f6 p( a
  22.             'database' => 'test'8 ^$ J- J( r, w) \4 [/ O; Q+ ^1 `
  23.         ];
    $ q) [4 ?# ]/ @

  24. $ c; |! }- H2 S1 c) O- T
  25.     public function __construct($config) {
      u- H, ^# [7 f* J  y2 B% `
  26.         $config = array_merge($this->defaultConfig, $config);
    2 h% Q0 Y) l2 Z
  27.         $mongoServer = "mongodb://";$ H4 X* ^, ?4 ^, }5 Y
  28.         if ($config['username']) {
    " E3 b- b2 @8 N4 }6 U( Y
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    ) H& A+ U( W# x7 T. A$ }) r
  30.         }
    $ ~! ?- Y6 J2 x/ t
  31.         $mongoServer .= $config['hostname'];/ H& U; t9 K* ?1 Z4 b1 r
  32.         if ($config['port']) {
    ) g" o, p/ l- ?8 ^) |/ X" p
  33.             $mongoServer .= ':' . $config['port'];/ E, O7 W  ^8 E8 }5 {
  34.         }
    # e& o6 X# ?  I% |) u% s! _1 J
  35.         $mongoServer .= '/' . $config['database'];
    7 f" e+ [+ B2 E: l8 ^) i2 {

  36. ) G' D2 R: E, H6 o' S6 B
  37.         $this->mongodb = new Manager($mongoServer);
    0 H( `- e' F; Q  t7 ~& K
  38.         $this->database = $config['database'];
    9 g& T/ f* t" v4 f! F
  39.         $this->collection = $config['collection'];
    ! T. F3 }# M8 f0 h6 [1 g& _
  40.         $this->bulk = new BulkWrite();7 O) ^- \' z# ^" F
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);' z6 b7 m( H8 w+ m' J
  42.     }+ j: S2 S, b% s) D* _
  43. * P- c4 z4 }% U3 F. |; e
  44.     public function query($where = [], $option = []) {6 x; y9 w4 `' X- m) q* S! t
  45.         $query = new Query($where, $option);2 |$ b# X8 b2 [5 A% T
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);2 B1 k: _: t. [$ ~

  47. ( q0 G$ J8 {, z' s
  48.         return json_encode($result);
    % S4 ], M- e: P5 L
  49.     }
    * y# h2 ^- l) x+ _
  50. / Q$ ^( Z, d0 M
  51.     public function count($where = []) {5 X% _2 w8 Q, Q* i! K1 W2 B7 |: L% h
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    ) h. l1 L: I+ D' b0 f  n2 s
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    ) i; z' P3 Q! ?. h9 S& A
  54.         $res = $result->toArray();
    ! d5 ?. r" P& }! }9 q7 r
  55.         $count = 0;+ |4 `- M! ^6 r6 `
  56.         if ($res) {7 J5 G  F  C# {; G$ S! U
  57.             $count = $res[0]->n;" [7 {8 U! D1 q5 I- P8 \
  58.         }
    . Y$ r0 k' b0 k0 J5 {
  59. / q/ K' z# T4 G  ?( m! a0 G* f
  60.         return $count;
    : i6 E4 Z( {- }' g" w
  61.     }  Q: u& r5 y5 p6 g$ W

  62. " y9 J4 y+ S/ m! m
  63.     public function update($where = [], $update = [], $upsert = false) {* I* O: _/ ~3 c0 k6 f
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);/ z0 I& [- q5 j0 a
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);# F# ^9 _) ?$ q1 }: p$ q
  66. ; F0 C& V! @. y# z  e5 |0 @3 [
  67.         return $result->getModifiedCount();
    2 y: t  H# v5 M4 k
  68.     }4 x2 W2 P6 }1 Y* x! u2 g# M! }# f9 i
  69. 4 n+ m/ h5 E5 _+ K& o  j) K* o* ]
  70.     public function insert($data = []) {) K9 n6 b9 k# T/ z! d
  71.         $this->bulk->insert($data);. F3 t9 v( v& k
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    , b5 p8 i/ s7 `  r7 y
  73. " Z- ]) B0 @9 Q8 h! R
  74.         return $result->getInsertedCount();- _  I9 O8 W; c
  75.     }' \. d/ x' a- h, s: G" e( u9 k
  76. % T( W! }6 h7 l' g
  77.     public function delete($where = [], $limit = 1) {# Z  S7 }$ ?* Y* x
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    ; Q7 L* f7 x; l4 r' d  ?
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);/ V( s. \2 E& z) H

  80. $ F" \% z1 K- C; W% W
  81.         return $result->getDeletedCount();5 |4 U  O# e1 o* g6 N
  82.     }3 m. h8 ?) q1 R! x" q
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • + a4 g$ T+ }" X4 ]
  1. new MongoClient();
复制代码

  • # ^! l) n! g: l/ I
  1. new MongoDB\Client();
复制代码
2.新增

  • 9 u( S5 B! d, F; t. P) M  r! K
  1. $collention->insert($array, $options);
复制代码
  •   U  @8 ^5 x* p7 K  r( @2 m" x3 w
  1. $resultOne = $collention->insertOne($array, $options);//单
    / W' K  u9 k/ J. Q! a* b5 c! B
  2. $lastId = $resultOne->getInsertedId();9 m( K3 |( ]- [) K
  3. $resultMany = $collention->insertMany($array, $options);//多! N9 K3 k, v. g  Y& w9 c8 q
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • 5 t" r$ i8 g1 u3 K, v7 M
  1. $collention->update($condition, [
    , a3 D0 a! }# A6 i$ t7 F
  2.     '$set' => $values, X% [4 b3 c+ D/ E
  3. ,[: V5 X, a8 V) O% Z
  4.     'multiple' => true//多条,单条false
    1 d/ _0 W8 {3 q( H. `" a# @
  5. ]);
复制代码
  • / k1 e, `; Z' r2 X" \/ ?% r% v
  1. $collection->updateOne(
    0 R  F: G5 ?# S+ C9 N2 Y
  2.     ['state' => 'ny'],
      l$ }8 M; l# K- X/ g8 k
  3.     ['$set' => ['country' => 'us']]
    7 I5 l# W/ y& n
  4. );+ G8 {- w' ^- W
  5. $updateResult = $collection->updateMany(, S  _- g8 r4 A8 S. c3 S- c. W
  6.     ['state' => 'ny'],
      G" U3 G+ i7 @/ ]
  7.     ['$set' => ['country' => 'us']]2 X- q9 m6 O' i1 U/ {" B- ?( k
  8. );
    " E+ ?7 P: v7 J- @
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • ' p4 I+ C+ A% A& f, |: J
  1. $cursor = $collection->find($condition, [$ `; d: i/ n, y; s) O
  2.     'name' => true//指定字段$ R- ]: M& ]* I
  3. ]);# S: e8 L- o. Z4 l4 {) V+ E
  4. $cursor->skip(5);
    & f: s& G* Y' ^$ _4 h) Y
  5. $cursor->limit(5);
    3 F- {* [: X8 P6 D2 k
  6. $cursor->sort([" C: `8 B  ]( Y! K+ \! o, Y
  7.     'time' => -16 E/ H8 n3 w) f
  8. ]);
复制代码
  • 8 w0 g; m% h+ X1 U% E3 }
  1. $cursor = $collection->find($condition, [1 ]0 o$ p) G; Z" W/ p0 E
  2.     'skip' => 5,
    6 g( Z3 C0 b2 r+ W
  3.     'limit' => 5,
    # H5 G3 u; f( B$ f& ~# [( i
  4.     'sort' => [9 e. e; n& x* P% ^% `( A% o
  5.         'time' => -1( |8 c( r6 G' P; G% y
  6.     ],//排序2 ?( ~2 b$ l$ I5 |( v( y
  7.     'projection' => [- Z% G9 T! Y! |9 ^0 ^
  8.         'name' => 1//指定字段& {  W% ?9 c7 F# r3 D
  9.     ]
    4 s( j' G2 R# a* C% e
  10. ]);
复制代码
5.删除
  • , @7 q0 U7 N) X: M
  1. $collention->remove($condition, [
    % K! y! q' k. T( F; \
  2.     'justOne' => false//删单条/ Z  u7 E0 J0 `; A
  3. ]);
    4 o" k; g8 L* }5 w+ t3 b$ M3 _
  4. $collention->remove([]);//删所有
复制代码
  • " b" s. Q7 L# p. m0 w3 }: J
  1. $result = $collention->deleteOne($condition, $options);
    & ?, T# H5 C" L; F: f
  2. $collention->deleteMany($condition, $options);
    0 ?& q# l9 E# O2 s/ S% L* m, i% A2 W

  3. . k( F& i) h; G2 d
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([7 @3 V' b8 K) E0 o3 Y
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    4 ^6 I" t! g2 M9 G7 ?6 I! Y/ M
  3. ], [2 G8 l8 ^% h' G, v- l2 f+ A9 ~
  4.     '$inc' => ['id' => 1]//自增5 V6 g2 `. i7 j/ C
  5. ], [1 S8 Z. Z) E# @0 U0 ?& |
  6.     '_id' => 0
    8 m7 y$ ]6 y& e, h- q2 p
  7. ], [
    7 }% g2 u5 A1 m1 p7 n
  8.     'new' => 1//返回修改后的结果,默认是修改前的9 K' }1 {( d( C, V
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([. c+ ]! Y' d  D% N$ _/ W1 w7 M+ v' {
  2.     '_id' => $tableName8 N+ p" V/ ?; f( B" H9 S% M4 @
  3. ], [
    * M3 n+ e0 i7 p6 R0 c
  4.     '$inc' => ['id' => 1]: i& x5 O! O8 F4 v- E, Q2 A% T' v2 G
  5. ], [
    # M. g' P; h1 A
  6.     'projection' => ['id' => 1],
    ) H. D& j$ H% M/ p
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    ' E! _% u) r% F4 Q! ?7 m* f' h
  8. ]);
复制代码

! l* r2 j$ C, b6 c) X' }- E0 K7 e6 Y' ~+ F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-1-1 12:07 , Processed in 0.120845 second(s), 22 queries .

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