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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13221|回复: 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; I3 E8 I, E# m; n: _! A, ~

  2. ' M/ P( X" p' `- r- R2 t
  3. use MongoDB\Driver\Manager;
    , [. C/ @# C" F4 i- N0 j/ \7 Z% _
  4. use MongoDB\Driver\BulkWrite;2 J7 Q* O4 r$ x. Z) n$ ]5 M
  5. use MongoDB\Driver\WriteConcern;' W) i: g/ i( X/ ]5 o0 i( ^
  6. use MongoDB\Driver\Query;' X+ P% ^" {) K/ x
  7. use MongoDB\Driver\Command;
    ; [8 c9 z. K# e  H' d) m0 t
  8. % }% q! l! H( R
  9. class MongoDb {8 R2 a/ {( l7 b3 t! K, K' R$ z+ i, y
  10. 9 y# I7 H# J& `. M, Q6 Z- M
  11.     protected $mongodb;/ D/ s: e( |( ^6 p; u( a. L0 d* A
  12.     protected $database;
    0 s" E: X; P2 x0 \2 m. M, d" O
  13.     protected $collection;3 q) S1 T! v5 v
  14.     protected $bulk;" y% k4 P) G% h( @
  15.     protected $writeConcern;
    # t1 f  t5 J1 V
  16.     protected $defaultConfig, c0 W4 O- p# R2 |0 e/ i
  17.         = [! B* A6 e- w1 v+ D" _
  18.             'hostname' => 'localhost',
    ; q+ h, R. d/ n1 w$ ]0 [8 w
  19.             'port' => '27017',5 v4 c2 x$ E3 o/ \
  20.             'username' => ''," s8 ~# A# @4 Y; \& \( s; ^/ p
  21.             'password' => '',
    " V) r) @: I+ a5 A. ?
  22.             'database' => 'test'* G( R5 Y8 ]. M1 U
  23.         ];7 F% a$ T; L8 F- u
  24. 7 c3 l' g' d- J2 _9 h
  25.     public function __construct($config) {
    8 @; @4 _6 n9 g3 N  V# h9 g
  26.         $config = array_merge($this->defaultConfig, $config);. x0 z( R' N8 D6 K; a/ A  j
  27.         $mongoServer = "mongodb://";' P2 c" d* J$ M  x4 s
  28.         if ($config['username']) {
    / X& t2 x9 w8 B3 P8 X
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';; Q! W8 z5 p0 w, |0 p7 e
  30.         }
    % u6 R) w5 Q: G' o7 B4 @
  31.         $mongoServer .= $config['hostname'];
    - U  w0 P* D# G& g( T
  32.         if ($config['port']) {7 ~& N3 _5 T9 V$ X; c5 ?) N1 c
  33.             $mongoServer .= ':' . $config['port'];, _- G% H7 Y( d+ M. N& T, |
  34.         }& V: v* F$ ?0 f' i7 ~
  35.         $mongoServer .= '/' . $config['database'];8 p2 Z4 Z0 K. g4 `2 y3 ?' o
  36. 7 W' n' r8 }8 ~  G. ^
  37.         $this->mongodb = new Manager($mongoServer);
    ; {0 z6 Z/ p: p& w
  38.         $this->database = $config['database'];/ H2 L8 n. r# v. R( I8 Z6 E
  39.         $this->collection = $config['collection'];
    ) t8 ?4 ~8 N: k# W" U& z* P. [
  40.         $this->bulk = new BulkWrite();
    / _9 U0 Y- i* d" T
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    : B- p- Z) I$ ]( t- L  [) s: a0 }- a
  42.     }
    % _$ u3 ]' |0 U7 A2 Z1 T% i
  43. # i6 f7 \9 ?4 n4 d$ \  \
  44.     public function query($where = [], $option = []) {8 A- g, ?, p4 `+ S
  45.         $query = new Query($where, $option);
    1 Q& T+ K2 a0 w% Z
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);# w, B4 @9 Q& U/ g0 D) W
  47. & r9 X3 [6 b2 b* }
  48.         return json_encode($result);" G, L, M" R& f0 t  f9 J5 l- J$ [
  49.     }: t: @) _: L) r1 X1 \% o4 J

  50. ! |4 ~# o/ w$ [& w: f/ o4 i8 B
  51.     public function count($where = []) {% l3 R- I/ U/ E6 c4 I
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);
    4 ]) }( M" z+ X9 y& p
  53.         $result = $this->mongodb->executeCommand($this->database, $command);
    9 u- P! d5 l$ j- K8 G( Z3 Q
  54.         $res = $result->toArray();
    - f' w! X: O, u5 z' B
  55.         $count = 0;) Q- v- Y# U+ s
  56.         if ($res) {& C8 m8 J0 E% c# J# ]
  57.             $count = $res[0]->n;
    ( t5 A4 [) n+ }/ A: y" V) z
  58.         }5 d6 R$ Z& Q4 M( ]' h' x

  59. : c9 y6 r7 G- E5 Q9 V0 L) u
  60.         return $count;
    " P9 o" m0 d# `
  61.     }
    1 j) W$ f5 v# j# m
  62. $ L. G+ V# s( G! T6 m
  63.     public function update($where = [], $update = [], $upsert = false) {0 E6 n$ P" ~4 ~# o' G2 Q  e
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);+ F+ m  z3 ^! ?; O, s
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);& ^" [1 a: s) y" A2 \& y
  66. * P& r  i0 ^; {) b% o& C" g1 a
  67.         return $result->getModifiedCount();
    1 C- [! R8 U& q& U
  68.     }
      I4 U9 |) r& c. {, J9 p' D  Z

  69. . a' ?1 L9 _5 f: K, h- U- W
  70.     public function insert($data = []) {
    8 e2 G1 u& k* j0 G3 _
  71.         $this->bulk->insert($data);! s5 {. o6 s0 n" J" w+ X6 ^) M
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    7 ?, m! _) O0 c- |) j9 i% |0 g

  73. 6 G1 J4 @) S/ f, v/ J; h7 s* ]9 w) Z
  74.         return $result->getInsertedCount();
    8 e& ]; A. M5 [" ~5 V2 O
  75.     }
      b7 p# g8 H8 x. V
  76. * i( p) b# \" ^; T6 ~* h6 c5 G
  77.     public function delete($where = [], $limit = 1) {
    / A7 B# i! t4 |
  78.         $this->bulk->delete($where, ['limit' => $limit]);. a- M) A# S5 }1 l: L+ v( O
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    , `; c: T- h5 K* F+ `. {8 C) Y

  80. 2 B* g4 E. U4 Z' O6 l* j& U" b
  81.         return $result->getDeletedCount();
    - W' d5 C. \8 r; X2 S% D. O* ]& r
  82.     }) a  B/ H; A3 Y
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • 6 [' z6 T* V: h
  1. new MongoClient();
复制代码
  • ; w9 p; _* N3 e
  1. new MongoDB\Client();
复制代码
2.新增
  • 1 n9 C2 {% @% e: E! z% x
  1. $collention->insert($array, $options);
复制代码
  • 8 Y$ k) ?8 a( m8 }% v6 ~
  1. $resultOne = $collention->insertOne($array, $options);//单
    * k: q" h" R' ^8 K; _! D
  2. $lastId = $resultOne->getInsertedId();8 L9 c6 }9 H2 W/ D
  3. $resultMany = $collention->insertMany($array, $options);//多
    1 p/ z6 |4 W. f' K
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • 4 @) i/ T: y3 L0 R# J/ l# t
  1. $collention->update($condition, [: F: \7 Y3 \+ I$ H1 T
  2.     '$set' => $values
    . a. Z8 T! R. @
  3. ,[
    & x) B  r% v# j9 n
  4.     'multiple' => true//多条,单条false5 R, O+ s: q  f1 Q$ b% f5 A7 L% V
  5. ]);
