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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11408|回复: 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
    ! h, t% L  Q, F4 L' g
  2. 2 e: [1 C# m+ k
  3. use MongoDB\Driver\Manager;
    # q0 ]4 E* c/ H0 H
  4. use MongoDB\Driver\BulkWrite;
    # w8 F; x( X- S, c% c  z
  5. use MongoDB\Driver\WriteConcern;
    $ g" G! r1 M+ w$ Z( A) w0 W3 ^& C
  6. use MongoDB\Driver\Query;
      o* E3 x+ o; R& K
  7. use MongoDB\Driver\Command;+ l4 n+ G7 c7 B: s, E2 l
  8. + y  f/ }) t% p1 R3 C* q. F* S5 r
  9. class MongoDb {7 `! a! x# N4 e6 p( Q9 E9 d  S

  10. 2 R9 e; g! _: V. O$ g8 Z' J
  11.     protected $mongodb;
    5 T, i- R1 D( D
  12.     protected $database;
    4 a& h4 L$ I6 |& N2 c& g
  13.     protected $collection;2 T4 V4 E" _" F3 F; O
  14.     protected $bulk;
    ! M) Y' w6 i0 n& S" e0 I* i4 Q# c
  15.     protected $writeConcern;4 d0 j7 D$ U$ R4 ?: `
  16.     protected $defaultConfig
    " I& {) H* @" F  Z
  17.         = [+ @1 r9 I! S" p- z* C+ U3 ~: O
  18.             'hostname' => 'localhost',. T" J$ O; G/ i) k8 r# A
  19.             'port' => '27017',
    & ]8 Q+ M% p0 m! Z* s2 q
  20.             'username' => '',$ G6 \3 y+ K" r, L- z* k) h
  21.             'password' => '',/ }# j1 o( O8 j; z5 P0 R+ `, z
  22.             'database' => 'test'
    1 R' U  u/ x9 e# S
  23.         ];
    % L6 U2 R. c0 K& Z/ ^' o& o
  24. . W4 F6 G7 n1 ^" U$ Z5 f
  25.     public function __construct($config) {/ e% X0 G/ u4 k' e9 A  ~
  26.         $config = array_merge($this->defaultConfig, $config);9 R, _" p' y7 g
  27.         $mongoServer = "mongodb://";
    ' r' i/ ~) w4 f$ P
  28.         if ($config['username']) {6 ~4 Z* R1 K$ e- t7 Z* l
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';. t% J4 j, V! J# i
  30.         }; k* ]$ h- ?! V4 U' ^. }
  31.         $mongoServer .= $config['hostname'];; x" U0 R  s  ^5 Q) f9 e
  32.         if ($config['port']) {% u# F* x% B5 Y6 B2 O
  33.             $mongoServer .= ':' . $config['port'];
    , g$ l: d& x: v- U2 ?
  34.         }$ t3 `( k3 G( ?9 B  j( Z4 L
  35.         $mongoServer .= '/' . $config['database'];
    + |. N8 K3 j) _9 R) I  I; t( P

  36. ; S1 y! N6 ]- f! Z; t9 p1 P# ~
  37.         $this->mongodb = new Manager($mongoServer);6 j( c( E. W4 z- C
  38.         $this->database = $config['database'];
    6 R* n. b8 C2 h* T
  39.         $this->collection = $config['collection'];- Y" D; \+ m; C, k* ]6 j) c- [; d
  40.         $this->bulk = new BulkWrite();
    / m% n# J) v4 T" D& v
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);" @2 {: g1 U5 }6 H* e) o2 V
  42.     }1 \2 _2 q3 _8 F; N9 P- j' Q2 I% a4 B
  43. / n: R$ u& u! z$ y6 w
  44.     public function query($where = [], $option = []) {+ t' P* o3 F  S/ s
  45.         $query = new Query($where, $option);
    . i1 K, E5 n3 f# K+ [6 X
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    + W- N0 q! p6 E6 D

  47. . ]+ x, I- c/ v% r  F# G
  48.         return json_encode($result);8 F4 g, Y" n: m8 E$ }" d# ^
  49.     }3 l& J0 z% Q2 g5 T$ s) M

  50. . L* a  U- Z" ]
  51.     public function count($where = []) {
    2 B% H# D/ l' O5 I" w# H
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);& K: t  O4 W; j# B' g
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    4 u9 J$ p& e4 t3 @! Y2 I) O
  54.         $res = $result->toArray();$ d1 ^9 K- W1 `; i+ ^% a
  55.         $count = 0;
    % ~  F$ u* s3 i' M: M% p
  56.         if ($res) {
    3 B9 ~. t" @$ Y. L9 d
  57.             $count = $res[0]->n;
    4 P2 [) t" w3 K
  58.         }
    . U0 u* C8 M2 `( M) e) m" e' R4 n
  59.   g# T# b, _& y9 F
  60.         return $count;6 }9 V" \9 Y' w! K: i
  61.     }
    ( N! p3 }/ ]5 P0 a" I. J

  62. : Y) S5 r, \2 b" D
  63.     public function update($where = [], $update = [], $upsert = false) {
    / [/ O0 h9 c, w( d  q  a8 Z& y, z
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);7 Z3 V* v+ F4 j8 B9 h% \1 W
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);1 J8 w) t8 p6 |3 u8 `
  66. ) [8 s, h6 m+ z) e) F3 `
  67.         return $result->getModifiedCount();
    , ^( ~* n. q2 Y. |. j$ K! O
  68.     }
    / R9 g- ~3 M. S8 _
  69. 0 N+ m. j4 _$ W- r& l
  70.     public function insert($data = []) {
    8 k& b) i1 q! y/ j( D/ ?" M) p( G; S
  71.         $this->bulk->insert($data);7 f/ ]6 G7 S, D' M* S( a) {$ ?# y
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);2 G$ Y+ _) O. e- ?. r% ]

  73. 2 T) v; J8 o5 S' N: f  W4 d' p
  74.         return $result->getInsertedCount();' D9 ?! [# B0 h
  75.     }
    & `- x7 [) R) b" m, c2 s" q
  76. $ l( V/ k1 F2 x# m6 T
  77.     public function delete($where = [], $limit = 1) {& c# |" x  A/ J
  78.         $this->bulk->delete($where, ['limit' => $limit]);) y& n: C3 r$ ^+ ?1 a. A/ r
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    : `" P; N- M1 L

  80. / T, U, ]' |' T5 v2 n
  81.         return $result->getDeletedCount();
    1 B% ?/ K* ]- c4 q
  82.     }  E4 s0 p' U6 \, b0 Z
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 7 b( k, D9 w, w0 O: X  D
  1. new MongoClient();
复制代码
  • % z% V' N9 f3 e( ?8 J' }4 G1 T* s% U
  1. new MongoDB\Client();
复制代码
2.新增

  • # Q* P" I$ T) @! [6 [8 M$ T
  1. $collention->insert($array, $options);
复制代码
  • 3 J( i! }4 u8 O$ Y6 T( T8 s  B
  1. $resultOne = $collention->insertOne($array, $options);//单
    . J! k0 e& `( V2 p  w! A
  2. $lastId = $resultOne->getInsertedId();
    / K8 Y& b4 x! A& L! j9 s
  3. $resultMany = $collention->insertMany($array, $options);//多
    ( y" i* R' v- h
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • ' L3 l% H8 U( d* e" o2 U
  1. $collention->update($condition, [
    6 T6 u+ A) \3 U3 e
  2.     '$set' => $values& n+ }. d. C# h5 f
  3. ,[
    3 ^8 C/ x7 R0 b4 ]! @1 T
  4.     'multiple' => true//多条,单条false. V2 {. v' T( X1 |% T: B8 C
  5. ]);
复制代码
  • & k5 j$ }$ X8 a2 L& s( v
  1. $collection->updateOne(6 P, M4 Z! s6 D, q( n0 Q
  2.     ['state' => 'ny'],( u$ l, W1 I* t; C% Y* g$ C
  3.     ['$set' => ['country' => 'us']]# c' R7 W) B5 K- E  F! J
  4. );7 ]7 x. a! `2 q" O1 c  s
  5. $updateResult = $collection->updateMany(
    7 E) {. w9 B, x7 ?& P9 g" f
  6.     ['state' => 'ny'],8 |' @. @6 t0 z5 F1 D% _+ a
  7.     ['$set' => ['country' => 'us']]$ a/ z% |: N  y( g3 N% w- I
  8. );
    ( _  N# P. z9 ]
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • % n& H) ^; L8 {2 T2 ]
  1. $cursor = $collection->find($condition, [
    6 X  x' o. \  v2 Q% J
  2.     'name' => true//指定字段' V0 J4 ]+ o; R& C$ e- t3 u5 D- k0 ~
  3. ]);
    , ]- E7 C3 s* P6 t
  4. $cursor->skip(5);
    $ l- z! U5 I0 e8 a9 _' Y
  5. $cursor->limit(5);
    2 A, e+ X  q& X- K
  6. $cursor->sort([7 j3 N+ R0 i! V) h, k/ ^7 R( T8 g
  7.     'time' => -1
    3 E. N- Y) c! k* s7 e
  8. ]);
复制代码
  • % ~, b  B) K1 B. Z
  1. $cursor = $collection->find($condition, [
    7 E; g$ y3 S3 e2 P, W* }3 l. `
  2.     'skip' => 5,
      U$ ^/ {% m" }; m
  3.     'limit' => 5,1 ?% X/ K- `* |% P# L
  4.     'sort' => [1 ]5 ^  S4 l  `4 q, V: {
  5.         'time' => -1
    - j9 ]4 i5 H0 _$ \; I) k: R: y, F
  6.     ],//排序4 P2 L! C4 C: P* I& n
  7.     'projection' => [$ o9 b$ G0 Q# O0 {
  8.         'name' => 1//指定字段
    # q' n2 g* Q# c/ ]3 a
  9.     ]
    ; L; i$ A) N' W0 s( r! Z1 F
  10. ]);
