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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13198|回复: 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! K  E: u6 Y6 k" ]; v

  2.   C4 u0 E1 n1 \4 t
  3. use MongoDB\Driver\Manager;
    , Z( @% V% p: s5 p
  4. use MongoDB\Driver\BulkWrite;: f$ C* b3 u4 v% }) x8 t1 b
  5. use MongoDB\Driver\WriteConcern;" w8 v4 [5 f5 \% i! ~
  6. use MongoDB\Driver\Query;  |2 M6 |9 M- J& I
  7. use MongoDB\Driver\Command;
      j5 i" V: E+ |2 M5 ^
  8. # h7 s8 m" w  A6 X" V9 X
  9. class MongoDb {
    ' k$ z- A3 W: o- D. c7 |
  10. 4 _' _/ P2 o% h" R* i
  11.     protected $mongodb;' B( V6 I8 X# L# N: W' q
  12.     protected $database;
    - }0 Z4 U: ^+ |9 o7 H1 H
  13.     protected $collection;$ H, ~" S& l6 l7 G+ k1 x7 x
  14.     protected $bulk;( [/ \; V1 n6 V) c8 z
  15.     protected $writeConcern;, s4 {+ b4 f0 A0 i8 j
  16.     protected $defaultConfig
    ! n3 O5 }2 G, S
  17.         = [
    ' e" Q2 X- `* ~5 n) R1 c
  18.             'hostname' => 'localhost',6 c% P' Q( J; _# p  U# v
  19.             'port' => '27017',' |0 Z& i; f& r' B
  20.             'username' => '',3 T% @; t" o9 P
  21.             'password' => '',% Y$ X' R2 P! O9 J+ G
  22.             'database' => 'test'
    ) y2 b+ o7 K: O( ]' V' x" O
  23.         ];9 t9 `5 m; Z6 \- t& r  P

  24. % S) R2 Y3 T& {
  25.     public function __construct($config) {
    8 Q! y! I, g: X% ^: J
  26.         $config = array_merge($this->defaultConfig, $config);
    6 l* C3 h5 \7 T( C) W
  27.         $mongoServer = "mongodb://";
    % N; F/ M0 }& q; t5 Z# R
  28.         if ($config['username']) {
    ; ]$ H& q8 A& U! Q. X- I3 R
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';. ?) r2 E5 F& i- v
  30.         }
    - v8 @) z9 m# Y, X" S! G1 p4 Z" z
  31.         $mongoServer .= $config['hostname'];: g4 \- B+ s% ~* |5 ]. ^& w
  32.         if ($config['port']) {
    ! H  s; X2 {/ f1 k
  33.             $mongoServer .= ':' . $config['port'];
      O# e' e0 I# j4 z0 y5 s; T
  34.         }
    5 I4 Y' Z' \9 M% d4 z6 @9 L! t
  35.         $mongoServer .= '/' . $config['database'];
    : Y# K  s! L) P$ A9 t% E$ _9 w
  36. % T% P& X2 ~7 G% \* P) k5 T8 h
  37.         $this->mongodb = new Manager($mongoServer);7 \9 V$ N: N; w. E! Y0 Z+ W
  38.         $this->database = $config['database'];
    % l* t1 g# [/ E6 W! n
  39.         $this->collection = $config['collection'];
    ; y) Q& L: Y2 w" d
  40.         $this->bulk = new BulkWrite();
    ( x% T  s# ^1 L  c% q3 f& `
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);8 l! A; J2 l$ Q/ j% O
  42.     }9 r$ P2 C, q$ t5 R& [

  43. # S. P! ?# K+ K3 D& f+ u
  44.     public function query($where = [], $option = []) {
    ) p7 D$ g# ^0 J/ A3 u8 z
  45.         $query = new Query($where, $option);
    " k$ o4 F3 T% p, s7 Y) O) A
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);. ?9 A* m6 [7 O6 ]4 q

  47. 2 Y* H  Z% b  k- O; f7 [
  48.         return json_encode($result);3 C0 Z3 V: Y2 N) _+ k
  49.     }
    8 K0 a% f% _2 x2 i0 @
  50. " @/ `8 }5 T2 g- w2 Y1 D/ `6 ]1 l1 c
  51.     public function count($where = []) {
    6 ]6 ^% I! C+ b8 d4 _& L
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);4 L5 \3 w; U" P; K
  53.         $result = $this->mongodb->executeCommand($this->database, $command);3 r8 @# j0 k0 m5 A3 A; @
  54.         $res = $result->toArray();& E: j, Y! b5 b, B
  55.         $count = 0;; g1 J1 g9 @; a) S5 m9 a
  56.         if ($res) {
    ( v! L, B  Z0 `* @; b
  57.             $count = $res[0]->n;
    + |% P! r) A: ^3 D% o2 ^
  58.         }4 \+ {; H# A/ N' l- k8 i
  59. ) ?* L8 F; A( F+ t; p' \
  60.         return $count;
    * h7 l, |. h8 M. l4 }
  61.     }5 w1 x& d0 U  N+ M# }: D- R- i

  62. , m# G) B6 _3 A6 ~) |$ x
  63.     public function update($where = [], $update = [], $upsert = false) {; l/ Z! g" M/ o( c( w; C
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);8 S/ k+ K( w4 x* i7 j5 \3 [3 v$ z
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);3 \2 u* o4 m0 H  c% q( k- y

  66. & z/ q0 M- R0 K- u& `( k
  67.         return $result->getModifiedCount();
    7 s7 ^" S2 o8 m4 G' o
  68.     }# f) \( _$ a4 ~2 t# u. l
  69. % j- x, b; w  n3 n4 M
  70.     public function insert($data = []) {
    7 a3 F  L! Z  C) N* y  d) `
  71.         $this->bulk->insert($data);
    9 M+ Y/ c, q( t6 q3 [2 v, b6 Z
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);1 P9 G' E- I# N( v. m* r% ]* J2 i
  73. # P) d) q' e3 c
  74.         return $result->getInsertedCount();
    1 Y2 Q# c! A# l* h+ ]2 K9 N
  75.     }
    - u0 v, V' o+ s# M. m
  76. - b1 i* Z" w- {+ ]% h6 U% T
  77.     public function delete($where = [], $limit = 1) {) K& o, s& Q  u, e
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    & r/ y; {4 i+ d# p- O7 i; i. A( I- N
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);
    ) [' n/ o3 ]# D* L$ S$ B

  80. 5 g: s" s  ^- x) t2 `6 x7 j
  81.         return $result->getDeletedCount();
    5 |+ V$ l* y( |$ v6 D& ?9 _
  82.     }0 m% u9 ^6 w3 ]+ f. H+ k, E
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  •   c9 O% H+ U: J& Q
  1. new MongoClient();
