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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11528|回复: 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. <?php2 I% t6 h, n! m; F% E. e9 u/ |

  2. " P! Z( y- j1 ?" P5 R. \( _: w
  3. use MongoDB\Driver\Manager;2 y6 z" v9 g" |. G# s2 |
  4. use MongoDB\Driver\BulkWrite;
    " g* C2 K0 L; V& p
  5. use MongoDB\Driver\WriteConcern;8 {, `( G8 y0 E6 R3 F+ Z/ f
  6. use MongoDB\Driver\Query;
    - l2 z0 U: B  f% t3 R
  7. use MongoDB\Driver\Command;
      I1 l4 j) a1 [# j* k+ p+ d
  8. * \* ]. b6 @; ^
  9. class MongoDb {# _# y* J( ?+ R% g8 W1 X. L
  10. $ C6 I) h5 z5 }* @8 d7 j2 s- `
  11.     protected $mongodb;3 `: c5 I3 T! B/ i; Z
  12.     protected $database;
    / S: X! U2 Q" |! w- S+ |
  13.     protected $collection;
    - ?7 z# ~/ _. |  F7 K. M
  14.     protected $bulk;, l5 u0 g+ ?; z+ Y; G
  15.     protected $writeConcern;) A) _( |8 \, [: ?+ K
  16.     protected $defaultConfig1 l7 t2 y3 E5 I" ]# z; k
  17.         = [$ V; E* {# Y1 z4 `3 |
  18.             'hostname' => 'localhost',
    * E% k: w# O- e# @
  19.             'port' => '27017',
    % G; a" m" M3 G- O2 f
  20.             'username' => '',
    . W9 r0 U+ D. K" v% q1 A
  21.             'password' => '',0 ~4 F2 O6 o/ P+ X
  22.             'database' => 'test'
    , D: H9 N& W2 l' V3 }+ E
  23.         ];
    , U- A9 z! O) i

  24. 8 a: ]7 q( k5 F* {( u" _9 N
  25.     public function __construct($config) {
    6 \6 Q* s" f- e# C% Y% i' N
  26.         $config = array_merge($this->defaultConfig, $config);- Q  \, q/ E$ Z' v2 |* }* w. J+ _
  27.         $mongoServer = "mongodb://";
    ! ^1 u; q  T" m; e6 Z. m$ J1 H/ D. N
  28.         if ($config['username']) {* j# ^) d* z' P! @! |
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    8 G9 J: x" k8 K3 L; Q& D; x
  30.         }* t; }4 q9 L% m* b! K; s
  31.         $mongoServer .= $config['hostname'];
    8 [0 r- X" x) ?# O7 }
  32.         if ($config['port']) {
    6 W/ I9 ?# g- u2 |# h+ p
  33.             $mongoServer .= ':' . $config['port'];2 A2 k& `2 u/ j! o( \2 e
  34.         }
    - C1 q$ ?0 H. g
  35.         $mongoServer .= '/' . $config['database'];
    5 ]+ O# \8 n6 B2 t4 [6 k5 [

  36. ; O3 B; W; r8 d% z$ {
  37.         $this->mongodb = new Manager($mongoServer);
    6 |/ G- t. m; O5 u8 ]
  38.         $this->database = $config['database'];" K3 m. J# t5 M! d0 }; X2 Z
  39.         $this->collection = $config['collection'];6 |, W; z; Y$ Y0 }* [+ f; u- Y& |
  40.         $this->bulk = new BulkWrite();$ o1 W0 O/ g) j! L
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    8 a/ g) z8 w1 `/ H- u" M
  42.     }
    1 t* ?3 `  k7 ]$ M* J1 z6 ^8 [0 b

  43. % a3 Q0 }9 K! \/ v. q: \2 U' ~
  44.     public function query($where = [], $option = []) {( w3 z* \, |: |8 `$ ^# h& j# w9 Y7 R0 p
  45.         $query = new Query($where, $option);+ h0 ~/ G6 S: ?
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    ( F! d# \8 B! p9 h4 O3 A& `; o

  47. . Y* A3 f/ q1 F/ R& S9 a& X
  48.         return json_encode($result);
    # Y  ]+ b8 r3 v1 p+ _
  49.     }" l1 p- ]7 f3 J. v% i: ~
  50. " g- N$ O0 U3 ]- E. i# r
  51.     public function count($where = []) {
    : n! T3 i  u' e* v; I. A2 I; [
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);2 E" Y( y; A4 Q' U9 p$ Q
  53.         $result = $this->mongodb->executeCommand($this->database, $command);7 b# o2 ~- P% O+ |4 V( U$ H/ K
  54.         $res = $result->toArray();
    $ F$ a' N$ |3 F& o- z, W; z; \) ?# `
  55.         $count = 0;
    2 ^" x2 g0 ~3 _7 {' _$ v* T
  56.         if ($res) {
    , i% \' P0 u2 v3 U* i8 C
  57.             $count = $res[0]->n;  q1 J8 z" p7 Y* l1 e" {% |
  58.         }
    * p: O  f  {& i) ^: d( W+ I, K) n

  59. * q- y( {' Z* a. b9 `+ y0 D2 R
  60.         return $count;
    * p; v" o0 T1 Q& j
  61.     }9 l- j5 H* j1 a7 p( M
  62. : I( e! W  e/ ^) R# _* U  K
  63.     public function update($where = [], $update = [], $upsert = false) {. d, m- r/ ^4 }! s' u* l( ~5 x
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);, X  m' z/ v0 R; h+ Z- v
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);4 {' l2 P* A. R5 r

  66. ( F1 |# Q2 Y3 u! X( C* j
  67.         return $result->getModifiedCount();
    % Z) F! }* r0 w3 X! Y
  68.     }
    8 f3 W. s0 v- R

  69. 6 }3 p+ w0 f0 E3 F
  70.     public function insert($data = []) {
    & C' v5 o  e* ^1 a. X
  71.         $this->bulk->insert($data);
    ' Z# W- S6 r9 c1 R. @" j, D
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);1 b( J: w+ `! q3 G" X
  73. " I. ?5 b0 s0 d1 M" i
  74.         return $result->getInsertedCount();2 I1 c( u6 Z4 `  B
  75.     }6 Z4 M# ^8 @2 H! o, i
  76.   m9 C. M6 b! d6 a* ]* f
  77.     public function delete($where = [], $limit = 1) {
    3 S! `4 y# ^6 J; K  ?
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    ( }9 ]9 g6 h6 Y7 s! Q
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ( d& c* x- c. i! T
  80.   ~* X5 b8 L8 f1 W
  81.         return $result->getDeletedCount();
    , G8 L* w4 B2 `. q
  82.     }
    " l. B. m- f! U0 E' a* h
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • + K) t" V2 e+ `: j
  1. new MongoClient();
复制代码
  • ( [  P; `4 @* b! b
  1. new MongoDB\Client();
复制代码
2.新增
  • ' O, ^: L7 Q- o0 V% E
  1. $collention->insert($array, $options);
复制代码

  • 4 A' u0 \2 c; y: D( I
  1. $resultOne = $collention->insertOne($array, $options);//单. ]9 A; l0 L) Y
  2. $lastId = $resultOne->getInsertedId();7 E% V' k' ~! i# U) Q$ V+ v8 V
  3. $resultMany = $collention->insertMany($array, $options);//多
    6 F* T+ |! h2 L! ~' _
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • ' t3 }( y. m: [% @, D9 n
  1. $collention->update($condition, [( h. @; z: A; {
  2.     '$set' => $values
    * l* {' Y9 }( P) @- n7 W
  3. ,[
    : v9 n# C' G5 ~( W) i& v
  4.     'multiple' => true//多条,单条false
    % o! v1 h& ^4 u0 [2 E
  5. ]);
复制代码
  • " S6 X3 y/ S( B0 c, p& o
  1. $collection->updateOne(
    * ]% K, d) V0 [$ l2 P7 H- u3 m
  2.     ['state' => 'ny'],
    " o' q% E4 g8 _) k1 ?6 n( I
  3.     ['$set' => ['country' => 'us']]
    % Z. j) d* m2 |  I. b
  4. );1 K/ B( \+ h% R* `& Z* O- e
  5. $updateResult = $collection->updateMany($ z5 E3 u/ b$ h9 q" `) z2 R! {8 R. a
  6.     ['state' => 'ny'],' E1 ^) j' o# T8 ], l
  7.     ['$set' => ['country' => 'us']]
    / G# T/ X% x) `7 d+ N# [) B$ m4 E
  8. );" ]9 l' _8 a7 y+ j# I+ E7 C$ U
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • * O* g6 @% l& a0 R; W' s. j
  1. $cursor = $collection->find($condition, [4 K) F6 m4 X  S' n$ Q  a: w/ R; m: o
  2.     'name' => true//指定字段( R* }* |  h! i$ E& u' c; Q( [
  3. ]);9 g9 d0 d% H. @5 c& O
  4. $cursor->skip(5);/ e" V. s7 @6 z% N' _
  5. $cursor->limit(5);
    , c5 d1 f0 V7 E0 z& c. h
  6. $cursor->sort([1 v4 M& ?* ?9 O' Z
  7.     'time' => -1- g# a% a  C; |  U$ L0 S  w
  8. ]);
复制代码

  • & c: M/ D& l7 b5 A$ ]$ y$ s+ f
  1. $cursor = $collection->find($condition, [
    + @: b+ O- N: }% `+ J$ a! `
  2.     'skip' => 5,
    - G' U" g3 K  G; i8 p
  3.     'limit' => 5,
    + U& A. |5 f5 q) e
  4.     'sort' => [% ^. f- K  ^  `2 k4 \, Z
  5.         'time' => -1
    / k/ ~9 J# d! J) L$ _/ B' X
  6.     ],//排序0 x: E. c$ w  w8 H9 z. y5 C4 G
  7.     'projection' => [
    : `" B! G$ Q, q2 O, V
  8.         'name' => 1//指定字段
    6 m; M# Y5 q( g8 V
  9.     ]
    ( J* I( j  Y& D" s& B
  10. ]);
复制代码
5.删除

  • " R7 Q7 D; H, c( O
  1. $collention->remove($condition, [6 H+ F0 e- s6 S8 @! s3 h- I; Y9 S
  2.     'justOne' => false//删单条6 X0 R% C8 R0 _: @1 d2 h
  3. ]);+ j# q( `* u. C- f, X7 s2 w  B
  4. $collention->remove([]);//删所有
复制代码

  • ! m. r; m/ B3 R" B$ Q; Q" c
  1. $result = $collention->deleteOne($condition, $options);
      U/ q1 x' `% N2 j
  2. $collention->deleteMany($condition, $options);
    $ Z: f; j+ q8 g2 m+ R" Z

  3. " ~3 H2 }2 Y0 h- F5 y9 E/ Q2 J$ D
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    & m# t) T- c5 _. H, @) p
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键: W: P1 {& @7 ]* }4 j
  3. ], [4 d1 `) h5 v, |( U/ I
  4.     '$inc' => ['id' => 1]//自增+ A/ u0 J3 D2 Y' x8 f/ \9 j
  5. ], [
    ' i; {* D6 `. s" q$ R
  6.     '_id' => 0
    $ E6 \! N' [; Y+ u
  7. ], [& H5 b# X3 p! ?
  8.     'new' => 1//返回修改后的结果,默认是修改前的5 S0 K1 ~2 K2 w7 B
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    3 ^3 u* v3 }: y0 B* W
  2.     '_id' => $tableName- Y( F. \! N) C, o- c* X( i
  3. ], [( j+ }3 D4 C& N+ T) g
  4.     '$inc' => ['id' => 1]
    9 b2 h! |: L( \, P) j4 s3 l
  5. ], [& B2 W/ P! Z% y5 p
  6.     'projection' => ['id' => 1],) s+ z! S' M) q! Y2 \5 |
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER% v+ D7 y& c' C5 }; X# e6 C
  8. ]);
复制代码
& y6 Y& A3 t- W% a
) I- I6 L$ K7 ]4 C8 O9 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 17:30 , Processed in 0.114813 second(s), 21 queries .

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