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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13209|回复: 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" L. j$ @/ U6 j+ X- ?. E/ [

  2.   D- b. B6 b* T
  3. use MongoDB\Driver\Manager;2 |! G3 {- U: y0 [. x% ]
  4. use MongoDB\Driver\BulkWrite;
    $ n1 ?$ j% Z, K  X% M: @# Z
  5. use MongoDB\Driver\WriteConcern;
    5 _: \/ M7 H7 h8 n9 \
  6. use MongoDB\Driver\Query;1 Y; W/ }* f* o. x' H
  7. use MongoDB\Driver\Command;+ X6 |) U4 W  b& N9 J
  8. # x3 V1 Z! d6 m6 e) _! N
  9. class MongoDb {
    ; A% m1 V, K1 ]8 f1 q( |2 u$ ]

  10. $ L8 k7 n7 r2 D& J- e
  11.     protected $mongodb;6 ~0 i3 Z& l# g6 U, z: c0 B$ Y( v/ _
  12.     protected $database;8 g! X& i% l# }. p; R: W
  13.     protected $collection;
    , i( [' b; R, E/ ^0 F$ t
  14.     protected $bulk;
    ; W2 k- a( l3 U7 q
  15.     protected $writeConcern;5 A5 w# d7 m/ D
  16.     protected $defaultConfig+ M1 B" u- {: A: S& Y% |
  17.         = [, L: H3 b0 d; ^; p1 q
  18.             'hostname' => 'localhost',7 _7 A' X9 u( b8 M- @5 U, Y
  19.             'port' => '27017',7 z# M& ^. U  h. a$ \( e4 {
  20.             'username' => '',
    . Q; [: N0 Y; Z& `
  21.             'password' => '',
    9 P. L5 f& K3 T$ R' M( B/ |
  22.             'database' => 'test'
    1 B+ J7 u0 ]& I, T# M; m! O
  23.         ];
    8 G! d: l9 q3 X/ @. `
  24. # E) A) I& i  n# ~
  25.     public function __construct($config) {
    3 w- Y+ J6 L+ S# @" v
  26.         $config = array_merge($this->defaultConfig, $config);
    ; W" s3 ]0 E; @0 m. q
  27.         $mongoServer = "mongodb://";
    + c  z  H& S  R+ E4 U
  28.         if ($config['username']) {
    " ~' `: N& W: r. k, K
  29.             $mongoServer .= $config['username'] . ':' . $config['password'] . '@';  U! |) m3 @9 I/ w8 }9 L4 g
  30.         }$ O# F) h* n& N7 C
  31.         $mongoServer .= $config['hostname'];+ y" I, i4 ?- ?( I* `
  32.         if ($config['port']) {
    . W; E6 y( {; d8 s2 L' g7 r
  33.             $mongoServer .= ':' . $config['port'];
    % o4 L' m4 f* b
  34.         }
    3 }9 D" V9 U, I
  35.         $mongoServer .= '/' . $config['database'];
    % K. T& x) W; M+ z
  36. , ?+ i6 `3 Q* a2 z# \
  37.         $this->mongodb = new Manager($mongoServer);: e& W6 ~6 s' y( t# r8 ~9 A5 P
  38.         $this->database = $config['database'];
    . s% B- t: v# X( d
  39.         $this->collection = $config['collection'];
    + ?% o$ Q: T4 O' x5 {$ T' k
  40.         $this->bulk = new BulkWrite();2 g  ^# H6 W( q
  41.         $this->writeConcern = new WriteConcern(WriteConcern::MAJORITY, 100);
    % t: Q8 Y1 c& G
  42.     }
    " |# @, u8 d' F1 w) j

  43. ) u- {) f( H3 L+ d" S
  44.     public function query($where = [], $option = []) {4 P# F+ q1 |( ?' L1 t( H; g8 ~
  45.         $query = new Query($where, $option);9 r4 I/ w4 c2 E+ r& |5 t8 Y! b
  46.         $result = $this->mongodb->executeQuery("$this->database.$this->collection", $query);
    2 [0 K; [- d2 y! s4 T% I: H
  47. ' H4 q  `: e* ?
  48.         return json_encode($result);8 o( F+ g& F6 g; M. E7 R
  49.     }$ X$ f+ {' g% _1 i8 n1 M

  50. + }. H+ Z  R0 Q: {6 C% ]! c+ S$ a
  51.     public function count($where = []) {1 N, o) s& Y+ [, F4 F7 G
  52.         $command = new Command(['count' => $this->collection, 'query' => $where]);: d+ q7 d( l$ D6 y4 z' ^
  53.         $result = $this->mongodb->executeCommand($this->database, $command);" G3 \. h/ J' M8 ^" x3 ?1 k: p
  54.         $res = $result->toArray();2 F7 o, g1 [  `/ t) N/ V
  55.         $count = 0;
    1 N- _2 E+ k7 E! Z
  56.         if ($res) {: z0 K. R7 {- M4 t0 K
  57.             $count = $res[0]->n;' Q7 E/ |5 [- _2 G
  58.         }" d! V$ p; y. n' m. G, i' \

  59. ( R7 _3 D6 T! L% S4 q
  60.         return $count;7 K  f3 o3 ?/ N
  61.     }/ B( P7 V9 F! z' L

  62. - {6 c. e& G' }4 a, \; K( ?# f8 _. \
  63.     public function update($where = [], $update = [], $upsert = false) {! O# ~% `$ |* |0 h( C
  64.         $this->bulk->update($where, ['$set' => $update], ['multi' => true, 'upsert' => $upsert]);( k! G2 t6 w  G. ^7 O! ^. X  A
  65.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);5 c$ O  ~  `6 G$ z: L! P

  66. " \. t: u/ E* ]3 W/ _- T! o
  67.         return $result->getModifiedCount();
    5 L; h4 i* l5 ]- G/ u1 I
  68.     }
    , q, ]/ }% `" h3 U
  69. 6 I# Q8 S! a" |+ @" ~- T) w
  70.     public function insert($data = []) {
    ( |  D. H- s7 B, Q7 F( e. ]- w
  71.         $this->bulk->insert($data);
    & N5 B/ d% l+ y/ x
  72.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);$ t5 m; S3 c5 T# |  r0 g0 ?8 x
  73. % d( }9 w  ~: F: P% M! |
  74.         return $result->getInsertedCount();
    4 B3 O) r) F5 S3 E3 L+ ~) e8 {0 `
  75.     }1 D1 D/ O& X3 @& ]% Q  J

  76. 4 K$ c- ~, i2 s- ^
  77.     public function delete($where = [], $limit = 1) {" A5 o" Q/ J& W4 H4 w2 _
  78.         $this->bulk->delete($where, ['limit' => $limit]);
    + G+ g  I& y, G+ G3 O  Y
  79.         $result = $this->mongodb->executeBulkWrite("$this->database.$this->collection", $this->bulk, $this->writeConcern);- O/ J5 H9 s. ]) L2 o4 J

  80. 9 l; G# F0 v2 r3 \1 {
  81.         return $result->getDeletedCount();
    1 A; h, [1 b& U( u, l* f
  82.     }; d& D3 H; M8 \
  83. }
复制代码
这样的语法和之前差异太大,改动不方便,换 PHP MongoDB
MongoDB 库1.连接
  • - c8 E6 t2 M  s+ m3 I, }
  1. new MongoClient();
复制代码

  • 7 [6 T, m: M( E. ?
  1. new MongoDB\Client();
复制代码
2.新增
  • % X5 V$ p- y. I! P' R" N! W
  1. $collention->insert($array, $options);
复制代码

  • : r- J! O- \  X" Y  r8 M# I
  1. $resultOne = $collention->insertOne($array, $options);//单5 ~% Y- D7 ]7 L; ]6 |3 J* g" n3 C9 V% j
  2. $lastId = $resultOne->getInsertedId();3 h( R0 K( Q  u3 z* D
  3. $resultMany = $collention->insertMany($array, $options);//多, t; H% Y3 Q/ C. }
  4. $count = $resultMany->getInsertedCount();
复制代码
3.修改

  •   O2 o3 P  `& H, N' B1 i
  1. $collention->update($condition, [
    2 |: G5 p  F( r6 z" \' [
  2.     '$set' => $values
    " w1 G: E  [. U# D/ d) Y. g
  3. ,[
    6 k6 V/ m; t4 c) V5 w0 _
  4.     'multiple' => true//多条,单条false$ a' w& E- b: M2 o% u2 K3 b  ]* D
  5. ]);
复制代码

  • ! c, ^6 I/ P8 o8 I$ B+ x( E
  1. $collection->updateOne(
    ; Q0 K8 j* D# K. e
  2.     ['state' => 'ny'],
    * p( y% c3 n6 U% c- R
  3.     ['$set' => ['country' => 'us']]4 p/ s+ s. Z9 d% X# ?4 z2 a
  4. );/ S" u! A2 z# I; g
  5. $updateResult = $collection->updateMany(
    + {1 s% _- ^3 I# v$ F7 I
  6.     ['state' => 'ny'],
    + x9 R* a+ c8 ~8 w0 @
  7.     ['$set' => ['country' => 'us']]
    " H& X& W' G, N4 ]6 h" `! s* L7 j
  8. );. s, f7 f7 m  O2 h5 l/ C0 i
  9. $count = $updateResult->getModifiedCount();
复制代码
4.查询

  • # t; ^" I, J" A6 x( {7 ~' d# d
  1. $cursor = $collection->find($condition, [& W: N1 e7 j! L7 w& X" w
  2.     'name' => true//指定字段) S- q2 c: F* S: ~7 T0 p
  3. ]);- q! t  y5 |9 ?
  4. $cursor->skip(5);
    & J; Q9 w4 U# q1 U6 w$ @
  5. $cursor->limit(5);: k/ Z. Y' P7 ?& I2 G
  6. $cursor->sort([$ o& d) Q, `9 J
  7.     'time' => -1
    & M; ^! r. c/ G8 t: ~
  8. ]);
复制代码

  • + E. |# ]/ A0 \6 J) h
  1. $cursor = $collection->find($condition, [
    + y/ v( G* S3 ]# R5 g# }# v
  2.     'skip' => 5,- `+ _& I! U! c; t
  3.     'limit' => 5,# P& `1 P: y; x
  4.     'sort' => [
    3 u3 ]6 n2 w* v$ N+ N0 T
  5.         'time' => -1
    + X3 ^& t  P' z0 i* k- w- S
  6.     ],//排序* J  |$ V( c) h' x9 H) G! ~
  7.     'projection' => [
    5 F( Y' T. A- p1 l- U' e; _9 R' y* T( x
  8.         'name' => 1//指定字段* g* m4 f& y. E  K& \
  9.     ]
    - s9 m& B$ [, Y% u1 T) _, O
  10. ]);
复制代码
5.删除

  • ' ^& U  r6 Z  r$ X$ n
  1. $collention->remove($condition, [
      A5 t. S* T; m9 N' c# T
  2.     'justOne' => false//删单条8 R' s$ g9 T! M) K3 S; k- ]
  3. ]);
    & e1 i7 d3 q0 H
  4. $collention->remove([]);//删所有
复制代码

  • & j/ D! b, M* y2 B
  1. $result = $collention->deleteOne($condition, $options);
    + z! Y5 s" ^1 |. K5 Q
  2. $collention->deleteMany($condition, $options);
    $ v8 I; p4 {: R) |, h) b( K7 G
  3. $ F* J1 N* @+ L
  4. $result->getDeletedCount();
复制代码
补充
有些人可能习惯以类似 MySQL 的自增 ID 来处理数据,以前可能使用 findAndModify() 方法来查询并修改:
  1. $collention->findAndModify([, v4 b& l2 u9 C6 S
  2.     '_id' => $tableName//我在自增表中用其它的表名作主键5 m0 B# q, d2 T# |1 H5 ^3 a' s/ A
  3. ], [
    " I6 |4 n, V. Q6 \6 n5 _. M" H
  4.     '$inc' => ['id' => 1]//自增' z6 f4 j6 I6 x* [: e
  5. ], [/ [# c* X+ r% G) V9 P7 b
  6.     '_id' => 0
    : z# L) v7 }2 L7 c; w1 b* X' k
  7. ], [
    * \* }. m* f0 I6 H
  8.     'new' => 1//返回修改后的结果,默认是修改前的
    0 X0 [  G  b. `* T1 K2 @& R/ Z' }! Q
  9. ]);
复制代码
现在使用 MongoDB 库的话需要修改为:
  1. $collention->findOneAndUpdate([
    + d% G6 P2 b* ]! m' d
  2.     '_id' => $tableName9 s: P! L( b$ O7 B
  3. ], [
    1 s1 F) w$ z8 l" i: w) u
  4.     '$inc' => ['id' => 1]
    - ~1 t, e/ ^# B. _. h
  5. ], [
    4 x! l+ T4 G  r
  6.     'projection' => ['id' => 1],
    ) g+ P4 f* u2 p/ r) Y; _  \
  7.     'returnDocument' => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER6 Y2 V: W9 ]3 q
  8. ]);
复制代码
2 O/ M/ t& T! R+ a! R6 I' u
2 M. h+ Q5 T. w9 e4 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 17:27 , Processed in 0.113869 second(s), 19 queries .

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