复制代码
5.删除

  • / O& _9 f6 }9 F
  1. $collention->remove($condition, [, G+ [7 P5 Y$ y) `: V' z
  2.     'justOne' => false//删单条' W) a2 Y3 p" r1 u- \5 L: t+ w
  3. ]);/ L- Q0 E$ v( d. l5 |# }1 m* a
  4. $collention->remove([]);//删所有
复制代码

  • ; R: n) O! z8 f7 W7 a& {" A3 j
  1. $result = $collention->deleteOne($condition, $options);  U5 n- i+ [) W6 n& I) p
  2. $collention->deleteMany($condition, $options);
    3 u0 f1 i/ i5 l. @* f7 @; v0 J, `

  3. : S- |) R* E- t4 ?6 U
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    ) I, L! D. Q" ^9 z. T! W
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键% z" _. v8 W4 n' L
  3. ], [# w% ]: b4 P5 Y% x% g# q
  4.     '$inc' => ['id' => 1]//自增
    1 K: |) N  f8 p* k9 c+ p
  5. ], [) M3 u: X) [3 x7 B0 P+ y- K
  6.     '_id' => 0
    3 I  o) ]/ {, e7 q) b4 d
  7. ], [8 h& `+ F& i! K7 C# [
  8.     'new' => 1//返回修改后的结果,默认是修改前的0 ?4 P  y$ V! {& ~
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([9 S6 a* i( h& j0 @
  2.     '_id' => $tableName2 S& n) B* M% l8 l/ a3 Y
  3. ], [, T7 A* P6 G8 Q# D8 @' W
  4.     '$inc' => ['id' => 1]. ~6 v. v+ U3 b/ y( l. y6 k
  5. ], [" s5 L9 U" g0 y- l9 B
  6.     'projection' => ['id' => 1],
    ) M7 R* B) H. j
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
      ?, u; p# t9 c: L/ h- }
  8. ]);
复制代码
% Q: O9 `% G! q% g
, [1 l0 b9 f" [( d0 X, Q4 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-9 10:52 , Processed in 0.144967 second(s), 21 queries .

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