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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16101|回复: 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
    . _3 z3 m4 I( {5 @" t# y
  2. : U5 R9 ^3 i2 p
  3. use MongoDB\Driver\Manager;
    9 R0 ~( f; F* }
  4. use MongoDB\Driver\BulkWrite;
    " A. @3 h; C, [/ Q" j
  5. use MongoDB\Driver\WriteConcern;7 z' ~2 \4 X& F$ W% J0 w- ]
  6. use MongoDB\Driver\Query;# p4 |% w; u/ P2 t6 p$ \2 M
  7. use MongoDB\Driver\Command;" q0 Q3 [  e5 E3 X1 u
  8. . g1 Y# `, k6 }2 [. M
  9. class MongoDb {
    0 b9 [% M: r% d, {% n5 M

  10. . X# c: d! @& @& x6 s- Y
  11.     protected $mongodb;
    1 L& [! n. U' ]( R* z9 [! m6 m0 |3 A
  12.     protected $database;
    & K: [$ T* i* Z$ S- {$ g
  13.     protected $collection;. N9 Q6 ~3 a. W9 i  Y0 b' S
  14.     protected $bulk;  h8 n5 B) q* W8 D
  15.     protected $writeConcern;7 ]  \1 Q( G* Y( w
  16.     protected $defaultConfig
    4 Y; W  O" O8 x3 x* [. k" R, ]
  17.         = [1 j3 Q( r* i* f7 q4 h  |
  18.             'hostname' => 'localhost',6 h- A- [+ m: @% Y7 j* v* b5 q
  19.             'port' => '27017',2 u* S$ \; P9 G  E: d4 i3 t
  20.             'username' => '',7 b8 p( K9 l2 v& H; Z* {4 l6 [( K
  21.             'password' => '',
    ( I2 g( O% J" H$ x0 s! {
  22.             'database' => 'test': x7 k6 m+ i1 \  s' }  P& N& {
  23.         ];+ Q4 p) b. x+ x7 l4 {. E5 B7 p
  24. ! \) I: K4 @8 z) [* C
  25.     public function __construct($config) {' @* q+ }- S" E8 m/ x8 Q% E0 B
  26.         $config = array_merge($this->defaultConfig, $config);& r* a$ l2 \0 W( r7 u6 S
  27.         $mongoServer = "mongodb://";
      }) X9 N; ^  A
  28.         if ($config['username']) {
    , a% G' S  w/ Z1 q2 l" ~! r
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';, \/ l. M( C( ]- g7 G) K' W, V3 ~
  30.         }
    5 D- |) h. C# n6 q& t
  31.         $mongoServer .= $config['hostname'];
    ' Y, H  t" Y8 P: B* Q3 h! p
  32.         if ($config['port']) {) \3 U: n5 |# w' {8 R
  33.             $mongoServer .= ':' . $config['port'];
    . p$ |# S# |6 M2 h  v
  34.         }4 `. v' m3 R* g9 j9 D' B
  35.         $mongoServer .= '/' . $config['database'];
    ; d* ^9 U: U4 L& Z( R

  36. ; |; E: A1 R4 A7 P: P* C
  37.         $this->mongodb = new Manager($mongoServer);
    4 L3 E( a2 L  N) [9 I3 \- ]
  38.         $this->database = $config['database'];7 N! V; G5 e3 s: Z
  39.         $this->collection = $config['collection'];
    2 G- `" _2 T+ g9 A; t' U
  40.         $this->bulk = new BulkWrite();3 m! b, i4 t) ?
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);% S* ]# O0 R0 N1 E9 Y1 m) K( W6 H
  42.     }: H0 `$ Q0 W' [7 n: |" n! J/ t

  43. # T* j( H$ `% v2 V8 d* S: ?
  44.     public function query($where = [], $option = []) {
    / Q6 [, i% O4 p, n- u
  45.         $query = new Query($where, $option);
    - n3 F' c  {; ~$ G
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);5 m, U, ]! _+ P2 P+ B

  47. . N# E& ?3 N/ W) a. I7 [
  48.         return json_encode($result);
    5 ]; x5 W( N: X! f; l
  49.     }
    ! G( ]7 F/ U8 s0 x

  50. % g/ U( A- e: v6 g2 G9 P- p9 |
  51.     public function count($where = []) {
    * i1 o7 i( Z7 j" N6 B7 O
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    , p6 X/ Y9 T, I" f8 x9 f- Z, O
  53.         $result = $this->mongodb->executeCommand($this->database, $command);3 U+ a2 B, y- s) d. x1 D3 z# _
  54.         $res = $result->toArray();
    + T  {( W1 q: L' e3 ?( H' R% \
  55.         $count = 0;
    ) r9 m: Q+ M0 E  c3 @) k3 a9 S
  56.         if ($res) {2 u. T) L% R& R: i% c' @% h" w/ S
  57.             $count = $res[0]->n;- n) Q0 B7 M' n/ B+ o9 g
  58.         }
    & o, M- K* ^! T4 [7 Q: K$ B+ u) H. t" w

  59. 4 D( }; h( \. |$ m, @% C
  60.         return $count;
    % k+ A2 f6 v2 O# l; K# u; M0 K
  61.     }
    ; A7 ^/ x4 C8 p0 m' k
  62. 8 `4 [2 D- z  Y
  63.     public function update($where = [], $update = [], $upsert = false) {
    7 p9 R* A" m3 \7 _6 p
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);2 M# r5 B% O" a. h6 ^* Y7 j5 P
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    4 g( R. x* z& e3 m: U2 q' e* ~3 `: S# d

  66. % P' Q1 H+ q" \3 `
  67.         return $result->getModifiedCount();
    & X7 J+ a( Q* B1 }7 g
  68.     }4 x3 d/ Z7 Z# R3 A7 H3 B) J) M
  69. ) k! K) T. e, n7 h. j
  70.     public function insert($data = []) {9 C2 H6 D+ t. q- f
  71.         $this->bulk->insert($data);: k, N. g5 b( h7 y$ W2 U6 W
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    $ W( L+ X' p# q: P# Y
  73. 7 _0 y* o" ]% S! R& V
  74.         return $result->getInsertedCount();
    3 |7 Z. @. a& z5 ]/ `* j3 S
  75.     }) q; R6 t- L( n- {: `3 O' T% K
  76. ) _9 h( a+ ^" c: s3 E6 X" `
  77.     public function delete($where = [], $limit = 1) {
    / V) p6 [+ Q& k' g* i
  78.         $this->bulk->delete($where, ['limit' => $limit]);9 B8 ?+ w9 P( o$ Q# e
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
      e! j. H1 U6 |- W# u' E: l
  80. 2 ]3 Z: a. w- }2 Y' U
  81.         return $result->getDeletedCount();  ?" Z6 p2 M7 r# v
  82.     }
    $ n6 g# h, M6 x0 [8 E
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • + p% l% h- i9 P+ H. B
  1. new MongoClient();
复制代码
  • ' z2 G* X& R7 e- K6 D; X9 h4 C
  1. new MongoDB\Client();
复制代码
2.新增
  • ' p! s5 ?! Y  k! t/ g. E1 D
  1. $collention->insert($array, $options);
复制代码

  • 5 w% n' d4 Y) p
  1. $resultOne = $collention->insertOne($array, $options);//单, |+ a5 j/ t: P( i% F  u
  2. $lastId = $resultOne->getInsertedId();
    3 V: i1 D4 R2 J7 z1 ]
  3. $resultMany = $collention->insertMany($array, $options);//多+ U/ a9 ~* _6 `& M' Z
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • * i8 W7 f7 _. }+ e& B
  1. $collention->update($condition, [
    " T: Q8 G, v8 ^6 T' H, m! c" [( }
  2.     '$set' => $values  e' m2 X! O8 ?) W" n& ^
  3. ,[8 _3 P# D7 m' ~+ S& e& g! ^
  4.     'multiple' => true//多条,单条false
    " j- p6 Z# J0 w) o2 l
  5. ]);
复制代码

  • * ]1 P2 T+ V2 u3 D
  1. $collection->updateOne(, r$ E8 C6 `, i& H) |! U- ?
  2.     ['state' => 'ny'],5 N# S! M5 ~7 |9 D$ q
  3.     ['$set' => ['country' => 'us']]
    - I* d/ b" l( P6 i$ V1 _
  4. );3 X, D. r4 |/ @/ H7 D& H  `
  5. $updateResult = $collection->updateMany($ X( R; F0 X2 j) c: z! h7 u$ w
  6.     ['state' => 'ny'],9 a1 ]- _. s0 K5 _+ W( U
  7.     ['$set' => ['country' => 'us']]
    % }6 f: z0 C3 t, M6 U4 h8 G( W+ X1 C
  8. );9 y$ g! E! H# q$ {/ m+ _) x
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询
  •   d4 k3 L& ~: @" o" o0 H. A: Q
  1. $cursor = $collection->find($condition, [8 W( Q  K+ o4 W2 O  u
  2.     'name' => true//指定字段& ]' b) u$ H2 g5 _8 f: |
  3. ]);; q6 E7 ^( X* Z( K/ s+ A
  4. $cursor->skip(5);! J( R* V+ n7 H
  5. $cursor->limit(5);
    2 E2 `8 P$ k# h
  6. $cursor->sort([: [* h: ?  z# l. f
  7.     'time' => -1
    ( R8 ]! i% O6 a$ j3 O0 D9 }; [
  8. ]);
复制代码

  • & t( A) ]2 s9 I" v! |8 g
  1. $cursor = $collection->find($condition, [. F/ Q5 _- d9 n2 ^' n) |) l
  2.     'skip' => 5,, R- Y4 y: s) V
  3.     'limit' => 5,
    2 ?. g1 {7 ]9 Y) @# s+ L3 i+ x
  4.     'sort' => [. F- q% F/ h1 s/ I
  5.         'time' => -1
    : ?3 ~) h$ q  D# s2 N: m
  6.     ],//排序3 |, S( V8 M0 E6 `& t6 V5 M
  7.     'projection' => [
    ' }  [2 F/ ]6 a( [+ w- J+ n
  8.         'name' => 1//指定字段
    # h- L$ h1 O) }$ `  a
  9.     ]4 N2 n) X% D8 c- f1 b- k* _
  10. ]);
复制代码
5.删除

  • 5 \# Y; ?- m( S# d7 u
  1. $collention->remove($condition, [, k. u5 Q$ h1 {7 h
  2.     'justOne' => false//删单条
    " |7 c& ?/ F0 X* N
  3. ]);- |8 t, B, R  T7 ^6 k: h& g  m
  4. $collention->remove([]);//删所有
复制代码

  • 3 Y$ |0 {* a) R* n) R
  1. $result = $collention->deleteOne($condition, $options);
    ! C8 I$ k8 ^7 {+ {
  2. $collention->deleteMany($condition, $options);; o7 l* S* \- E

  3. ; |* L( [3 h0 h& {. b( D, r
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([  A4 c: o* Q! J' g5 R* k; M! v- ^
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    ! |: q$ R2 r5 f2 s& F
  3. ], [: C0 B8 x4 f. q4 i% x. s3 C' b  h3 V
  4.     '$inc' => ['id' => 1]//自增
    / ~1 Z( S9 n3 A
  5. ], [9 [9 l5 t7 k3 E1 D  `
  6.     '_id' => 0! ?7 e( D' A- A/ [8 k6 R" z1 x
  7. ], [
    ! B* s& K. h4 I5 D. O
  8.     'new' => 1//返回修改后的结果,默认是修改前的& a, C& K+ ]% q7 H7 C' U# Z7 d
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    8 c: t9 F4 c& `. k2 {. x
  2.     '_id' => $tableName$ F1 G; |3 F$ ?5 \4 G
  3. ], [
    " r) d' a! M3 h
  4.     '$inc' => ['id' => 1]1 w) P. D6 O0 ^+ {
  5. ], [
    5 z& S& O$ q: ?  U
  6.     'projection' => ['id' => 1],- `% @' C. E4 \& j8 n
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER0 B) z5 h: Y- r) p
  8. ]);
复制代码

0 v0 x6 X& o6 C7 l" y/ n9 ]4 E) w& X* E
- y1 j8 O% ?6 U% J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 22:06 , Processed in 0.055493 second(s), 20 queries .

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