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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15963|回复: 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
    # v% x  D% a: U* P
  2. 6 L7 w9 H1 i. R1 F" B. n
  3. use MongoDB\Driver\Manager;/ A: I% F9 X0 x
  4. use MongoDB\Driver\BulkWrite;! U* `0 `$ |; z* m: `, L" z
  5. use MongoDB\Driver\WriteConcern;
    3 U& e5 ]$ F# i1 s4 ?
  6. use MongoDB\Driver\Query;
    ; c9 y/ p6 b2 P$ Y# ^
  7. use MongoDB\Driver\Command;
    & E$ l6 K/ l! i- G! o; U
  8. 2 R) A' v9 ~" T; {& D9 _& C3 K
  9. class MongoDb {" d* @  C9 ]6 r5 U+ f7 U
  10. 8 d; }* }5 E  l: J, k2 F
  11.     protected $mongodb;
    1 V! [* R* P* s3 A3 C, U
  12.     protected $database;
    ' Q9 z. n0 ]/ v
  13.     protected $collection;3 Y' T% Y! n& W4 J/ w+ `9 k
  14.     protected $bulk;
    + o; u# Y6 Z7 ?$ ^
  15.     protected $writeConcern;2 P5 V" x8 B9 r" j2 v. T' a& C5 D5 j
  16.     protected $defaultConfig  N8 B1 k, g; `1 v
  17.         = [* J/ |( F2 ]5 a! e2 v$ A  g
  18.             'hostname' => 'localhost',4 S. S# `' C  N3 K  X6 W/ ~
  19.             'port' => '27017',
    ' H" [+ t2 Q$ {8 D+ u
  20.             'username' => '',
    ' o) A% x  k5 O% w1 m
  21.             'password' => '',- @7 t) k% Q) w: j3 {1 T. E
  22.             'database' => 'test'
    1 w' D0 {& M) N
  23.         ];% _# s( S! F5 k' H
  24. / y  Q5 K; `4 _
  25.     public function __construct($config) {
    ' T- {' ]8 Z/ F8 c/ n1 v& L
  26.         $config = array_merge($this->defaultConfig, $config);+ b' w; u* J: f2 Y4 f" c
  27.         $mongoServer = "mongodb://";
    ! T8 F. d2 a  t7 e6 K2 q% B: J
  28.         if ($config['username']) {& B2 B: w1 Y( S: F( o5 Q4 v
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';3 k0 N/ [* V# s3 {6 s- S) N
  30.         }# {6 j: I) c5 Q9 A1 T" I
  31.         $mongoServer .= $config['hostname'];
    ' I. `9 _4 @- X  {" p8 I4 G
  32.         if ($config['port']) {
    8 j8 g+ ]0 k  }. b$ M
  33.             $mongoServer .= ':' . $config['port'];
    9 Z( D  [5 M- n4 J1 G
  34.         }
    " Q4 |' }) g; }4 ^1 P
  35.         $mongoServer .= '/' . $config['database'];
      a1 W/ ~# Q5 p0 m! T

  36. ; Z! S5 J6 D' F
  37.         $this->mongodb = new Manager($mongoServer);1 U, q! O' W' b3 n
  38.         $this->database = $config['database'];/ M7 N$ f3 z# a( L% M
  39.         $this->collection = $config['collection'];% q7 ~* _; u# U
  40.         $this->bulk = new BulkWrite();2 d9 J* N: r+ K* U6 P5 A2 i
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    & u! H% P, `3 e$ r- P9 H& T! d
  42.     }
    8 k1 r+ P+ y0 O% D' E* Q

  43. 7 D. d6 _4 f. ?: j, C
  44.     public function query($where = [], $option = []) {
    & Q6 o& n$ P" l! A( _& o6 d
  45.         $query = new Query($where, $option);
    9 d4 q6 R" n$ m& S
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    ! i2 H  ]2 z/ T2 U7 R6 ^# t& H0 _# m6 p7 f

  47. 1 {1 Z6 T* C( L% L8 v
  48.         return json_encode($result);
    2 S6 j2 i% b! ^. q
  49.     }2 k) B6 U0 O* L% x4 N

  50. 1 _. d. z) B: l) l* w. w9 V4 \
  51.     public function count($where = []) {
    6 `, T1 o, i+ @" C# y2 j
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    . i8 G( a, K; {4 Q4 K" r" K; t
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    ; N' {( i9 B; j4 q! ]
  54.         $res = $result->toArray();
    1 A- s, ]' }- Z( u
  55.         $count = 0;* a- s& s3 I3 k& V- X( ~: }
  56.         if ($res) {
    $ P' R: I0 M1 D1 \. r
  57.             $count = $res[0]->n;8 A: s3 j* l/ i8 M) G" b
  58.         }/ k- u7 R. K' g0 F

  59. $ V3 Z; ~/ x0 d3 F+ ~$ o: H
  60.         return $count;
    # J" \2 d$ ~5 J! @6 B
  61.     }
    5 p8 h$ w* r1 d7 h) s' c
  62. $ Z: K2 ~2 a. G; v
  63.     public function update($where = [], $update = [], $upsert = false) {6 x" _1 a3 w- ~" A* f
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);! c* S9 I! {. G6 F. o( o( o
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);, f6 x( Y: f0 M
  66. 2 M8 I- e, Y/ x5 h: d0 _0 ^
  67.         return $result->getModifiedCount();
    8 s  }4 r) Z/ S: {6 L7 i, Z
  68.     }
    6 Q; `. e9 z2 @: `/ f: I; O: M- v

  69. ) l; K; N; p# s/ C( l, T
  70.     public function insert($data = []) {+ I/ Y4 c7 @- [- [; ^9 Z5 A' s7 L& i/ w
  71.         $this->bulk->insert($data);* j% R- o4 \8 k) T0 o# }
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    0 W+ f2 y' {+ F

  73. " [( I0 o6 x. H4 y$ q3 G' y" C
  74.         return $result->getInsertedCount();0 v' r4 `, X! G7 L1 a  M. K
  75.     }
    ! B/ {* O( R1 ?$ l4 o) [
  76. + \+ m8 [, a( E$ i; [6 l5 o/ G4 }
  77.     public function delete($where = [], $limit = 1) {& C: Y2 ]; x4 i
  78.         $this->bulk->delete($where, ['limit' => $limit]);! ^" w+ {3 O3 N1 k7 b% i  O0 g
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    1 L) K, c7 _; o

  80. / e" P6 F" v, j0 q$ U: P
  81.         return $result->getDeletedCount();
    4 o) b3 n, i4 V& U8 G- z
  82.     }
    ' W; K) X/ z$ z0 n2 J
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 3 {- a/ }4 D  A- p) I
  1. new MongoClient();
复制代码

  • * y" H) l9 g+ }0 o5 K2 x( J
  1. new MongoDB\Client();
复制代码
2.新增
  • : h1 Y1 j) B! t; k" S% o
  1. $collention->insert($array, $options);
