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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16553|回复: 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
    0 K  e  N, G% v

  2. ) ]0 W9 p" O* e6 y: x+ d! x5 q2 d
  3. use MongoDB\Driver\Manager;
    8 O! l' x" f* s4 S% M& X
  4. use MongoDB\Driver\BulkWrite;6 d7 U+ `0 a; {$ R/ r/ k
  5. use MongoDB\Driver\WriteConcern;
    ( j( k6 U) r8 E
  6. use MongoDB\Driver\Query;
    ( o$ n6 J1 d$ _) B
  7. use MongoDB\Driver\Command;
    7 J, i( |# S! T+ r7 p. }; h3 T3 o% X

  8. " U6 T/ a6 `4 {& f9 B  |: u
  9. class MongoDb {
    ) w5 k  t% K5 ]4 W- A
  10. : ~2 F4 J' \1 @6 H8 ?: V4 |; H! A
  11.     protected $mongodb;
    5 n6 X: k+ l# x
  12.     protected $database;
    ) F) R8 _- `$ p1 X1 @
  13.     protected $collection;  o( w, K% d) R# v- S: E
  14.     protected $bulk;
    ( z$ s) i8 F9 V7 C, ]- a- x0 H
  15.     protected $writeConcern;/ t( E6 e0 m* q! R) \# A5 K, z  g: |
  16.     protected $defaultConfig
    ( H7 \4 o! D9 B' x
  17.         = [: A2 U: F/ e3 q5 K# D. y; Y7 k
  18.             'hostname' => 'localhost',& N( k9 e7 ~9 U+ h
  19.             'port' => '27017',
    2 C9 Y6 j+ C$ o2 `2 b) D
  20.             'username' => '',+ w, c: {' B- t
  21.             'password' => '',
    ' p- I' v6 G* m8 ^# n
  22.             'database' => 'test'
    1 d1 c( L& q: A* O/ @2 z
  23.         ];; I% Z0 Y  S* x2 x, S- R
  24. 8 y, u: @$ M7 e* m% W# K
  25.     public function __construct($config) {
    6 e8 `0 \. ^: J0 u. s8 l+ Y# ]
  26.         $config = array_merge($this->defaultConfig, $config);
    , J- [( n# V/ \3 _, v7 Z+ L
  27.         $mongoServer = "mongodb://";# U6 B* J/ w" E5 `, n, o
  28.         if ($config['username']) {6 C( z2 B) z" p
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';/ }9 |! O1 F# Y; V
  30.         }
    2 L0 b2 K' W  X& u, R
  31.         $mongoServer .= $config['hostname'];
    1 H! R, E: C' j1 o0 I9 ?( B+ k
  32.         if ($config['port']) {1 J0 X! v. I1 O' ^1 }
  33.             $mongoServer .= ':' . $config['port'];# M2 k! _6 A1 J3 y8 |
  34.         }% k& h1 P- a" S% [( l3 l) u' ^
  35.         $mongoServer .= '/' . $config['database'];' ?5 `: C* Q5 W. C& H" {7 @& I
  36. - j; U' I4 R, A% Q0 A* N7 ^/ h( D, S6 c
  37.         $this->mongodb = new Manager($mongoServer);% ?! c- A# O) E2 A6 R7 t
  38.         $this->database = $config['database'];3 N: ]: Z4 s- f
  39.         $this->collection = $config['collection'];
    ; e: l6 t6 N- _) v0 g6 Y/ B
  40.         $this->bulk = new BulkWrite();+ Z7 }3 M) b& x9 E. u9 p
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);" Y( C( }8 _# k6 n: Q7 A+ d8 }* e. `: r0 L
  42.     }; U8 n2 c3 w# E- i
  43. : X" E0 S2 F% t7 _1 j
  44.     public function query($where = [], $option = []) {1 w2 H/ x  m4 |! u1 ~
  45.         $query = new Query($where, $option);) C. ?8 V+ y# f; m
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    8 F8 }( N$ P  I9 A2 H

  47. 4 U# o+ E8 p* A) Z& ]2 v
  48.         return json_encode($result);
    # ^  Y% B7 L; x! ]8 I$ \# F
  49.     }
    / \5 y$ A0 u% g0 t" |" K" ?

  50. 8 O3 V" B; z+ f4 s3 J  N2 o1 O
  51.     public function count($where = []) {
    $ C) o' w1 B  a* o# {9 C
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    % G" v# p* s6 F
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    ! e1 d: m, p( C
  54.         $res = $result->toArray();9 _1 f. z" p! m: J3 e4 ]
  55.         $count = 0;/ U! o( s) X/ r0 @- n( w8 U2 S5 O" c
  56.         if ($res) {
    6 I- m2 u# P& b7 f  `3 v$ L
  57.             $count = $res[0]->n;
    8 @/ \; e: A9 Q5 A* Q# G3 ]* ^
  58.         }
    # d. k; K7 {/ v3 e3 R: E. I% |

  59. 5 k$ Z" b. `" _3 J1 L. R9 I
  60.         return $count;" |7 T9 b6 g$ \0 }2 d& k% Q* {
  61.     }, A! h1 n. O/ v  `+ ?/ R
  62. 4 j+ M9 _7 V6 p6 e) \: R
  63.     public function update($where = [], $update = [], $upsert = false) {7 S( z& }7 I6 l) P. }( L4 O
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    ) f6 [& ^3 T0 K6 H7 u7 H( k$ g
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    6 x# [  C. o3 L4 h/ Z) S
  66. 2 o" q, X# y8 T" t5 R; e
  67.         return $result->getModifiedCount();
    / x4 E/ G. @9 b) b, {/ \# q
  68.     }
      i; W4 ?. r0 g, ~: }6 H
  69. 7 @+ I+ W5 [2 i& }1 g4 H( P6 y) m
  70.     public function insert($data = []) {
    1 k' c% ^* h6 j6 ~) c
  71.         $this->bulk->insert($data);5 H/ y* ?+ M. d) e2 {
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    8 ~9 L" l. A- C- s

  73. ; d9 ~# N, O0 n- h7 n
  74.         return $result->getInsertedCount();- e: U4 l  L% C
  75.     }
    7 O6 j& S8 F& j6 W

  76. / u4 p: r+ K+ s1 J* C6 o- b1 l
  77.     public function delete($where = [], $limit = 1) {. Z6 i; p' K" d; O
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    6 K& E' ~; K( u9 G5 l  ^' x
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    1 c, X) S/ N2 [# m. G: p9 P- ]

  80. 2 [* F1 ]: G) T% s5 u( @4 S/ g
  81.         return $result->getDeletedCount();) [- M. T( p% O! ^
  82.     }8 k6 I1 z8 k$ j9 |/ y' x, h2 L
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 7 L( ]1 Q( m" p9 i3 D' m
  1. new MongoClient();
复制代码

  • $ Q1 j4 v' q# p7 I: @
  1. new MongoDB\Client();
复制代码
2.新增
  • 5 F; {& g0 s. j1 x# |
  1. $collention->insert($array, $options);
复制代码
  • % K+ @+ L, |! b  U
  1. $resultOne = $collention->insertOne($array, $options);//单
    % I& m$ U/ {4 V6 g3 Z
  2. $lastId = $resultOne->getInsertedId();
    2 ?; ]- Y$ c7 R8 [0 P6 \/ g
  3. $resultMany = $collention->insertMany($array, $options);//多
    % K+ C+ D4 z9 b& V# A5 j
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • , J& \# b8 r+ q) M
  1. $collention->update($condition, [1 h, F+ g/ ^! e' i. i$ u
  2.     '$set' => $values
    # x+ x, }; e7 u" L4 ]$ |$ v2 j
  3. ,[8 w7 I) J3 M6 h% Z' F
  4.     'multiple' => true//多条,单条false4 h  C% s) b( f/ j/ y( a) r
  5. ]);
复制代码

  • ' @$ Y+ f4 r, e6 z- |
  1. $collection->updateOne(6 W6 |) _2 A  o" ^2 ?. f: o; x
  2.     ['state' => 'ny'],8 @9 B7 T- M1 C1 {- ^0 _2 {
  3.     ['$set' => ['country' => 'us']]
    ! \8 O8 @, k0 C9 @% P4 z8 C3 n
  4. );( J: I! r% o3 q" c* p8 C( w# E
  5. $updateResult = $collection->updateMany(3 P8 x0 @6 z. P* S& B
  6.     ['state' => 'ny'],
    1 {# ]8 e0 ], G) c8 W, x
  7.     ['$set' => ['country' => 'us']]' G7 E, A  K2 S; k  V
  8. );
    ' c, i# x! P/ d0 v1 W/ Z
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • : f, E$ i( h* K& \" I
  1. $cursor = $collection->find($condition, [
    1 c+ i9 ?* x% y9 X1 f( b
  2.     'name' => true//指定字段
    * B/ T" |( d; ]) X6 A1 x
  3. ]);) C7 D1 T% [3 Q7 F; D# m0 m/ e
  4. $cursor->skip(5);
    7 O6 d5 Q7 S7 A6 S! b
  5. $cursor->limit(5);
    * X3 k) ^7 e* o/ }7 S
  6. $cursor->sort([' {& e. Y6 M8 Z% B
  7.     'time' => -1
    ) x; t! d- j, }$ e, Y  }$ Q8 E
  8. ]);
复制代码
  • ! z7 b- x& a6 z) r7 f9 M, e6 S3 F
  1. $cursor = $collection->find($condition, [
    9 l1 N* `& G$ k6 j) J
  2.     'skip' => 5,. J, F& a+ s% l! p4 x$ W  `
  3.     'limit' => 5,
    ) }( I3 ~1 I+ b: C
  4.     'sort' => [; |. o% k2 y: v2 Q
  5.         'time' => -1
    2 K( \1 X9 B+ m+ y' T
  6.     ],//排序/ S/ g* M8 J. `2 j% X: j
  7.     'projection' => [; z7 r! O$ _" v3 |- n9 L
  8.         'name' => 1//指定字段* y; G7 G" l9 V$ q2 t
  9.     ]
    & R. ^% s# j. J; m) U
  10. ]);