复制代码
  • ! ~/ g* V6 A* ~0 q' S$ L! l
  1. new MongoDB\Client();
复制代码
2.新增
  • ) z$ [% Y4 c; }) c; F& _
  1. $collention->insert($array, $options);
复制代码
  • . Q2 @4 n5 Q( e0 a( g
  1. $resultOne = $collention->insertOne($array, $options);//单) F" v/ j. J# }, n
  2. $lastId = $resultOne->getInsertedId();
    % f% B% P: D1 h, B0 c. b
  3. $resultMany = $collention->insertMany($array, $options);//多# W* q/ M2 G7 B' S; k
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改
  • ; R$ Y* f" S: O" o
  1. $collention->update($condition, [5 a4 B% K* G* A# u
  2.     '$set' => $values0 U3 h, m3 B, v, ^
  3. ,[
    5 U) J/ d5 o4 R
  4.     'multiple' => true//多条,单条false" g* y" \7 P( |, s* @/ f
  5. ]);
复制代码

  • : |3 M/ c5 B: f, a$ Q8 C3 i
  1. $collection->updateOne(/ ~8 A: M3 m  C8 y
  2.     ['state' => 'ny'],4 g' ]9 W" ?" T2 Q
  3.     ['$set' => ['country' => 'us']]
    * Y, \/ H! n3 _
  4. );
      _+ `2 T" L: r3 E1 C+ w1 q
  5. $updateResult = $collection->updateMany(% r  [. z4 u& ^7 Q+ y& p
  6.     ['state' => 'ny'],, _$ L! G7 I- I
  7.     ['$set' => ['country' => 'us']]: w( }% ^7 a+ p. o
  8. );+ R" h+ V" A# a
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询
  • 8 Y1 n5 U! z# P( j2 g; {
  1. $cursor = $collection->find($condition, [0 \  \# H5 e  t  L1 r) W
  2.     'name' => true//指定字段
    , c% v* c7 B* f" a
  3. ]);
    # m* D3 W% J6 j; N1 h* b" `
  4. $cursor->skip(5);2 M5 j8 W( D& ?4 ?
  5. $cursor->limit(5);
    2 X; v# p/ A( S" H+ }1 q" R
  6. $cursor->sort([
    , Y+ \4 |/ n. _9 F- m
  7.     'time' => -1
    ( @9 h: W4 i; F) q- j
  8. ]);
复制代码
  • 7 m  H8 ^$ h. b- }5 n
  1. $cursor = $collection->find($condition, [+ ]/ [: i5 `% W7 F- o* r5 H% Q
  2.     'skip' => 5,3 x4 F4 E- {0 ]& h! K  ]" Z: T
  3.     'limit' => 5,
    5 N. e9 k1 N: `; h5 d* L  _- L
  4.     'sort' => [5 k! _& V" t" N" V$ R$ ~3 A  p
  5.         'time' => -1
    1 Z5 k' ]8 g- C( G) L4 {+ ]  R
  6.     ],//排序
    9 R/ H6 J9 L# S3 M3 ]
  7.     'projection' => [
    / T* h1 @4 D) f4 r3 Z9 P7 s4 O- z
  8.         'name' => 1//指定字段, y3 {2 n/ n, }/ C3 z- i
  9.     ]
    5 H7 @% n0 M0 V# S7 N, B
  10. ]);
复制代码
5.删除

  • 8 s! Z+ }: F! n0 q( R+ a3 ?
  1. $collention->remove($condition, [! B7 R" G: s: D* U& K
  2.     'justOne' => false//删单条
      u% |2 Y4 p- g  B5 s3 y
  3. ]);8 G+ M! T8 H8 f& I
  4. $collention->remove([]);//删所有
复制代码

  • , v% M! A0 i( I) m4 i
  1. $result = $collention->deleteOne($condition, $options);
    : w4 P- K5 M4 F" b' D
  2. $collention->deleteMany($condition, $options);
    7 o! {0 r' I2 w2 ~) S( t2 W' a

  3. ) v# }- Q9 n/ b: [1 s: l. n
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([
    3 h. ^/ g% c. R9 w
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键
    % T( i* }0 I3 S5 r% u4 @( X
  3. ], [
    - [! U- m; ]8 c8 P- x
  4.     '$inc' => ['id' => 1]//自增
      `( m6 A/ `" Z1 H5 [
  5. ], [$ R4 j8 @4 r: |/ w7 z; N* q  G
  6.     '_id' => 0, U" Y4 `+ u9 O4 Y! f0 t6 w" N
  7. ], [
    ) y2 E" d+ x: B) e) K& q9 F
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    ( K1 J! ~  c# p
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    / D- o0 X1 `: F
  2.     '_id' => $tableName
      ], T$ x; h! L8 s: q' |
  3. ], [
      h2 B; j/ B% p0 w$ _* v
  4.     '$inc' => ['id' => 1]! l; V, }5 o8 m# ]; k. d7 R( c0 T
  5. ], [* B0 R0 A+ I$ q& S0 q' R
  6.     'projection' => ['id' => 1],. G, t  `) w. v, q% r. `0 m
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER. _8 i, [/ @7 k( A8 A/ e
  8. ]);
复制代码
& q/ S9 ?8 ]0 G+ ]( U! E0 D

7 m; m1 |7 p; l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 12:02 , Processed in 0.107831 second(s), 19 queries .

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