复制代码

  • / i7 ~  Y7 X6 n0 B/ H
  1. $resultOne = $collention->insertOne($array, $options);//单/ K% F) P" a& A+ r& Y
  2. $lastId = $resultOne->getInsertedId();
    ; Q3 G9 x( {! N9 ~0 ?
  3. $resultMany = $collention->insertMany($array, $options);//多
    , ^3 s5 }& Z9 G; }
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • 9 \6 Z& I3 B+ Z! p
  1. $collention->update($condition, [8 Y4 l7 l; A/ ~5 P
  2.     '$set' => $values
    $ |+ x7 y7 G" T( d* q" C' i& Z) U
  3. ,[5 g9 P+ J' U( p4 }$ p2 _
  4.     'multiple' => true//多条,单条false7 }* {  N3 W+ b! |1 Q8 J& u
  5. ]);
复制代码

  • ) }, e' x0 F' F8 L' Y
  1. $collection->updateOne(2 u8 ^) W4 ~1 j; u
  2.     ['state' => 'ny'],+ Q+ F9 Y: N" {3 I$ a+ o
  3.     ['$set' => ['country' => 'us']]
    8 E! W- @- j- o
  4. );, x, Q0 f; ~7 y
  5. $updateResult = $collection->updateMany(
    5 T0 @; f4 Z+ q) P
  6.     ['state' => 'ny'],0 t- [$ g- o' C8 Z8 x2 A
  7.     ['$set' => ['country' => 'us']]' o: U* Y* _: \) M+ S- F# i
  8. );/ H) D3 K# e& l% S! F
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • " \  h$ I- |0 G
  1. $cursor = $collection->find($condition, [5 ?2 G' K& g8 X& e
  2.     'name' => true//指定字段" Y0 T" P9 `8 ^" \
  3. ]);
    , U' Y) V. S; e6 y- [6 J3 c
  4. $cursor->skip(5);6 u5 a7 a0 _* m8 D( j* Q
  5. $cursor->limit(5);! a1 N& h" O: I( m& R
  6. $cursor->sort([
      g. q5 a, P0 v$ I
  7.     'time' => -18 I, T- Y. L; I' i
  8. ]);
复制代码
  • $ Y8 O: |* U/ y, a: {0 i. j7 E$ i
  1. $cursor = $collection->find($condition, [1 q7 g; @, h  v5 r2 o
  2.     'skip' => 5,' `2 R/ o5 h- H2 u6 M6 C6 n
  3.     'limit' => 5,9 j# x9 K4 z/ p  T6 h
  4.     'sort' => [9 P- U! r( j. }7 i9 a$ P# }
  5.         'time' => -1
    / K5 @8 ?' s% m6 S  G& ?# A! V
  6.     ],//排序
    ' ^! o) [4 b3 a! {
  7.     'projection' => [
    6 |' s, I  ]+ g
  8.         'name' => 1//指定字段/ t6 ?+ ^, D6 y
  9.     ]
    $ V$ a: E1 ~$ y: D; ]
  10. ]);
复制代码
5.删除
  • 0 c; A* p$ ^- P6 H! D
  1. $collention->remove($condition, [
    9 q1 d1 K- k+ {$ a4 g1 I+ D3 s1 q
  2.     'justOne' => false//删单条: r4 a7 I) U, d3 s- N  f$ E- z6 ], [9 L
  3. ]);, M- U( n/ D8 s! N, P4 Z- R* k
  4. $collention->remove([]);//删所有
复制代码
  • 8 r2 Q) i. j8 E3 F7 T, K* e! H9 L
  1. $result = $collention->deleteOne($condition, $options);7 p1 s& e% k* `* i0 p
  2. $collention->deleteMany($condition, $options);6 o) {+ o' o# q9 B/ \1 E7 {% W
  3. ) ?; _0 r) m- V2 R( ^& ~4 Z
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    - J' @; k$ p% T, I8 _
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键3 c5 X, X( _6 G2 L% P2 }
  3. ], [* Y+ H% K* {7 o1 q) L# f
  4.     '$inc' => ['id' => 1]//自增
    3 }( V$ r1 _" `$ D7 r' r
  5. ], [, z# s8 b9 }5 {6 U
  6.     '_id' => 04 S/ o% P0 c5 Q4 k0 b7 k- B" d
  7. ], [- H0 d" K, w# Q3 L
  8.     'new' => 1//返回修改后的结果,默认是修改前的) ^. }0 T8 V1 T
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    ; P% M% N4 z) R8 c9 N/ ^' N
  2.     '_id' => $tableName8 ?# H. ~+ r6 y$ z$ N
  3. ], [
    8 N( N! M# s* _' l  \; S# ]9 c
  4.     '$inc' => ['id' => 1]
    ( V3 j" s6 R& G, k( E" ?
  5. ], [! H) K" }9 T6 c- f5 G' `! j% l
  6.     'projection' => ['id' => 1],$ u5 o1 E  y9 o* k4 S) \
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER; @4 A$ u: A5 r& P5 X
  8. ]);
复制代码

! C5 L% n, F& k( P9 ]7 J  w4 P/ C% _0 n8 ?9 F' c3 k/ H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.060031 second(s), 19 queries .

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