复制代码
5.删除
  • 9 i! g0 u3 ~# `& a( |) R  N
  1. $collention->remove($condition, [* A8 D( r# f6 {
  2.     'justOne' => false//删单条
    / _: F4 H7 I- }6 ~. s9 O7 p0 K3 G0 z
  3. ]);  _3 f# q7 h) J' [/ V+ P9 ~! N3 [
  4. $collention->remove([]);//删所有
复制代码
  • 8 n& J* i, g3 c/ ~1 k' Q: f
  1. $result = $collention->deleteOne($condition, $options);3 m1 j! r8 d& s4 o& q' s' Y
  2. $collention->deleteMany($condition, $options);6 G. s# T' q3 Z9 l: E: \& t

  3. 2 D- s- m. m0 e8 F
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    % t; m/ s% Z  f7 }2 J1 y3 g% Z  m
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    / F; _% Z) ^6 u2 A/ Q8 v. _
  3. ], [
    # Y! c3 N- P# k0 {1 z/ W
  4.     '$inc' => ['id' => 1]//自增; X5 o; y) ]" x. v$ D
  5. ], [
    " P# o  O, Z! C2 {' P
  6.     '_id' => 0
    . _, {4 X4 ^1 j9 j7 M
  7. ], [- G5 P8 `# n/ A
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    % W' `/ x+ |; r' M& ~4 \
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    - @6 C! {. e4 j1 q: Y
  2.     '_id' => $tableName; \& q# c0 @& p3 c$ d1 u% w
  3. ], [6 X3 a( p7 [) u/ _
  4.     '$inc' => ['id' => 1]
    5 N# K; a1 T. G+ j
  5. ], [( Q! h! W1 P& x
  6.     'projection' => ['id' => 1],
    ) D; V7 F/ _! J2 V* f. @
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    ) n& l5 y* r9 W0 E# Q
  8. ]);
复制代码
$ H: H8 E% f# @. J' }
; Y- q) d. Q+ h5 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 04:17 , Processed in 0.059664 second(s), 19 queries .

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