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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16368|回复: 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
    9 o' O, T' U2 Z. k/ l

  2. & Q' _$ B* p4 f4 U% s5 g' F
  3. use MongoDB\Driver\Manager;3 A* Y6 T8 P' [9 _( O5 s
  4. use MongoDB\Driver\BulkWrite;- r! Q9 g" |3 S1 _7 |
  5. use MongoDB\Driver\WriteConcern;- j0 P' M, s& z, b4 M
  6. use MongoDB\Driver\Query;
    ( j6 y& W4 g, W# `2 b* K* Y5 T( ^
  7. use MongoDB\Driver\Command;
    / V+ \/ j9 f$ @& o7 A  R
  8. $ j& B* R+ I5 o0 r, l
  9. class MongoDb {# q7 @; M4 k" F( }" R7 {- d
  10. 4 F& c6 h4 l! L) ?2 e
  11.     protected $mongodb;* S" m; p+ x7 r  b- ?3 u
  12.     protected $database;2 K1 t# }: Z5 T& u3 f- [
  13.     protected $collection;
    8 s, u- s, U1 J
  14.     protected $bulk;$ D% U1 B7 \1 A1 K6 w4 P( |
  15.     protected $writeConcern;+ x% h: B; _7 N& o
  16.     protected $defaultConfig" v9 C) |* _% Z
  17.         = [
    ; Y/ R+ a( s% n. I! M* C% o$ \
  18.             'hostname' => 'localhost',* q$ J/ E6 w& W; d$ O+ |2 V
  19.             'port' => '27017',9 p/ y: L  m1 S6 U( h7 n- U
  20.             'username' => '',
    : t8 q; u# e' M6 A* ~/ Y- i; W
  21.             'password' => '',( F* k6 G8 o3 d8 l
  22.             'database' => 'test'- G# v- b/ x5 L" A. F; X( h
  23.         ];9 ^, ]* K+ }! q' i' F: O

  24. " a; x% R* C) M0 v  C3 X; M
  25.     public function __construct($config) {8 I6 O. O7 b. R) H5 c1 c
  26.         $config = array_merge($this->defaultConfig, $config);
    ; z; L1 y* C# h4 E. f* M
  27.         $mongoServer = "mongodb://";
    ' }; i* Q0 T4 N5 H
  28.         if ($config['username']) {
      g1 J0 R$ v4 }1 a# e3 h- D
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';0 f. e, Y) n' v) A8 U- s% P
  30.         }( l9 u' R3 y2 y- u5 Q1 }' X
  31.         $mongoServer .= $config['hostname'];
    3 c) y, m1 F" H4 G2 W; M$ m) }
  32.         if ($config['port']) {* O" r6 Y8 b' O# e4 v. \
  33.             $mongoServer .= ':' . $config['port'];
    : J: @8 E% q1 E1 ^/ H$ y, W; X
  34.         }! ]1 s" \. h1 E  s
  35.         $mongoServer .= '/' . $config['database'];1 {& b* f/ m. j) _) ^: A. y
  36. - J5 r$ W# ~) S4 V3 {& j! C5 [
  37.         $this->mongodb = new Manager($mongoServer);
    8 g8 P; U: u. B/ C1 i
  38.         $this->database = $config['database'];
    ! i' w6 B% j7 o
  39.         $this->collection = $config['collection'];
    , I4 s: L4 B% }' V
  40.         $this->bulk = new BulkWrite();
    & F1 [% u: h& ]- O, z+ ~0 D. _
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    - G, E6 S. M/ u3 S! R
  42.     }. z. s% E# i* N: H3 H) E; c
  43. , B; b4 v6 @! c% E  g
  44.     public function query($where = [], $option = []) {  }* c: `( N4 x! a
  45.         $query = new Query($where, $option);
    & Y8 c) V9 Z3 d2 E9 C  f
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);! Y6 _% D. D$ m# g( @! o
  47. . l5 r$ \7 k1 d, o
  48.         return json_encode($result);
    6 `0 O: k' _  U6 n  V# ?7 o* l
  49.     }% a0 R0 x, {, Q

  50. % f- K, t$ r) [- E3 t9 W
  51.     public function count($where = []) {
    ! s8 E7 U9 ~, M- L- y0 A
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    * ~. i' b: x( r0 w; a
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    % b; M; ]3 ~8 T. [0 S
  54.         $res = $result->toArray();
    $ j2 I' y, I1 D3 m/ H
  55.         $count = 0;1 `& v, i7 W3 ]' E' p2 M
  56.         if ($res) {* i7 `. n6 l) _( e5 Z. m6 O
  57.             $count = $res[0]->n;+ Y' Q( R5 v: [2 c2 K, U
  58.         }
    : Z% ]! e9 z9 y/ P9 \9 W

  59. . k# T, X/ h; o: j3 a
  60.         return $count;
    1 O+ ~% G/ G: c, Q$ ~- u  X4 b
  61.     }  S/ ?$ z% ]$ }& ]- p# q
  62. ) e1 W1 O9 |4 R
  63.     public function update($where = [], $update = [], $upsert = false) {. G, g% h% \- Q; m  d# t3 [6 z
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    1 B3 T% q+ I$ [+ N: g; a
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ; m' X& W6 c1 H) N, j1 m# J9 m
  66. - ^, n& v1 q' E& J! ?
  67.         return $result->getModifiedCount();
    ) O) f3 Q2 o0 T* B
  68.     }
    : @: b- c8 @2 z6 G3 @
  69. 2 t! R. ^! _" s1 ~  |
  70.     public function insert($data = []) {+ Q5 e) o" l8 ^" W, Z# a: [
  71.         $this->bulk->insert($data);
    / U* n$ Z2 P, L% X' s
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);# Y8 e. K$ b" Y) J1 t9 }
  73. % S3 g( }9 a9 K% R% T
  74.         return $result->getInsertedCount();5 `0 W9 F3 a8 ]5 H
  75.     }# B/ G& x: r: m" \+ F/ s
  76.   g, D: i$ C% [1 {+ z; k( `
  77.     public function delete($where = [], $limit = 1) {
    3 z. G5 o' a9 l) j
  78.         $this->bulk->delete($where, ['limit' => $limit]);2 c! m  K/ W; x
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    " F6 y$ k& A8 S2 o. C! ?( B3 l2 m

  80. : \7 m2 B* X  V6 H; _
  81.         return $result->getDeletedCount();) O. q; m: d2 z- r7 ]. w: L
  82.     }
    " G% k5 B+ [7 b6 R
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 2 W/ m  q4 q# x; X' A
  1. new MongoClient();
