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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16102|回复: 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
    1 @% y4 A* a4 M' u. |

  2. , z, ]0 C8 P6 P. J9 p# ?) K
  3. use MongoDB\Driver\Manager;
      w3 I5 L5 @3 T! R5 L$ ^
  4. use MongoDB\Driver\BulkWrite;
    : K0 \8 d5 X+ P& c- M* \
  5. use MongoDB\Driver\WriteConcern;+ l' E8 w. n# K. v. z
  6. use MongoDB\Driver\Query;7 q6 r4 n& H1 J7 j, B; q* k
  7. use MongoDB\Driver\Command;
    ) j! K4 j: P1 X

  8. : Y8 p" I1 B$ r2 |
  9. class MongoDb {- _- d3 Q5 S( A! P) t
  10. 9 x/ R8 C$ v4 S8 e. O
  11.     protected $mongodb;
    - M& e9 H* |# A3 d* b
  12.     protected $database;6 W$ X- x7 I- d9 p3 K/ q' q
  13.     protected $collection;
      T3 [! z' e4 R* G
  14.     protected $bulk;
    * v' [9 t9 c+ Q1 r
  15.     protected $writeConcern;
    # P7 [1 u. `! P" F% [
  16.     protected $defaultConfig
    ; I, i: P9 ?) p
  17.         = [, M+ T6 v  g. N0 c& B3 j3 H
  18.             'hostname' => 'localhost',4 l, J5 y* K$ u/ V
  19.             'port' => '27017',* i- _8 P. h, ?
  20.             'username' => '',
    * b  w9 r/ e% |0 l) c4 b4 ]& w; ~- E
  21.             'password' => '',
    + _& g( j0 T. Z* v6 n
  22.             'database' => 'test'. M+ a" _( [  Y0 R2 [4 q9 r' x7 w) J
  23.         ];8 `# ]% }0 K) r
  24. 9 X: W& O/ Z8 ^
  25.     public function __construct($config) {
    ' I  V0 H4 y  N
  26.         $config = array_merge($this->defaultConfig, $config);
    # {% u( S* R  G1 D
  27.         $mongoServer = "mongodb://";( ~' U% s9 Z) }9 P' z
  28.         if ($config['username']) {
    * R' \1 y$ a# L, q
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    ! F$ ^8 K& @% W
  30.         }
    & A2 h! ?+ U9 ^; ]2 u6 q
  31.         $mongoServer .= $config['hostname'];' e+ A, }9 J( F: C# i7 y! s
  32.         if ($config['port']) {
      C% I$ w& S3 ]
  33.             $mongoServer .= ':' . $config['port'];% M: I$ r0 `, o3 u% C" n1 H; i
  34.         }$ f' O2 l; q: k6 o9 v
  35.         $mongoServer .= '/' . $config['database'];
    ; A$ h% h: x$ b3 H) R4 ]3 i7 w0 ^0 \% c" H

  36. $ i8 u. O0 j" ~& F1 m
  37.         $this->mongodb = new Manager($mongoServer);' k2 a9 |% G+ N9 Y9 F! ?! Y* X
  38.         $this->database = $config['database'];
    + b+ h0 O: u4 I
  39.         $this->collection = $config['collection'];2 o2 m# ~5 ~6 G! L$ D! o' j  ^
  40.         $this->bulk = new BulkWrite();
    1 v" s3 ?( t) K. X3 [3 q
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);; n+ g7 L/ t2 E& b+ S6 f: K. v. p3 |
  42.     }
    - q5 B& R# F' S2 n- ~. }$ j  j

  43. ) H, Z( R( w8 c3 X* N
  44.     public function query($where = [], $option = []) {& \3 l) F0 _- L& A$ m
  45.         $query = new Query($where, $option);# e4 s, Q  y8 S+ ]' N4 Q  K
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);! Q+ c3 a; S1 l7 [2 [) y# s" u

  47. 4 U# T, q3 l: p2 U
  48.         return json_encode($result);- T, J, g% N2 G
  49.     }1 P$ P" g" j$ n6 `  E: p' h
  50. ; V( T0 k1 H' A7 g& E
  51.     public function count($where = []) {
    3 D. |9 Z5 H7 m3 c! P5 M: I0 c
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);5 T; w0 c: \: B, }6 u0 {- F% |" Z  j
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    0 f; I5 Z$ `* X% p# Z
  54.         $res = $result->toArray();- ^. p" z6 q1 n7 Q8 L* a
  55.         $count = 0;! ]6 Z/ [; C. O
  56.         if ($res) {
    ) `6 K. C! l# Z8 _; @
  57.             $count = $res[0]->n;& W  W& l  D. s( P; M
  58.         }5 j/ [1 n: ?3 t9 n7 K& v8 {* B

  59. $ _7 {) e) p$ `6 |; I4 ]$ h
  60.         return $count;3 E- U: F, D# p* E6 V1 H
  61.     }
    5 C3 n0 t/ a" e/ |' f5 p1 W

  62. ! T+ G9 N* M+ n; D( \& v' b
  63.     public function update($where = [], $update = [], $upsert = false) {2 q8 l( A2 K9 r4 e/ j5 V
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);( i9 Y# w! I3 k# R* _
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    $ B; s# c+ y( o5 {" H  r
  66. ' s$ R- a# f( k7 K
  67.         return $result->getModifiedCount();% T4 K9 u/ v6 D- |" m
  68.     }; z" J7 q' [; B; t' _$ I, Y

  69. 2 w+ m/ d& j, y9 k; [
  70.     public function insert($data = []) {
    ( U- }& e6 F6 X
  71.         $this->bulk->insert($data);+ E0 N1 W, Y3 z% m3 d$ N
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ( x* j6 e9 S  S/ {; r; W% ~4 [
  73. % D; o8 t) K. t
  74.         return $result->getInsertedCount();
    , H7 `) M, K* Q: y4 g4 y- z% n
  75.     }& Y( L2 }: K* W5 }5 E8 D
  76. % ~" j! y4 T9 q6 [7 m  Q0 q! v8 `5 F
  77.     public function delete($where = [], $limit = 1) {
    3 ~$ I9 s& x$ w. J
  78.         $this->bulk->delete($where, ['limit' => $limit]);0 u' U' U6 a' i; n6 S0 q, F' |$ l
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);) X: [/ {- @5 w7 }
  80. ( {$ Y4 o  G5 }4 Q  D
  81.         return $result->getDeletedCount();* E3 U2 ~2 ^, Y7 B0 r% H( d" {+ Y
  82.     }
    / o' [+ A) k$ v9 c* x- u
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 3 u0 C+ Z; E" i, g# p
  1. new MongoClient();
复制代码

  • . c, m) a/ P9 O* S7 `- G* Z
  1. new MongoDB\Client();
复制代码
2.新增

  • ! j# M8 ]0 R% Q6 U0 }+ c
  1. $collention->insert($array, $options);
复制代码
  • + b& r" {3 t0 v" {! S/ a
  1. $resultOne = $collention->insertOne($array, $options);//单  m9 S) _$ ]7 s8 H, }- A
  2. $lastId = $resultOne->getInsertedId();
    $ {% V9 A& Y8 |
  3. $resultMany = $collention->insertMany($array, $options);//多; T  ]5 t) d6 T+ h' Q: a$ G
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • ' {( _5 p# }- s: A
  1. $collention->update($condition, [
      [6 r7 Y) w- Y$ k6 g  h
  2.     '$set' => $values
    ( E" \  ?; y: K2 A2 i
  3. ,[! h% {8 _) s$ F# r  q
  4.     'multiple' => true//多条,单条false6 z7 b+ e, V. u) m' R' S* J
  5. ]);
复制代码

  • 3 w* S0 v" H7 e* S& o) |! n
  1. $collection->updateOne(
    6 j; [0 N1 ^# f7 b' H7 S  F
  2.     ['state' => 'ny'],% J8 I; `# N7 N& V2 c$ u. d
  3.     ['$set' => ['country' => 'us']]: J6 B1 f2 ~" k  D. l/ O
  4. );: W( _2 P) I1 _% V3 k3 k! k
  5. $updateResult = $collection->updateMany() e* y# z) |! H2 Q) P
  6.     ['state' => 'ny'],/ A! U- l/ A/ Q+ I7 X
  7.     ['$set' => ['country' => 'us']]
    # r1 ?% C/ d3 m. c  f- j" w
  8. );, S" W! I% J* O  d& s  V3 E" j
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询
  • 5 c/ c0 l* \0 U/ B% e
  1. $cursor = $collection->find($condition, [# E2 ^2 b7 f4 r6 c
  2.     'name' => true//指定字段
    9 i# @  i$ X8 J% Q* m2 Y* ?% i
  3. ]);
    + }! A" q6 j, n# b- g
  4. $cursor->skip(5);$ E6 a7 q1 }1 q- }0 V7 z$ P) v
  5. $cursor->limit(5);
    - q8 |; u& y  m1 {& e5 t0 ^
  6. $cursor->sort([
    , |% t% X$ v: V
  7.     'time' => -17 ~1 S: C1 t+ x8 J8 Q
  8. ]);
复制代码

  • * @) [. g  L8 ]  A& h
  1. $cursor = $collection->find($condition, [
    ( H2 x6 q  r" X
  2.     'skip' => 5,# a# H" F6 O1 d! T) L
  3.     'limit' => 5,- B2 e3 x9 S6 W% Y8 J7 J6 i  U
  4.     'sort' => [9 ~+ v4 u7 D; U/ H/ w; c
  5.         'time' => -1, H# ]- g$ \# @; y  s
  6.     ],//排序
    " X; f. m" x2 r9 Z8 H6 ?5 A* a0 z
  7.     'projection' => [! u6 ?% \/ p7 e' D# I
  8.         'name' => 1//指定字段1 S* V9 E: V) L, \1 g
  9.     ]8 G3 [; A% O8 g5 {+ \8 r
  10. ]);
复制代码
5.删除

  • 2 U0 Z$ |7 E1 [
  1. $collention->remove($condition, [
    ' L' l$ M4 L( w- Q
  2.     'justOne' => false//删单条
    6 J0 ^/ f6 j# J) U5 F
  3. ]);  q0 U' _' N1 {% p6 r, ?/ r: i
  4. $collention->remove([]);//删所有
复制代码

  • 3 t% _8 ]8 E2 e6 H0 @
  1. $result = $collention->deleteOne($condition, $options);; r: F  A; y  ?5 E7 t6 V9 h4 e
  2. $collention->deleteMany($condition, $options);
    2 T/ x0 Y% _% O# V! @" Y! k

  3. , V9 p/ |% D) Y" a
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([2 C8 A3 G' \) b1 d% U; P% b
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键/ t4 p0 K8 Y  Q5 D
  3. ], [
    * b7 f  k8 R0 t+ i$ C# ]' _
  4.     '$inc' => ['id' => 1]//自增8 ^1 c0 t; [7 I) c
  5. ], [( B4 ?/ R# z* ~7 X$ q+ g* x8 P
  6.     '_id' => 0- U% v% g9 c5 k2 v$ A8 r
  7. ], [7 H" @# Q* H! \: i/ ^6 i: D& m
  8.     'new' => 1//返回修改后的结果,默认是修改前的' W9 m9 `8 Q4 M% Q" v
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([5 E9 M* t2 J# h; D6 _/ b% P$ X) d
  2.     '_id' => $tableName
    6 A" s3 M3 ^: Q
  3. ], [  `2 s$ k6 F0 y! z' R
  4.     '$inc' => ['id' => 1]! Y, L+ ^+ Y9 Z
  5. ], [9 [# ~9 r- f- ?
  6.     'projection' => ['id' => 1],
    # E6 R3 U. ~" D
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
    / T8 }. v0 s. [2 n3 [( {
  8. ]);
复制代码
% U( A4 P  L  G. h3 B
6 x: {6 U' ]+ m+ D4 J0 {1 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 22:59 , Processed in 0.082793 second(s), 22 queries .

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