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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13219|回复: 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
      e8 d! C4 o! C# v  R. _

  2. ! Z" ~6 k* H5 o1 t6 b, Q
  3. use MongoDB\Driver\Manager;. ]4 t. q, r# _& G
  4. use MongoDB\Driver\BulkWrite;
    ; O# h. M( }  I& p! \  o
  5. use MongoDB\Driver\WriteConcern;! ?( s6 n" P) P- e/ _+ D
  6. use MongoDB\Driver\Query;
    # n0 X% O1 d/ h( w5 i
  7. use MongoDB\Driver\Command;! J! h7 h6 V7 P, R- t: r/ F' N

  8. 0 m8 k5 [, z2 y
  9. class MongoDb {6 T. @4 Q8 |' [3 b' c5 e

  10. - k3 h# `! M6 E+ Z# ?$ P9 @
  11.     protected $mongodb;
    / r0 J* [3 @, }: C
  12.     protected $database;* o( ]4 V  I" m% _4 i6 \2 L/ Y
  13.     protected $collection;  W3 r( ?0 Q7 P% G* h
  14.     protected $bulk;
    " x$ N/ r9 G/ h& p& J4 K! v
  15.     protected $writeConcern;3 B6 n4 ~; \* C  A) v  u
  16.     protected $defaultConfig
    ' G4 p/ F! _, p4 S
  17.         = [
    . _' i. T0 p4 K3 f( {$ ^* N
  18.             'hostname' => 'localhost',0 L5 R3 v& D! O5 T0 w' L
  19.             'port' => '27017',
    ' X7 B2 F8 i( j  \
  20.             'username' => '',
    2 H. i& L1 m2 H% J8 e: I
  21.             'password' => '',8 r1 a, a8 j% l  e2 F: \' V
  22.             'database' => 'test'
    8 C( r$ }9 q* m& Q% \
  23.         ];& ]! Z  u' m+ k

  24. - V% v* E+ w6 [
  25.     public function __construct($config) {
    0 X! @, `& \1 O( g: c6 q. }
  26.         $config = array_merge($this->defaultConfig, $config);% Z9 N9 W+ n* o" G- K- i
  27.         $mongoServer = "mongodb://";, C' l8 E3 G% g( j
  28.         if ($config['username']) {( B( x' c- J& m" p4 Z5 V
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';
    # Y3 m, E3 K( \$ j$ W, J
  30.         }- Z9 G) @- n. ?0 v
  31.         $mongoServer .= $config['hostname'];
    - H! E& B8 h, Q' _
  32.         if ($config['port']) {
    , D4 p) e" a# w0 A8 B" _
  33.             $mongoServer .= ':' . $config['port'];+ x, P" I& i7 k8 I2 K: U
  34.         }
    & T& k* x8 B* M" d5 Y& d
  35.         $mongoServer .= '/' . $config['database'];  E1 h5 b6 W3 \3 i* ?
  36. . b6 X3 o1 N( ?1 J% G7 M
  37.         $this->mongodb = new Manager($mongoServer);
    ' ]/ z* v. N; O; @3 ]0 |
  38.         $this->database = $config['database'];# X6 b6 L  z" u  b2 a7 k
  39.         $this->collection = $config['collection'];
    " E9 K* S/ `/ P4 k
  40.         $this->bulk = new BulkWrite();
    9 l! A+ [" a3 C* |' z: w  U
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    / p" k% a0 N6 y( h2 Z4 r; B6 _
  42.     }
    , Y% H( r/ S1 |/ k' _5 j" Z

  43. 5 t$ J4 l4 p# R3 M4 i; L
  44.     public function query($where = [], $option = []) {
    % X  n( k- {4 I! v$ N
  45.         $query = new Query($where, $option);7 b. h- \8 V. X7 k
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);$ Z) I! x$ _) J6 h# b
  47. 5 H, D& C3 t( B
  48.         return json_encode($result);
    % T, i- T( ^8 o4 n
  49.     }
    5 V% G4 x; c: ~5 M
  50. , b' V" h- R* e* `! J! ]' Z' S
  51.     public function count($where = []) {0 y5 @* t; V: P% f6 @
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    7 _7 ^0 `2 s" l& u
  53.         $result = $this->mongodb->executeCommand($this->database, $command);" i/ X. `& |2 d/ @+ v
  54.         $res = $result->toArray();7 w' I- U  h/ Z6 ^+ Q1 n
  55.         $count = 0;: i+ o1 n, D! K% q
  56.         if ($res) {) |7 }) m8 m- \$ j7 s  f
  57.             $count = $res[0]->n;
      w( C( L# B: C' x5 g
  58.         }
    7 K. r* W5 z" ^4 k
  59. 2 N: p5 E0 q2 J3 b" F# i
  60.         return $count;; W; w$ ~$ V/ t+ F
  61.     }
    " f7 L6 S# ~; W; m4 ?! z. Z+ N, ~

  62. 6 u! s0 m8 R2 J1 G! M: o
  63.     public function update($where = [], $update = [], $upsert = false) {
    8 g7 a4 X* V7 L" J, Q+ d# j6 B9 D
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    " \* p1 ]9 K+ u4 g+ n; ~6 {
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);# Y% o# U) o# F' u0 |. l& Z: h
  66. 5 d$ U+ x9 T# R* t6 N0 e6 ~5 W
  67.         return $result->getModifiedCount();) X/ {7 G! C8 i% j& H) T! Q/ |6 O
  68.     }
    & e3 W' ^, W- O2 U: R% Z$ w

  69. 3 i. F, W% u7 w( H' p. ^$ E
  70.     public function insert($data = []) {9 K* s9 M, o$ G1 H: R8 u& |
  71.         $this->bulk->insert($data);2 R7 A) {8 a& Z6 V( u1 T2 T$ N
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);+ d% I  J; @8 K- P2 I# [4 {9 W

  73. 0 h  F. x% A. q' }
  74.         return $result->getInsertedCount();
    " a/ l$ Z" a" V) ]
  75.     }
    ' T5 Z& N2 k7 S/ ~/ B
  76. 9 B: G3 ]# o( h! {. e# m
  77.     public function delete($where = [], $limit = 1) {
    6 `0 O( J2 l% R. ?5 P% q$ S1 E( r- [
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    5 B$ I" c) O; i$ y
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);: u% @: x% M& `+ D) Q: c0 S" _

  80. / c3 j, w* X8 j* J4 }" f) b; [
  81.         return $result->getDeletedCount();
    ( J  \5 D7 r- e: G/ H+ u
  82.     }
    ; R7 A! A+ J# V* x0 }0 J& q
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 5 T! e8 M' @$ t( Q/ ^
  1. new MongoClient();
复制代码
  • 2 P/ S' Y" Z" H; P( G
  1. new MongoDB\Client();
复制代码
2.新增
  • 5 m$ I+ ?  f) p! X- p7 g
  1. $collention->insert($array, $options);
复制代码
  •   i0 q' D5 u* i- E7 ]% x
  1. $resultOne = $collention->insertOne($array, $options);//单
    : Z9 e. W/ v$ j/ N8 N3 e/ E6 {! @( l
  2. $lastId = $resultOne->getInsertedId();
    . Z7 p) F1 D$ Q9 Q( u' a
  3. $resultMany = $collention->insertMany($array, $options);//多3 u% f" p$ N& e" g; Z/ J, w
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  • 5 W$ N2 G/ T" q) C% C' }# k5 z
  1. $collention->update($condition, [
    - f2 u* j7 n; a! Z
  2.     '$set' => $values. i5 B% K; s- ?- r# V- C/ ~( `8 K
  3. ,[, X- n; S7 e6 T
  4.     'multiple' => true//多条,单条false; @. Q; ]$ q1 o1 e
  5. ]);
复制代码
  • ' [" A$ p  u: v# d. I% e
  1. $collection->updateOne(
    # j+ {  ]8 B1 @" M
  2.     ['state' => 'ny'],% A  e* U# f# U
  3.     ['$set' => ['country' => 'us']]& |* `  g! F$ L4 B; l* k
  4. );( y% O) n8 g8 Z4 X( t
  5. $updateResult = $collection->updateMany(, v9 ]5 B; ?5 {* H$ H! F
  6.     ['state' => 'ny'],) e: [: `0 ?; c: z
  7.     ['$set' => ['country' => 'us']]7 Q% _5 J2 r1 {8 w' E# z
  8. );1 H0 f$ m, \$ M! y7 t" {
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • 2 e9 p6 w% K0 h! ~6 q5 l: _
  1. $cursor = $collection->find($condition, [3 T# j9 u. z2 O0 j- n2 U9 |6 l  g, f
  2.     'name' => true//指定字段/ W: Q$ X5 w, N- ?- G
  3. ]);
    5 P; D5 q7 p  k9 l! v
  4. $cursor->skip(5);
    % K5 x7 M* x6 D' m* ], G
  5. $cursor->limit(5);# |& g! x: G: t2 b
  6. $cursor->sort([6 e4 [0 B; a( j1 K! S8 L' s2 f
  7.     'time' => -1
    ' R- Z, ~7 K; b' i5 A; w1 {0 m# _
  8. ]);
复制代码
  • 6 H! c* Y+ I# @1 ^3 U
  1. $cursor = $collection->find($condition, [* O) o! w: O4 w3 `! h( z' `/ q
  2.     'skip' => 5,
    / W, D, \' _9 U' F# u
  3.     'limit' => 5,
    # f! q  ^# P  V; L4 X% ]2 Z
  4.     'sort' => [
    - y2 G. b: q5 [' \
  5.         'time' => -12 P& z" K3 \4 x8 z# Q, ?
  6.     ],//排序6 {& C  ?2 P2 P+ p, z
  7.     'projection' => [
    ( o% v, v: @- R4 D
  8.         'name' => 1//指定字段6 C1 K7 w# B  _: ^  G4 B- S0 ?3 y
  9.     ]6 p  W( g& D6 }6 w1 R5 y& }2 o% K5 S
  10. ]);
复制代码
5.删除
  • # y8 p- u; v8 I# J* q, ~
  1. $collention->remove($condition, [% |) K& G- P  t2 a, J
  2.     'justOne' => false//删单条
    + n/ F* i1 S2 d& `1 h( A
  3. ]);
    ' s( f* G* V) e' U% P: O3 W0 O
  4. $collention->remove([]);//删所有
复制代码
  • 5 y2 K5 Y$ ?  e" D) N# @! m
  1. $result = $collention->deleteOne($condition, $options);' s( D8 Z1 D1 }" V7 ^5 A
  2. $collention->deleteMany($condition, $options);
    ) @- ]6 [: b5 |

  3. ; W( r* t5 r, T
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    ( o9 g) X$ s. `  z- Q+ q
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    # d! e) ]; w. c
  3. ], [
    2 e9 z* i+ V# G- h9 D
  4.     '$inc' => ['id' => 1]//自增) y; C8 E1 l% c+ y- g2 r
  5. ], [
    , @9 ^* [; C6 h( v1 r- T3 j+ t
  6.     '_id' => 0
    & S, k* v) N+ B
  7. ], [
    # u! R& ?  C2 u- W+ J% j6 M6 h8 }
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    " ~& Q$ K3 i( ^4 a$ H7 C; V' e2 {
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    1 v6 l) r* V8 k. |+ k4 w3 s: L
  2.     '_id' => $tableName1 `& Q7 H# u- A$ m! W2 J+ m
  3. ], [. S, z( a; ^+ X2 [% H) x6 F
  4.     '$inc' => ['id' => 1]
      A# Z6 G2 |; U6 E5 o
  5. ], [
    0 B, w1 R. ?8 h: [# c$ {8 H- W
  6.     'projection' => ['id' => 1],
    3 l% Z" P+ q" D" J
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER& r" d5 W0 C- W+ {- l4 {; o4 k2 C
  8. ]);
复制代码

. S0 ^- d3 R3 z6 m7 s0 W
- U! L* A' ^: R/ G+ W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:15 , Processed in 0.109842 second(s), 20 queries .

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