复制代码

  • ' r, {# |0 W' o3 p4 C
  1. new MongoDB\Client();
复制代码
2.新增
  • * A8 k( f2 A8 I9 s) `
  1. $collention->insert($array, $options);
复制代码

  • 1 l% i! _% c* ?+ X  s, o% Q
  1. $resultOne = $collention->insertOne($array, $options);//单
    ' }8 y# T& ^, q4 C) }
  2. $lastId = $resultOne->getInsertedId();
    3 N0 j0 V6 r& A, E% O# w
  3. $resultMany = $collention->insertMany($array, $options);//多5 j; u' S6 ~- Y/ u8 D
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • * T7 I# _$ _, i$ X
  1. $collention->update($condition, [- E9 |" ?+ F0 V' s  k
  2.     '$set' => $values& I4 g# L* r2 E" {/ d1 P! S: b
  3. ,[0 P9 ^4 i4 ~9 }5 V  n: d
  4.     'multiple' => true//多条,单条false
    # i7 r# X* k$ `7 ^9 G& D+ j
  5. ]);
复制代码
  • 1 R, u# `0 |5 T/ x/ g
  1. $collection->updateOne(
    8 {9 y1 }/ E  v6 F0 I* k! v
  2.     ['state' => 'ny'],* ?3 D3 ]! Q5 I) C$ [1 Z+ \
  3.     ['$set' => ['country' => 'us']]0 B/ P; ^* {- w: w, l5 d# M
  4. );& N  e; i0 t1 Y& K* G
  5. $updateResult = $collection->updateMany(0 `0 q# N2 ?# z# b/ Q
  6.     ['state' => 'ny'],: T3 ]$ m' P: Y; X: m; |$ L% H
  7.     ['$set' => ['country' => 'us']]
    ; w1 |- H. ?. e/ I& h" B
  8. );/ T/ h( V7 Y1 B5 c' S
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • 7 S& E" Z8 d9 O3 K% ^
  1. $cursor = $collection->find($condition, [+ m. W* W* Z! X( ^: B0 Q: _
  2.     'name' => true//指定字段
    5 ]; P7 C* ?- V+ Q0 T- V( A
  3. ]);
    ' N$ j# i- h8 ^5 @8 n
  4. $cursor->skip(5);( {8 h8 v  N( P% q
  5. $cursor->limit(5);
      j1 b2 ?! z7 |- m! b1 [
  6. $cursor->sort([$ @4 _6 T$ u$ U+ c
  7.     'time' => -1
    + x+ F) H8 I5 x% B+ r
  8. ]);
复制代码

  • & k, Q2 q" m. O+ }6 w9 g
  1. $cursor = $collection->find($condition, [' p! s' f" B6 s, g4 ~: a4 E
  2.     'skip' => 5,/ L( F+ X$ ^6 B
  3.     'limit' => 5,
    . S# e9 V# ^3 i* ~+ }
  4.     'sort' => [
    1 ?  @; `* K- V! g6 L. y7 A, E
  5.         'time' => -1% K! `7 r! Y# W0 D" q8 u: s% Y
  6.     ],//排序
    0 M0 G& B, P5 q8 y5 C
  7.     'projection' => [( p' G  s$ E6 i: w5 m2 P# L1 u7 u
  8.         'name' => 1//指定字段
    % u) [, Z' S& Z$ F6 c+ U: u, }
  9.     ]; T8 i$ a) p7 T; B4 t. Q  F
  10. ]);
复制代码
5.删除
  • 5 V2 x, j$ q* L1 W# a
  1. $collention->remove($condition, [
    ; u' a4 u1 }) l6 {# n, u
  2.     'justOne' => false//删单条; q% C# p$ [, Z% L  `3 z
  3. ]);7 ~, ^3 v$ Q% ]! q7 Q
  4. $collention->remove([]);//删所有