复制代码
  • 0 o, g7 c2 Y0 }
  1. $collection->updateOne(. X& ^- z4 F" y& T) a, u. X$ q
  2.     ['state' => 'ny'],! i: `( n4 H8 i8 J
  3.     ['$set' => ['country' => 'us']]
    , f6 R9 t# e) C
  4. );
    ' _0 p9 M+ C, l) t; o4 z) V: i
  5. $updateResult = $collection->updateMany(
    : U8 j# `) j; g
  6.     ['state' => 'ny'],
    8 b, X9 F6 j2 I- ~5 n  z
  7.     ['$set' => ['country' => 'us']]  J$ j  w$ J2 Z* }; V
  8. );
    * o# h1 n- _! x1 j  A
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • ' Y: k, ?: Y% Y7 U6 G$ p: v1 i
  1. $cursor = $collection->find($condition, [% t* f1 T. T( u+ e7 X* N" {
  2.     'name' => true//指定字段
    / s' q7 w1 G7 A
  3. ]);: X' z/ Y  H( V4 t
  4. $cursor->skip(5);9 x# u7 k6 M) G* y2 ?( b
  5. $cursor->limit(5);
    ) G' g* M6 J$ C9 z; {* O$ g8 I# l
  6. $cursor->sort([
    ' u7 H% j0 {1 B7 c; p/ e% d
  7.     'time' => -1
    + j  f. X# E/ I" n0 x" ^# V; v
  8. ]);
