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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11395|回复: 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
    , T7 A1 m2 ?" U; `$ ]5 s
  2. # M4 u4 q& @' D
  3. use MongoDB\Driver\Manager;
      r' c7 B; \+ d$ p0 ^; e4 }! E
  4. use MongoDB\Driver\BulkWrite;
    9 k! h% M0 t0 P+ P6 c# y
  5. use MongoDB\Driver\WriteConcern;# j& f, b( {" c( L
  6. use MongoDB\Driver\Query;
    - q& a1 E  r, T* D8 r8 e0 x1 X
  7. use MongoDB\Driver\Command;: o7 J" ]# w- c4 A

  8. , h& g; s- v7 @, h
  9. class MongoDb {1 i, o1 W% L5 T: z
  10. * ]- \, l9 Y; V, e& @/ s
  11.     protected $mongodb;: m' }" f4 W7 J9 h
  12.     protected $database;/ T9 f  G7 `& Z
  13.     protected $collection;$ Z  S+ V4 `$ Y" Y" w8 i
  14.     protected $bulk;
    5 s9 K& @: ~5 b+ u; Q
  15.     protected $writeConcern;
    ; Z3 `* G8 R2 Z
  16.     protected $defaultConfig1 x' x7 Q3 g( D4 h5 G% O+ S
  17.         = [
    / h8 _9 S7 E: {5 i% y# L
  18.             'hostname' => 'localhost',
    6 ^) l: X+ n, Q( O1 W9 @
  19.             'port' => '27017',
    0 e% E  i, o/ H2 H
  20.             'username' => '',1 I: m+ i; \/ D( }
  21.             'password' => '',& o' v7 `- t" r8 z
  22.             'database' => 'test'' L! h% D% e8 ?
  23.         ];+ c5 d$ t& \0 x# P* h& H
  24. , i1 c: L/ f+ b' m/ u# ~
  25.     public function __construct($config) {
    0 l& Z% Z5 T4 Y0 L9 a( C; `0 o0 m9 c
  26.         $config = array_merge($this->defaultConfig, $config);* `  O$ s4 ?/ {) }( q& ^" j
  27.         $mongoServer = "mongodb://";. i8 a' u2 d7 ~7 e2 f
  28.         if ($config['username']) {
    1 t' f& u6 B* {* ^" D
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';1 N1 V; @  X6 S& a) z
  30.         }, a- }5 j7 m6 Y, f
  31.         $mongoServer .= $config['hostname'];( d" z4 `/ o# b+ k+ k
  32.         if ($config['port']) {
    ( X) ?3 `3 s6 R9 E+ S' d
  33.             $mongoServer .= ':' . $config['port'];# v0 j' u; P  B# B1 y  [/ K
  34.         }" }! j6 [" A% R7 F4 x  S
  35.         $mongoServer .= '/' . $config['database'];8 n, ~' T0 E2 `; ^$ W: i/ _
  36. ; o: z  U; |% ~' I5 I
  37.         $this->mongodb = new Manager($mongoServer);) n: O! O; \9 I0 e2 C
  38.         $this->database = $config['database'];
    4 y/ C. |3 b2 {
  39.         $this->collection = $config['collection'];
    " u( Q' w& `6 H) X1 V# Z
  40.         $this->bulk = new BulkWrite();
    $ f' U' K# L1 T/ `. I) D3 S$ `
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);  @0 I# S6 L+ d# K& v$ q
  42.     }  P2 r: Y) i! v3 S/ r/ i# m0 S
  43. 0 D9 Y& ]' o% s, Q! O
  44.     public function query($where = [], $option = []) {' Z% }6 Q. V0 [' {) i
  45.         $query = new Query($where, $option);
    $ @( D. Q% X5 B0 v" K
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
      o0 Z6 t# a/ d* {+ D
  47. + o1 U# N3 A; w* c, C- h! [
  48.         return json_encode($result);
    2 o, j0 @* v1 R( y
  49.     }
    ) H3 ]3 z/ P5 }/ H7 Y4 j
  50. ! v+ w$ u9 h8 l  F# w
  51.     public function count($where = []) {  `. J) J0 W! \# c
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    0 }+ v! ^: Q5 ~9 ^: C; i" \
  53.         $result = $this->mongodb->executeCommand($this->database, $command);0 W( F8 b7 M5 {% Q$ R; \
  54.         $res = $result->toArray();) j' j/ g  E  m  z
  55.         $count = 0;
    9 N' c. C+ w. t; k# s
  56.         if ($res) {
    - ?' v- p9 `' x5 i8 P2 n$ E+ q
  57.             $count = $res[0]->n;* Y& P# `; b( l, F6 o
  58.         }; m6 Y  R. T1 I- n6 F9 z3 C+ Y, q

  59. ( w+ X2 Y5 D" ^3 L# {' `) h
  60.         return $count;0 A- n: f! O' B; K
  61.     }% W& L' z. e5 F; W* Z( n
  62. 2 S% A& I' S- ]& `# h$ x1 q
  63.     public function update($where = [], $update = [], $upsert = false) {
    . W* h9 W5 G# v5 g1 v
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);
    ; H. T( B) X& d6 Y# }6 Q
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);; H$ _' t' u* Q* s& s9 u, t2 N
  66. 6 a+ R4 p. E/ _$ J7 @, p
  67.         return $result->getModifiedCount();$ e: C' ]+ T1 g; ?- S" n
  68.     }/ h: \! Z5 N, ]; A3 T
  69.   K0 J. t" T  r/ w
  70.     public function insert($data = []) {) v- m0 o5 H' M! K* w
  71.         $this->bulk->insert($data);
    - I! y* q+ _& g) Q; H
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);1 j6 M4 r4 [! k( E/ ~7 |9 A3 L/ W$ \

  73. ; R# e  F( M- L0 f. m. T
  74.         return $result->getInsertedCount();- z/ v2 X! @& ~  l  y
  75.     }
    / L, C+ R- \7 I, }- Q% {

  76. : _/ J* v9 O+ o3 ^/ Y
  77.     public function delete($where = [], $limit = 1) {
    5 ~( ?8 b5 T$ p4 V7 X8 u7 H
  78.         $this->bulk->delete($where, ['limit' => $limit]);8 }* Q9 [- [& I
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    & ?8 Y/ ]* f  t2 y* _) G- j! Z

  80. : K' |3 Z0 i6 @  M
  81.         return $result->getDeletedCount();
    ( }( E7 U- u6 T# _1 g! k2 O. |
  82.     }
    5 [7 _6 }1 f- E8 t
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 7 r+ ?( |+ g, E1 @' Y
  1. new MongoClient();
复制代码

  • % C% Y+ u5 N$ ?$ o
  1. new MongoDB\Client();
复制代码
2.新增
  • ) g  I0 R0 A! x' j' i( _: i5 }- d
  1. $collention->insert($array, $options);
复制代码

  • * d6 C; G0 W4 u0 i  i6 N
  1. $resultOne = $collention->insertOne($array, $options);//单# C$ ?3 i  D! k7 `- Q
  2. $lastId = $resultOne->getInsertedId();
    1 R" x& D6 E: d7 m! R9 {* j; ]
  3. $resultMany = $collention->insertMany($array, $options);//多
    + {7 O) m: x# d& \" k+ u2 @
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • * f' c" Z* |2 ?* @. o+ S
  1. $collention->update($condition, [. h- l, l  Y! I" P$ s
  2.     '$set' => $values4 j9 r& ^0 ^# k, u7 }
  3. ,[4 B; E9 N4 k" `2 R3 n. Y( G
  4.     'multiple' => true//多条,单条false
    : [' D' U' K8 S' z- {0 A
  5. ]);
复制代码
  • 2 |) u5 T3 G' g+ }) O
  1. $collection->updateOne() x; v6 M/ W6 W+ _1 S* h
  2.     ['state' => 'ny'],
    : z& P3 A5 f2 p# {1 \
  3.     ['$set' => ['country' => 'us']]1 I0 }' ?1 o5 ~3 W- @- @- L$ F
  4. );
    ( j, Z5 v( [/ ]2 n* L- Z( E) O
  5. $updateResult = $collection->updateMany(
    . |( ^7 H+ b$ j' d+ |
  6.     ['state' => 'ny'],7 B' Q9 a$ Z. F4 S
  7.     ['$set' => ['country' => 'us']]
    8 b# M$ N0 g& `- |  i3 _
  8. );
    ( V9 M# ]8 C( M1 N
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • 3 G! Q/ p2 A- H0 h. U- f
  1. $cursor = $collection->find($condition, [6 Q4 Q" y/ G  a; r5 v. g
  2.     'name' => true//指定字段* O8 m$ N" Q9 y) k7 Q# Z! ^
  3. ]);; u& b, t, @, F! X  j$ c3 ]
  4. $cursor->skip(5);$ p! Z  u3 K' W3 D+ N* [
  5. $cursor->limit(5);
    6 M" l) t2 r, V. C9 `6 J$ i8 P
  6. $cursor->sort([
    : q+ [% T9 Z* Z2 L2 T" D% {
  7.     'time' => -1
    1 ?8 J3 N2 V1 Z) f: X6 C
  8. ]);
复制代码

  • 6 t# i1 }, ?8 E2 D, K5 _, u
  1. $cursor = $collection->find($condition, [4 }& s7 z: ^, B4 u4 u
  2.     'skip' => 5,1 r6 E4 S+ b/ I, t* d; h
  3.     'limit' => 5,
    * `0 _  C! M( N" U& j
  4.     'sort' => [
    % j  i3 M$ ?% L
  5.         'time' => -14 W  O$ r' g; s9 ?, f
  6.     ],//排序! O! o  ]; B+ j1 `$ I9 C  I6 W
  7.     'projection' => [( _6 f. c. N, l+ s' `
  8.         'name' => 1//指定字段
    1 {" c/ t" F$ d9 |  F2 A6 _6 ~$ f
  9.     ]7 v1 _0 h$ j- i3 \; Z  s5 F
  10. ]);
复制代码
5.删除
  • + g; Y- j# R* z
  1. $collention->remove($condition, [
    ) c5 \" H+ y- h; d* S% A7 W
  2.     'justOne' => false//删单条
    8 p4 D- e5 r" P; n6 z: A6 O5 D
  3. ]);3 Z% m  F) N( D( G; e
  4. $collention->remove([]);//删所有
复制代码
  • 5 M* g9 B/ y, i- d2 i- d; ^  @
  1. $result = $collention->deleteOne($condition, $options);) K: G$ w% v# f! Z" T5 @
  2. $collention->deleteMany($condition, $options);# N0 H7 N: \* H' v& B+ l

  3. 1 b: g- L! C+ \
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([7 G0 W0 g' k2 @: N1 G; h
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    6 j5 j. }; m+ R1 _' W1 W1 q
  3. ], [" p, {2 T: U9 P; h
  4.     '$inc' => ['id' => 1]//自增
    ( L# _" t$ b# N# ~3 o
  5. ], [9 k4 I( h' L3 C0 L) X
  6.     '_id' => 0, s8 V* S* y" L8 X+ @3 Q0 d, i
  7. ], [
    ' L# w+ \- X: A9 m8 i' e
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    1 k* J: G- {9 N5 V
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([0 [; d" g7 m" K" S
  2.     '_id' => $tableName
    4 ~, @" B' i. ]3 U7 i
  3. ], [5 L% R$ Z8 Y0 p6 M! d. L& I
  4.     '$inc' => ['id' => 1]4 g" ^& {' R, }# q( s
  5. ], [  y- W& I; N7 v/ U
  6.     'projection' => ['id' => 1],& A9 }" I! K' y  ^$ N2 c
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER" m& ~5 E+ M2 `' M
  8. ]);
复制代码
0 D3 i1 e6 o. `/ V4 |& p/ c
( t% \: `2 E- I+ g  [0 G4 ~9 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-8 00:40 , Processed in 0.117847 second(s), 19 queries .

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