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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16363|回复: 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. <?php1 b. G3 X6 v  |& C7 ]) o+ U2 G

  2. / x! s! B: t  I, P& G7 C% s3 d
  3. use MongoDB\Driver\Manager;7 V, t) P* k# ]& a
  4. use MongoDB\Driver\BulkWrite;! e8 p5 l9 {5 H! {* I0 b' G
  5. use MongoDB\Driver\WriteConcern;2 [1 G6 [+ h9 G
  6. use MongoDB\Driver\Query;; d! M9 T1 Q0 e! r% T" p
  7. use MongoDB\Driver\Command;+ J, R9 j& _7 p* j/ A0 [
  8. 5 S7 i  U, e6 v' `% T' ~8 Q( |
  9. class MongoDb {
    8 k3 N  Y+ Z+ a7 m& V6 v7 r

  10. ( C- M+ x! z' L# F3 D, p, j0 w
  11.     protected $mongodb;% K. E2 l/ {" x# H7 M1 ]
  12.     protected $database;
    - W* s& _5 w$ |  ^$ h4 J
  13.     protected $collection;
    1 e' Z! m2 Y. G1 I& _& v
  14.     protected $bulk;6 S1 Y! l) b8 m- B/ [( s3 r3 ]/ N$ r7 Q
  15.     protected $writeConcern;! q8 b+ B4 {/ _- ~% H" A
  16.     protected $defaultConfig
    7 L8 @- q- D% ?3 n0 [
  17.         = [% a  t% I/ e2 e  p7 J) L
  18.             'hostname' => 'localhost',
    # ]5 n5 [; l4 R% M% I5 t& q
  19.             'port' => '27017',
    , Z4 h# V+ R5 E7 \/ V6 B! q+ `
  20.             'username' => '',
    % `7 ~% F3 M$ O7 y( X
  21.             'password' => '',! p( E& w/ d( H- B5 `/ Z
  22.             'database' => 'test'' O& F( z% b+ j9 [) c: ^+ E' P
  23.         ];- M" T0 I3 |) {
  24. 7 C- @; O3 p8 [, d3 Y' U7 F4 m( f
  25.     public function __construct($config) {6 T0 a/ x& J6 D- p
  26.         $config = array_merge($this->defaultConfig, $config);
    ) R4 w# y( P' H# _5 L
  27.         $mongoServer = "mongodb://";! ^$ K$ }- i% e
  28.         if ($config['username']) {
    1 r  H0 q5 N% k* T  ~
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    0 g% E, b* s( E, [% W, F, W+ Y
  30.         }
    ( t3 M: }: I: x+ b3 N
  31.         $mongoServer .= $config['hostname'];
    5 l7 Z7 q6 ?; ?
  32.         if ($config['port']) {" k2 P6 ]2 ]. k2 V$ U! Y* W( V2 j
  33.             $mongoServer .= ':' . $config['port'];! e; J! p% m* e9 f. \
  34.         }9 c3 D- K5 P9 p- O4 t: p* V- h
  35.         $mongoServer .= '/' . $config['database'];
    ( S, y6 z6 A( A& z$ n1 l% {5 W8 D

  36. $ B- R$ R: X7 D
  37.         $this->mongodb = new Manager($mongoServer);& T5 h8 [- X# O1 l3 ]3 s1 x3 o
  38.         $this->database = $config['database'];8 {9 Z8 _: L( M. B2 f
  39.         $this->collection = $config['collection'];
    4 K+ ^, a1 n6 Z2 M% {1 W
  40.         $this->bulk = new BulkWrite();
    * r. Z8 r' |- ^' C
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);) w% f) [/ r: A; u
  42.     }
    # i9 P! c: ^& D5 v: Z
  43. , x6 U& E% g: S7 H
  44.     public function query($where = [], $option = []) {
    2 }5 ^; V+ C6 [* l6 t! z
  45.         $query = new Query($where, $option);
    * b/ S, ]# n/ `- Y& g
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    : V3 m7 A; T5 I3 Z; o
  47. # R! R' v+ f. k  t/ s# F% R
  48.         return json_encode($result);
    3 G7 @9 f9 Y% n5 L+ S. U- L4 F
  49.     }
    8 h# C2 l- g! W- F$ x0 d
  50. / R; E9 N' {+ b: w  C6 p
  51.     public function count($where = []) {" D: |, @3 D2 w+ o) F6 N
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);5 R3 S# E3 r0 J; k, `+ p
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    9 q# N& Z% N: u5 n  Z$ \7 W/ X0 Z
  54.         $res = $result->toArray();! Y5 m3 M, }6 f5 m) \, U7 U) G. ~' r
  55.         $count = 0;. o2 I; x9 n  U- Y9 d3 h/ T
  56.         if ($res) {
    ' E; E$ c( B+ D2 I
  57.             $count = $res[0]->n;
    % i0 c* {  w( S7 m* N
  58.         }
    - ]+ K; P, j6 ~! q) E

  59. 5 B( [  h# S' P# A- F
  60.         return $count;( ~9 g/ A& v8 t/ D) y- x
  61.     }4 I, }( e0 Y7 O: {# r# Y

  62. ( r* }, A9 Q7 L# P( }
  63.     public function update($where = [], $update = [], $upsert = false) {. |' E# H5 B+ R' X
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);) O1 [1 y- o1 D4 F6 D
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);- j- X7 p6 O( ?6 j
  66. - H: R1 s, ]  W
  67.         return $result->getModifiedCount();& g9 _( p9 p- F+ Q( y$ P
  68.     }, N5 n: Z4 F0 ^9 N. N
  69. ; M3 m" m4 U. m6 f6 {' R6 E" Y. U
  70.     public function insert($data = []) {4 N  O$ T- Q0 u# S5 d
  71.         $this->bulk->insert($data);9 Y$ y9 l* [: V/ [
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);/ s0 m5 m5 n$ b8 z0 L+ v( }8 X
  73. : c) t! R" i% e6 Y" S
  74.         return $result->getInsertedCount();
    9 \/ n+ m. {* _7 ^( ]
  75.     }
    ) P' z+ @& e3 s& d

  76. # |/ n. t% O) }6 C' v9 F+ a$ \
  77.     public function delete($where = [], $limit = 1) {
    7 N7 I' f6 D, U+ B
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    ' @9 d  c. I+ r$ K  h% d
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ' {1 N: u; r9 b. z4 Q9 Q" x1 }

  80. 7 v6 Z5 x1 m/ a1 p9 S4 f; m
  81.         return $result->getDeletedCount();
    . I8 h$ Z- I; ]- s' }6 n
  82.     }6 b4 [- ?) u+ x, D* W
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • 4 u% v+ G: ], y6 B: R
  1. new MongoClient();
复制代码
  • . V  O/ W& {5 L; }
  1. new MongoDB\Client();
复制代码
2.新增
  • 2 x' x! h1 p- T2 T
  1. $collention->insert($array, $options);
复制代码
  • , e+ s; t5 U3 t* G- S/ `' v
  1. $resultOne = $collention->insertOne($array, $options);//单
    ) |6 Z' \1 P9 \' x. J4 {, R
  2. $lastId = $resultOne->getInsertedId();
    . m) ]/ F% o0 |! I2 d
  3. $resultMany = $collention->insertMany($array, $options);//多% E, F3 \7 ~! l4 {$ B. u
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • + P, @) {) L( l0 u' s& G) S
  1. $collention->update($condition, [
    ! L, u3 s, X9 |) Q" x. p2 `2 H
  2.     '$set' => $values1 I7 O& C4 {5 H# b
  3. ,[+ S3 R: `% m9 L% }; M( s
  4.     'multiple' => true//多条,单条false
    ; n! k, h8 ^& o
  5. ]);
复制代码
  • * A7 R0 O' A/ m# W: `) M" p
  1. $collection->updateOne(
    ! ?$ T' K6 n8 a" ~' o) v) h6 c' V2 Z: ~. a5 ?
  2.     ['state' => 'ny'],% X. M( h+ V' m' F4 R
  3.     ['$set' => ['country' => 'us']]
    + k6 \" z- \' O$ G- Z1 G
  4. );
    + `4 K$ O4 s, S' B3 P- R6 ^7 L/ q
  5. $updateResult = $collection->updateMany(, a/ m# B1 R! ^5 x8 f" c: D
  6.     ['state' => 'ny'],7 l/ V. X, W4 p1 ^- v( w8 \! m
  7.     ['$set' => ['country' => 'us']]: t9 S0 |! F. T; j5 b% ]
  8. );  C" ~. D% ~$ p4 W3 `6 a4 @
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • ! \: S" E( v) O/ ^9 c7 o
  1. $cursor = $collection->find($condition, [
    2 o" W# S$ e6 K! ^, p
  2.     'name' => true//指定字段
    3 s6 n. O& {7 B  v2 G$ _
  3. ]);
    6 Q" V" h( @) G  N7 g
  4. $cursor->skip(5);
    " \  N0 q$ n5 n2 c" Y6 ~$ {9 J
  5. $cursor->limit(5);
    ' h9 y  t9 @$ c) J8 ?% x: K
  6. $cursor->sort([' R- r) ?7 y9 m
  7.     'time' => -1) c, k) i6 O6 j6 K! J
  8. ]);
复制代码
  • . p1 d  g( Q0 r- K; x- E
  1. $cursor = $collection->find($condition, [
    9 k6 A% K! a3 y  L1 k1 i3 G6 V
  2.     'skip' => 5,. |  W4 J4 k" c" G
  3.     'limit' => 5,  \: {" m. ~' w9 k$ C
  4.     'sort' => [7 [* u8 E3 ~, n. D$ D, u5 W
  5.         'time' => -1
    3 u5 H8 ^2 x0 ]3 }, ]  I7 \3 [
  6.     ],//排序* d% P0 _5 M( X
  7.     'projection' => [
    " q  k; j6 H& s& v4 b' L6 p
  8.         'name' => 1//指定字段8 S6 D& A0 [0 c% O+ n6 {
  9.     ]/ L  G4 f# d5 W* p
  10. ]);
复制代码
5.删除
  • 7 X7 e  V% u  `2 U- D. j! q
  1. $collention->remove($condition, [* m; x# I8 k% n
  2.     'justOne' => false//删单条2 t" {0 m: G! v% v& z% l, K
  3. ]);, p7 j1 h9 y$ `) h
  4. $collention->remove([]);//删所有
复制代码

  • + P9 l6 ?: Q# a( R& m- @7 w
  1. $result = $collention->deleteOne($condition, $options);7 \& O* m2 Q( C$ E, H5 n: D7 k
  2. $collention->deleteMany($condition, $options);1 Q1 v/ i; e( m

  3. + F: [: }0 H6 z
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([3 M+ S1 [: ?* Q
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    & ~# p/ t2 A2 |: ~: `
  3. ], [$ ?3 K9 n- N9 h9 }( j
  4.     '$inc' => ['id' => 1]//自增
      b% E# u" A4 F1 p" C
  5. ], [( g0 [6 G( Y8 h
  6.     '_id' => 0
    3 y  h# q+ t+ `' m
  7. ], [
    3 ~. f5 y7 W% L9 R: B' f& {
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    5 f, g- ~# A, N) y/ Q, a
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([9 x8 J$ S" \7 {0 x+ v
  2.     '_id' => $tableName3 m# \  |6 S! K9 x" a& j
  3. ], [& a+ M7 g5 Q* x
  4.     '$inc' => ['id' => 1]9 q& R! j7 k) H7 e
  5. ], [
    1 @% z* ~" _( H$ O5 q0 w3 L' r
  6.     'projection' => ['id' => 1],
    " C! o- G! m7 q  N
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    1 O0 \5 w0 `, Q) ]& ]" I! }
  8. ]);
复制代码
, K. Y# \1 a* S

5 C4 Z( I) k# h  O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 21:45 , Processed in 0.072174 second(s), 20 queries .

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