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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16083|回复: 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 u! y0 f! H9 V( p4 f1 }
  2. * a" h' ]( S7 W4 f& t
  3. use MongoDB\Driver\Manager;& [( d6 e- J7 x& w5 Q3 b) B
  4. use MongoDB\Driver\BulkWrite;
    ' [$ X8 }' o  p! P3 w' H$ ]7 J/ Z) T
  5. use MongoDB\Driver\WriteConcern;/ z# Z- c* m! S8 M0 t2 ~
  6. use MongoDB\Driver\Query;
    0 D( {- j7 P" b+ Q* A  M
  7. use MongoDB\Driver\Command;0 u0 {) _/ u: O, h1 h

  8. 7 j' [7 o  n% R% C8 E' O
  9. class MongoDb {; {* S7 b1 m! g* u5 ^2 g- Y
  10. - I; s# L3 i! T" j$ i7 h" C; K' T
  11.     protected $mongodb;3 m5 C+ p& Y0 H3 x* ~1 F4 \
  12.     protected $database;( c0 b5 J3 O) r
  13.     protected $collection;
    - L/ a  n1 Q2 O& p
  14.     protected $bulk;7 h" G6 M3 D7 P
  15.     protected $writeConcern;2 |, @8 B% o! {  n2 U
  16.     protected $defaultConfig8 F& c, F3 I- Q; a3 |' X4 P/ n3 k
  17.         = [
    7 a" E+ p5 q( ?# f! v
  18.             'hostname' => 'localhost',* a+ p, \& V( u2 j! a
  19.             'port' => '27017',
    - T1 C+ C' S) q0 _, b' N% ?
  20.             'username' => '',
    / ~% u# o* U$ \+ m8 N" y% [
  21.             'password' => '',
    . V5 X7 a1 J8 g
  22.             'database' => 'test'( Q2 {: H) s2 Z. H
  23.         ];
    % v2 h' b1 Y9 W

  24. " ?+ @% Y" j3 _+ t' T
  25.     public function __construct($config) {
    ' }. T- F. Q$ f" B, C
  26.         $config = array_merge($this->defaultConfig, $config);
    6 y/ q2 Q$ q; Y, |
  27.         $mongoServer = "mongodb://";$ _" U9 U7 z/ A$ ]( O1 T* ]- m
  28.         if ($config['username']) {. e) }) q# Q4 N/ a' ], A6 K
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    ) ^7 s% K$ p# Z4 ~: t  N
  30.         }; K( A! @  x6 C6 k0 f
  31.         $mongoServer .= $config['hostname'];, b1 L# w/ S3 |2 d: w! S
  32.         if ($config['port']) {
      m; ~: P/ Z( G" g5 h$ N
  33.             $mongoServer .= ':' . $config['port'];
    ! N% e: x% J' M7 w3 K4 _
  34.         }
    " [, U4 \$ F8 a
  35.         $mongoServer .= '/' . $config['database'];
    + h$ K+ e. O( [0 T" z! s
  36. 4 y5 q2 t0 @4 X- k$ ^/ z& m# N
  37.         $this->mongodb = new Manager($mongoServer);: j9 }6 ^; a+ V$ b% @/ O% K# z
  38.         $this->database = $config['database'];4 d; b- N: m% S, E2 o
  39.         $this->collection = $config['collection'];
    ) ?" a8 d! i/ g1 |# _- W
  40.         $this->bulk = new BulkWrite();
    ' T7 Y+ M- o  o
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    " A' Y+ q' d! v3 P; K! F/ W/ W
  42.     }" X; G/ d, w9 |% \  Q
  43. / N5 ?8 L" R9 g' a; O! \, A# l: j1 k
  44.     public function query($where = [], $option = []) {8 F( n0 w& [! y5 Q5 q, J
  45.         $query = new Query($where, $option);
    - [: [. N7 B% r  i& \; F* L) b9 a
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);7 m) X- L1 p1 b) N1 c
  47. 0 A; x/ a% q  y) h& b
  48.         return json_encode($result);( u* S) l- U! \: k
  49.     }
    + c3 }( _) U. u# g3 B

  50. ( u. v, _2 c0 y2 k3 ?
  51.     public function count($where = []) {
    ! x7 i/ \2 }- s' w  f
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    0 x& F3 O# K2 ]+ }& k" m6 }4 N1 s$ k
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    ! T+ d, f; `4 [% x0 W' u8 C
  54.         $res = $result->toArray();
    $ _) r/ s& @, G. b
  55.         $count = 0;
    " Y" }( R0 z" L- `
  56.         if ($res) {
    " i8 T' r1 p) |8 R
  57.             $count = $res[0]->n;% D' h, r+ @1 n
  58.         }1 ?& \$ s/ e- Z9 z. I

  59. , y5 a* }$ N  A7 h3 @( o
  60.         return $count;
    ( z9 ?8 ]4 `) a/ D1 T% j8 @
  61.     }( }5 c: @, a* S" E* E
  62. ) y, `- c6 j1 o" C8 e9 }  H" j
  63.     public function update($where = [], $update = [], $upsert = false) {
    . D8 ^& [, W% _4 I+ Z" w9 n
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);+ F. E; q% n1 n4 M/ U# x
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    8 q0 x* ^6 b+ l1 R

  66. 3 c- y# i; ~; ?7 k2 W& N" F
  67.         return $result->getModifiedCount();9 \, }3 g* k, \0 {' e/ N$ I0 `% y2 v
  68.     }
    + F( `& r' Z4 d% a9 n3 b6 i- x$ w
  69. & _% F3 ?! m* [0 p2 ^* i% e$ r
  70.     public function insert($data = []) {% W* M/ [5 k: u! \0 g9 m
  71.         $this->bulk->insert($data);. D( u8 h+ ]) @  F7 _
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);8 y: x# b" S4 N( p6 |

  73. : n- G: q. l% W0 m: o
  74.         return $result->getInsertedCount();  v. b7 s# R! c) ^- U% m
  75.     }" j9 ^* b2 _% L8 n0 M$ y
  76. 9 c) t1 L: A% ^. Y
  77.     public function delete($where = [], $limit = 1) {; X# `1 d+ o: h" R+ C
  78.         $this->bulk->delete($where, ['limit' => $limit]);9 J) q+ J7 C9 g" k% Q# V
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    7 p; N4 r, t, [1 K

  80. * v. D! {  B' S5 U/ g' a
  81.         return $result->getDeletedCount();
    9 ~$ Y% S& }$ i8 ~; W* U) \
  82.     }
    3 L6 b  E0 x+ m- y; i* K7 l
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接

  • . Y% G5 t& q. C" ?' C
  1. new MongoClient();
复制代码

  • + \) }% {8 W" `( x
  1. new MongoDB\Client();
复制代码
2.新增

  • ( A# p/ M  F8 J5 l5 j
  1. $collention->insert($array, $options);
复制代码

  • ) l, v4 U- m# O
  1. $resultOne = $collention->insertOne($array, $options);//单
    " \4 |: R7 i$ d
  2. $lastId = $resultOne->getInsertedId();
    % i* @  k$ p# [3 c6 f
  3. $resultMany = $collention->insertMany($array, $options);//多% `8 n! J& {3 r0 O
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • : i6 I0 ~% H0 [; h
  1. $collention->update($condition, [! X2 x7 U/ g$ E3 N
  2.     '$set' => $values
    8 i  n; k8 B0 b7 j/ K! [
  3. ,[
    $ ^& `- h: G/ I8 R% p4 e: c# [
  4.     'multiple' => true//多条,单条false: p+ E) }6 X: G
  5. ]);
复制代码
  • ( O+ Y$ F9 T. j: f/ K! G9 g
  1. $collection->updateOne(
    8 g1 d6 w  m& b+ N
  2.     ['state' => 'ny'],- [) T' z( D7 ~. s( t0 i+ Z
  3.     ['$set' => ['country' => 'us']]
    0 U& m  m6 D) k7 |% v# R
  4. );
    4 s+ Y: \1 D" M+ l+ L& ~4 i* p4 B5 R
  5. $updateResult = $collection->updateMany(* ?/ r) u0 V) Q. H  v& g5 ]& M- i
  6.     ['state' => 'ny']," g/ c/ f2 a& A: q3 h& q
  7.     ['$set' => ['country' => 'us']]# ]1 o) p! \- U6 `4 y
  8. );
    % y6 f" ^, B  |
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • 8 d2 U' E9 Q( g9 m
  1. $cursor = $collection->find($condition, [7 V6 L$ E! h0 h+ b/ S
  2.     'name' => true//指定字段5 |7 K# A  K6 ?
  3. ]);
    : I5 k' u, B# P5 o0 ]! D
  4. $cursor->skip(5);
    0 W. n4 [7 e( w+ h4 l
  5. $cursor->limit(5);
    ; i4 S' `9 P! @) s( E& w
  6. $cursor->sort([2 J. a8 i: u0 y$ L) Y
  7.     'time' => -1
      j* V" P  J  B( p9 \5 F
  8. ]);
复制代码
  • ) L$ A/ U- P9 V8 @7 b7 E1 k8 `
  1. $cursor = $collection->find($condition, [
    0 m/ t6 X/ b: R5 w% N) S! K
  2.     'skip' => 5,
    , t& @# I1 |9 m$ n( A3 d/ M
  3.     'limit' => 5,: |# c: h( Q, {
  4.     'sort' => [* B6 A" p5 E( R$ w0 C; r/ Y
  5.         'time' => -1
    & c: g  H' s5 j5 K' N
  6.     ],//排序9 l# S. B# a* k5 @6 V$ ]. ?6 L
  7.     'projection' => [
    2 r# ~7 |3 _& d: a* ~8 |, E; s
  8.         'name' => 1//指定字段
    ; }& x" B- t+ F8 n
  9.     ]
    2 ~! P- g! {8 h
  10. ]);
复制代码
5.删除

  • 8 y; e4 c% n' u( m
  1. $collention->remove($condition, [6 H9 S" U' |5 Y) G4 p
  2.     'justOne' => false//删单条. U  s+ B+ T/ @/ s, Q1 g1 h
  3. ]);
    3 V* R$ K1 u2 v' v% u1 P6 I
  4. $collention->remove([]);//删所有
复制代码
  • " \4 u; B2 ~8 E# f, o5 D
  1. $result = $collention->deleteOne($condition, $options);
    & T1 D  S9 l2 N
  2. $collention->deleteMany($condition, $options);6 X- k) A; u+ A) I) O  G
  3. 7 ]4 p1 z6 K& n/ a: b8 V
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
      l' |( k  R! ~' I/ W. ^% R
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键/ u% w+ Q! R& y8 S; c& L
  3. ], [. k$ I3 N  Z# q! N; {
  4.     '$inc' => ['id' => 1]//自增. W8 N+ N1 r( O! L# v: {
  5. ], [/ \: ~' N& g7 }' x
  6.     '_id' => 0
    3 U0 |" s# J/ _" a
  7. ], [2 |7 J5 }- n! P2 `7 i% w
  8.     'new' => 1//返回修改后的结果,默认是修改前的; y8 a6 b+ Z* f+ F
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    - z, U. q; D; H
  2.     '_id' => $tableName
    ; C$ @9 e5 Z! j
  3. ], [
    $ N% p6 Q  Q6 E* i, X0 @8 Y) A. L
  4.     '$inc' => ['id' => 1]
    ' D% o! x0 E5 A4 y
  5. ], [* h  r! J6 }8 a# W3 z: W" T  P
  6.     'projection' => ['id' => 1],. l/ j# b% d$ o2 x
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    ( u5 O; H, V- e* a- o
  8. ]);
复制代码

- X( O  h$ `, H) G6 h) }1 R. ?$ Z) q# T  X6 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 17:18 , Processed in 0.057971 second(s), 19 queries .

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