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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13199|回复: 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
    . _! z  y! V' |, q( S& Z

  2. 4 C' `/ {$ \- ]( ~: D
  3. use MongoDB\Driver\Manager;5 W4 A0 N# C# [* D  l$ {# T( ?
  4. use MongoDB\Driver\BulkWrite;
    & ]% |6 t8 p4 J; e
  5. use MongoDB\Driver\WriteConcern;
    0 M  g( B' j8 d6 X. A
  6. use MongoDB\Driver\Query;
    / U1 }5 H3 V& [% P1 I2 F4 K& N
  7. use MongoDB\Driver\Command;
    ( ~7 p/ ~( c9 j/ ^/ |, N: S2 G

  8. * q0 O: ]$ M  k' W
  9. class MongoDb {) ~, q& i( A: g/ V* t3 Y+ x, _3 f+ F2 e

  10. - g2 J7 g- f3 M$ d) l7 W* i
  11.     protected $mongodb;
    3 ^& s9 g+ T) S3 {% D
  12.     protected $database;
    % m! q& Y1 C- ?& ^* n" @) _6 V
  13.     protected $collection;
    + v4 ^; ~+ r% U5 w& \
  14.     protected $bulk;
    & d% J* ?! I0 E; Y1 _' ?& Y3 X; ?3 I
  15.     protected $writeConcern;0 v  v& b; V% s# S( {4 }
  16.     protected $defaultConfig
    $ w( A, Q+ F0 G0 g! p/ O" u
  17.         = [
    ' Q' }* M9 F/ y, c( V) d/ M1 c
  18.             'hostname' => 'localhost',7 n  C, H% r( a5 |
  19.             'port' => '27017',4 b+ w9 v& y5 O- l6 o
  20.             'username' => '',3 a1 c% E# x' g& {! L
  21.             'password' => '',: `, C# n, \2 W8 S1 s
  22.             'database' => 'test'
    ' L  D& U3 I8 G9 z: b: }
  23.         ];
    / [" s2 A' F+ T) h2 q0 L

  24. ! m8 V9 K% T1 L/ @4 {/ }: D9 ~
  25.     public function __construct($config) {
    4 X$ a6 b0 P+ m; h; A2 T. j
  26.         $config = array_merge($this->defaultConfig, $config);
    # P6 P* l1 N! m7 M1 Q: q& l
  27.         $mongoServer = "mongodb://";
    , S( Q' y6 K4 \. s0 j" _; y. R" }9 P
  28.         if ($config['username']) {) t, d4 M. Z) z
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    , @$ f- x) S5 R1 r* H6 u8 G
  30.         }1 L9 g5 Y: p: Q7 X' Z
  31.         $mongoServer .= $config['hostname'];, |* I. x" P* _: H  @: T' M9 P
  32.         if ($config['port']) {
    2 i6 B% g+ H7 A0 F$ q
  33.             $mongoServer .= ':' . $config['port'];4 \2 p+ R2 |  T5 d
  34.         }
    $ s' \( ^6 W# U' u6 p; c, z
  35.         $mongoServer .= '/' . $config['database'];% _) \1 r  z) b
  36. $ X# E3 n; Q/ ]6 n0 J, K$ D) F0 |& m
  37.         $this->mongodb = new Manager($mongoServer);- F9 C! e, {+ V" c& f1 O3 l* Q! b
  38.         $this->database = $config['database'];
    * h/ @; z" K. Q1 {. c& {& p
  39.         $this->collection = $config['collection'];: [: u3 Y9 Y& u% U: c
  40.         $this->bulk = new BulkWrite();, h% I( D. D, {5 j
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    - @& w/ I( g+ g( y4 d
  42.     }
    + ?3 \6 m" P) H- e
  43. 5 w3 ]) ^+ m3 i- @. t9 r
  44.     public function query($where = [], $option = []) {
    , S" Z, @% E+ t5 j1 `
  45.         $query = new Query($where, $option);: W: H; o+ q6 B7 Z4 a1 Q5 {
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);% h$ f0 r! ]0 N
  47. ) u% y) F0 a5 V9 A. u
  48.         return json_encode($result);% Z( I* H: q- F( ~+ s8 n, i
  49.     }, U$ C8 ^: D/ ^1 W
  50. $ W& I! m+ j4 N
  51.     public function count($where = []) {7 S1 K  ]- N- d$ }  Z
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    1 m1 C+ m, P, ^& X0 h  z- j
  53.         $result = $this->mongodb->executeCommand($this->database, $command);  e; R7 s$ w. A" R0 d
  54.         $res = $result->toArray();8 N' m3 J; R8 n" I
  55.         $count = 0;
    + G1 P  q% a, o4 S* d3 l
  56.         if ($res) {
    $ ?0 C+ k: k5 G1 V& [1 K
  57.             $count = $res[0]->n;
    2 A3 A! X7 n( e) q5 C
  58.         }+ ^) D, u4 J8 t) j5 }& r

  59. 0 q; {. G7 }5 W
  60.         return $count;5 J( o& }5 w. L
  61.     }
    ) W0 [% s5 J( C4 e; {3 `. I
  62. ! t7 n# u3 D/ H- D
  63.     public function update($where = [], $update = [], $upsert = false) {
    7 [  o9 F6 G  F( z/ P1 R
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    7 s. Y0 o! k% C. W: Z# i
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);! R  Y1 f3 i, E$ A8 O
  66. ( j6 h4 }) o& c2 R/ ~/ ~1 C
  67.         return $result->getModifiedCount();$ t0 U9 U" ^- `/ c0 J/ T) w$ w, o
  68.     }
    ( r+ c! I0 E# p. N6 l2 g7 N

  69. 5 q/ a! v  i. q1 g3 m
  70.     public function insert($data = []) {
    8 ~& Z( a9 R' i. `
  71.         $this->bulk->insert($data);6 k: Q* @. ~2 P
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    9 Q# P+ L/ K* C

  73. 2 w( L0 y  ?9 l% ~7 B5 Z! R
  74.         return $result->getInsertedCount();
    * R6 q/ n0 W+ l+ o
  75.     }1 `) C$ \& c# A* y4 \! W1 F

  76. $ q5 N9 t" j8 j9 C
  77.     public function delete($where = [], $limit = 1) {
    $ ]! ]% b  l" J  O9 Z9 b
  78.         $this->bulk->delete($where, ['limit' => $limit]);# N: I" k# ^+ ?/ q4 S9 ?# f
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ! P2 c; q2 B' _9 z% J
  80. & v1 w( W$ Q, b5 E
  81.         return $result->getDeletedCount();; N5 M, h  {- ]( A# r. U
  82.     }% ^6 g3 |8 I$ F  A2 q3 S: R
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • . w8 l3 ?) @. q) O$ V* H
  1. new MongoClient();
复制代码
  • 5 m# C4 Z9 M/ m$ D$ [, ~& ^- @
  1. new MongoDB\Client();
复制代码
2.新增

  • 5 c3 s! ?5 u# c3 Y
  1. $collention->insert($array, $options);
复制代码
  • & @" b1 ]7 w8 e; a
  1. $resultOne = $collention->insertOne($array, $options);//单$ g; I' O1 G3 I# z" G" b7 s* G# a
  2. $lastId = $resultOne->getInsertedId();* Y+ o0 h  \6 [" H6 \7 m& o
  3. $resultMany = $collention->insertMany($array, $options);//多
    " f$ ?; K( q5 f3 r
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • 0 u1 }2 s. l0 Z, {( G; Z4 v
  1. $collention->update($condition, [9 w! I: e: s! j1 Q& r3 t* U, o! s
  2.     '$set' => $values
    , e5 V! n- ~8 U8 r, C1 d; R
  3. ,[
    * r7 J( a4 _4 {+ O  x) X
  4.     'multiple' => true//多条,单条false
    * x9 M$ {3 ]$ Y# g* N2 \
  5. ]);
复制代码

  • / B9 F" v4 @( Z' i* o
  1. $collection->updateOne(
    ! V0 q$ V0 B) n" Q1 }0 Z
  2.     ['state' => 'ny'],- X! h) @; V+ Y
  3.     ['$set' => ['country' => 'us']]
    ! l; A* |2 z% m8 _
  4. );
    % P# t) u/ G% w0 R: M6 S
  5. $updateResult = $collection->updateMany(
    4 `: y# s% n: ~# ]+ k
  6.     ['state' => 'ny'],
    8 l4 o% @2 m  b$ r  c8 j
  7.     ['$set' => ['country' => 'us']]
      d9 U, o; `6 P
  8. );  @) C+ Q2 Q. }+ A
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询
  • ( [5 Q0 Q0 D1 D/ x$ @
  1. $cursor = $collection->find($condition, [
    4 G* _3 @! X1 }. }. S( Z* Z
  2.     'name' => true//指定字段9 u* p# h2 n7 ]: D4 B7 M" r
  3. ]);2 w6 B; z1 @, U! I$ `
  4. $cursor->skip(5);
    - w0 |- [! y: \8 j9 P
  5. $cursor->limit(5);# t# J" l4 _% y/ `1 h" w- c
  6. $cursor->sort([5 c3 I' M6 G9 x3 n! J. ]
  7.     'time' => -1
    ! u0 H5 b$ h3 s' l* p; l
  8. ]);
复制代码
  • , S# C# N: X9 u; S  q$ c" I! q( m
  1. $cursor = $collection->find($condition, [
    + q( d3 F" v1 @7 W0 D
  2.     'skip' => 5,
    ' d) E) T7 W' O' K& j3 I  e( i4 D8 E' @
  3.     'limit' => 5,
    ) W9 ^2 y% @  O( }
  4.     'sort' => [( _+ M* N: l0 s9 }
  5.         'time' => -1
    6 s6 [. b8 J0 D6 q) R; m
  6.     ],//排序
    / a' u/ i. I1 e1 V$ Q" O
  7.     'projection' => [  ?% C! @* K# G5 s& A
  8.         'name' => 1//指定字段5 D+ d  x: Z- @, V# `+ I
  9.     ]5 x7 C( O5 o# K# _
  10. ]);
复制代码
5.删除
  • 8 A  m/ ^' u7 t! n3 G: b2 J' P% q6 `
  1. $collention->remove($condition, [
    ' V9 W6 U. g9 z; R
  2.     'justOne' => false//删单条* ]# d2 _; D4 t9 ?& I% b1 ?
  3. ]);8 R- D5 g3 q% n! O1 u# q
  4. $collention->remove([]);//删所有
复制代码
  •   ^3 p3 X  K, L# Y
  1. $result = $collention->deleteOne($condition, $options);
    " n7 o7 |3 E$ _' G! G4 D
  2. $collention->deleteMany($condition, $options);/ F: m, @9 C0 x) C% r7 q) h
  3. , g% z% ]9 |& w" ]$ f
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([4 D: g, L/ O; B  c+ A( j
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    5 ], P$ a. C7 v/ Q
  3. ], [
    ) [) _' \9 ?  i4 N2 i: p6 F
  4.     '$inc' => ['id' => 1]//自增9 N9 S) S2 u9 B; l0 P$ X
  5. ], [. I8 h9 ^  B9 V- k
  6.     '_id' => 0$ J1 F% I/ [" n
  7. ], [
    % P6 V3 t/ s. A2 B4 N
  8.     'new' => 1//返回修改后的结果,默认是修改前的4 F  T  w( f  _+ I2 Z0 w
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    ( }  w" s$ G. _  V" K& [
  2.     '_id' => $tableName# H2 s" g2 f% ?" z/ D- ]7 m
  3. ], [
    2 I9 A+ {7 n% f: t% C1 T
  4.     '$inc' => ['id' => 1]) G0 Q! r0 a6 f$ Z5 K
  5. ], [
    / I1 e( H' q1 W+ N
  6.     'projection' => ['id' => 1],
    ! S: V0 d- j) L- g7 v
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    4 {' D& ]% i% }, v. J- E5 M& A
  8. ]);
复制代码

1 C' J, _% Y- G7 v2 }* i, `7 K, R
# n6 O# D* X, z# z" s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:16 , Processed in 0.119256 second(s), 20 queries .

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