复制代码
  •   p9 E6 i4 ^1 s" H" B8 }, ]
  1. $result = $collention->deleteOne($condition, $options);
    / A* X. J0 u$ ?& B& V
  2. $collention->deleteMany($condition, $options);
    6 A2 S  t8 ^; r

  3. ' w  ]2 w1 ]# j  E
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    6 g; q1 K/ }* [# f2 J2 P
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键6 [% G3 p6 k! ^0 d+ P# ]' D
  3. ], [+ v; {- L* K9 c- u- p
  4.     '$inc' => ['id' => 1]//自增" `/ V. F/ B* Q2 Q1 Y8 u3 u' j
  5. ], [
    : ~" r8 \3 y5 d" n
  6.     '_id' => 0! L! B4 Z0 t( q9 ~( i
  7. ], [
    2 V) J$ T/ E3 @0 y8 {- D" Y: f# F
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    ( n. G# E4 x# C( x
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    ! V- m0 a9 k3 r  ~0 u& d/ q, L
  2.     '_id' => $tableName
    & d! ^& F  `# u* ]
  3. ], [/ R6 A  e! {$ }& `
  4.     '$inc' => ['id' => 1]. ?8 v2 }! ?, Z6 B& [1 G
  5. ], [) \8 m- a6 B2 H8 ?/ a0 q! T; |
  6.     'projection' => ['id' => 1],
    ! T2 o: r$ L$ \7 y) S, y
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    . k+ y% J9 E% Z. I5 g, S' B  W
  8. ]);
复制代码
0 |- n. A' }' j- |" y5 T
: B. C- y9 Y+ b# e( Q- e; N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 16:22 , Processed in 0.069012 second(s), 21 queries .

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