复制代码

  • 5 F. S5 t- L2 n, J& f# Q8 ^
  1. $cursor = $collection->find($condition, [7 k& _8 B8 }2 s1 Y; k
  2.     'skip' => 5,
    " x& O; g( |; {7 `/ B9 l7 T8 R
  3.     'limit' => 5,. y0 M6 G( h! a9 t) q: q
  4.     'sort' => [
    + |. C* a3 h8 |1 Z: y
  5.         'time' => -1
    6 r1 c$ I) e% z$ s
  6.     ],//排序, X  x7 z3 h/ p0 N1 }  t+ t7 W
  7.     'projection' => [
      i) G9 ]$ O+ `% H! i" [- C
  8.         'name' => 1//指定字段2 k, y. |! {/ K' z
  9.     ]
    ( x  g' W( o; ]5 _7 P6 U' ^' F5 P
  10. ]);
复制代码
5.删除

  • 0 [9 w8 {) P$ E, m: e
  1. $collention->remove($condition, [
    - W% \* S5 H2 o2 K3 y4 ]
  2.     'justOne' => false//删单条
    & C& N( E' R) B9 A; s  g
  3. ]);
    5 f! w2 R' m) v) m
  4. $collention->remove([]);//删所有
复制代码
  •   J5 B; O) W9 P4 `8 y9 r: b  a
  1. $result = $collention->deleteOne($condition, $options);0 q; @4 W# a# Z5 _, N1 }& |8 q
  2. $collention->deleteMany($condition, $options);
    5 `/ T0 ~4 V1 G) ?6 u6 X
  3. 6 D# L# A" i' p: Y/ w/ S' ^( A5 ~' \
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    1 m' d$ l( H, T, l  H
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键* r$ l# W8 ~2 W4 E$ E& `: n
  3. ], [
    ! Y( N5 `( T' v$ i; H+ x8 r
  4.     '$inc' => ['id' => 1]//自增3 I1 u& A0 o3 r' ~+ f2 P
  5. ], [0 K/ G) F% X! Y! ?7 g$ F
  6.     '_id' => 0
    8 r/ t$ A3 G6 A! D
  7. ], [
    & R2 \% x& u7 m2 Y, N
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    & e$ T& x0 ]2 z) ^6 e& w
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([4 L5 |8 E/ _! j# \2 s0 j5 a6 Z/ y
  2.     '_id' => $tableName7 m+ s0 H) \; S' D, y/ A
  3. ], [0 H- r' U! ]4 x' r) |
  4.     '$inc' => ['id' => 1]
    ! x! q  Y0 L0 J1 x# G  X: L
  5. ], [; Z" n; ^; {: j# |5 {9 ?8 C
  6.     'projection' => ['id' => 1],
      U8 `8 W/ Y! A& @. z" m
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER, c; p4 C# D* D5 l$ l
  8. ]);
复制代码

* b  v- u1 E* x- V6 r- d
/ r1 D% h$ A: V6 i5 o8 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 20:47 , Processed in 0.119250 second(s), 19 queries .

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