PHP7使用 MongoDB\Driver\Manager 類實現簡單的增刪改查操作

PHP7使用 MongoDB\Driver\Manager 類實現簡單的增刪改查操作

MongoDB 是一個由 C++ 語言編寫的,基於分佈式文件存儲的數據庫。官方號稱是“現代應用程序中最流行的數據庫”(The most popular database for modern apps)。

今天,我們 PHP7 使用 MongoDB\Driver\Manager 類來演示一下簡單的增刪改查操作。

查看 MongoDB 擴展文檔,主要有一下幾組類:

MongoDB\Driver // MongoDB驅動類 
MongoDB\BSON   // BSON 類型與序列化函數
MongoDB\Driver\Monitoring // 監控
MongoDB\Driver\Exception  // 異常

基本操作用的都是 MongoDB\Driver 下的操作類:

MongoDB\Driver\Manager   // 入口類,負責維護與MongoDB的連接,執行讀寫和命令
MongoDB\Driver\BulkWrite // 收集要發送到服務器的一個或多個插入、更新、刪除等操作
MongoDB\Driver\Query  // 構造查詢對象
MongoDB\Driver\Cursor // 封裝MongoDB命令或查詢的結果
MongoDB\Driver\WriteResult // 封裝執行結果

準備

首先確保已經安裝好了 php-mongodb 擴展。

$ php -m |grep mongodb
mongodb

查看當前 PHP 版本:

$ php -v
PHP 7.4.0beta4 (cli) (built: Aug 28 2019 11:41:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.0beta4, Copyright (c), by Zend Technologies

創建一個 MongoDB 連接:

創建一個 mongodb.php 文件

<?php
// 連接 MongoDB 數據庫
$manager = new MongoDB\Driver\Manager("mongodb://192.168.10.10:27017");
var_dump($manager);

如果連接正常會返回如下結果:

$ php mongodb.php
object(MongoDB\Driver\Manager)#1 (2) {
  ["uri"]=> string(29) "mongodb://192.168.10.10:27017"
  ["cluster"]=> array(1) {
    [0]=> array(10) {
      ["host"]=> string(13) "192.168.10.10"
      ["port"]=> int(27017)
      ["type"]=> int(1)
      ["is_primary"]=> bool(false)
      ["is_secondary"]=> bool(false)
      ["is_arbiter"]=> bool(false)
      ["is_hidden"]=> bool(false)
      ["is_passive"]=> bool(false)
      ["last_is_master"]=> array(10) {
        ["ismaster"]=> bool(true)
        ["maxBsonObjectSize"]=> int(16777216)
        ["maxMessageSizeBytes"]=> int(48000000)
        ["maxWriteBatchSize"]=> int(100000)
        ["localTime"]=> object(MongoDB\BSON\UTCDateTime)#2 (1) {
          ["milliseconds"]=> string(13) "1592379129886"
        }
        ["logicalSessionTimeoutMinutes"]=> int(30)
        ["minWireVersion"]=> int(0)
        ["maxWireVersion"]=> int(7)
        ["readOnly"]=> bool(false)
        ["ok"]=> float(1)
      }
      ["round_trip_time"]=> int(0)
    }
  }
}

如果連接了一個不存在的地址,會返回如下結果。因爲不管連接的地址存不存在,都會返回一個MongoDB\Driver\Manager對象:

$ php mongodb.php
object(MongoDB\Driver\Manager)#1 (2) { 
 ["uri"]=> string(30) "mongodb://192.168.10.102:27017" 
 ["cluster"]=> array(0) { } 
}

增:插入一些數據

使用 MongoDB\Driver\BulkWrite 類進行操作:

英文單詞 bulk 大量 + write 寫,就是大量的寫入,即進行批量寫入操作(insert, update, delete)。

$manager = new MongoDB\Driver\Manager("mongodb://192.168.10.10:27017");

$bulk = new MongoDB\Driver\BulkWrite();
$id1 = $bulk->insert([
    'product_id'        => 101,
    'product_name'      => '俱樂部全犬種成犬糧天然健康狗糧10kg',
    'product_price'     => 269.00,
    'created_at' => new MongoDB\BSON\UTCDateTime(),
]);
$id2 = $bulk->insert([
    'product_id'        => 102,
    'product_name'      => '泰迪成犬糧專用狗糧2.5kg',
    'product_price'     => 245.00,
    'created_at' => new MongoDB\BSON\UTCDateTime(),
]);
$id3 = $bulk->insert([
    'product_id'        => 103,
    'product_name'      => '中小型成犬糧牛肉蔬菜狗糧500g',
    'product_price'     => 14.00,
    'created_at' => new MongoDB\BSON\UTCDateTime(),
]); 

var_dump('--> ID 1 是: ' . $id1);
var_dump('--> ID 2 是: ' . $id2);
var_dump('--> ID 3 是: ' . $id3);

try {
    $result = $manager->executeBulkWrite('testdb.products', $bulk);
    var_dump($result->getInsertedCount());
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    var_dump($e->getWriteResult()->getWriteErrors());
}

例子中 testdb.products, 是指定操作 testdb 數據庫中的 products 集合(類似與MySQL的表)。

例子中使用 MongoDB\BSON\UTCDateTime() 來生成 UTC 時間:

ISODate("2020-06-17T07:32:09.885Z")

MongoDB\BSON\UTCDateTime Object(
  [milliseconds] => 1592379129885
)

執行返回結果如下:

$ php mongodb.php
string(40) "--> ID 1 是: 5ee9c6f993d70221cc0dc56b"
string(40) "--> ID 2 是: 5ee9c6f993d70221cc0dc56c"
string(40) "--> ID 3 是: 5ee9c6f993d70221cc0dc56d"
int(3)

查:執行查詢操作

使用 MongoDB\Driver\Query 進行查詢操作

$manager = new MongoDB\Driver\Manager("mongodb://192.168.10.10:27017");

$filter = ['product_price' => ['$gt' => 100]];
$options = [
    'projection' => ['_id' => 0],
    'sort' => ['product_price' => 1],
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('testdb.products', $query);

foreach ($cursor as $document) {
    print_r($document);
}

查詢結果如下:

$ php mongodb.php
stdClass Object (
    [product_id] => 102
    [product_name] => 泰迪成犬糧專用狗糧2.5kg
    [product_price] => 245
    [created_at] => MongoDB\BSON\UTCDateTime Object (
        [milliseconds] => 1592379129885
    )
)
stdClass Object (
    [product_id] => 101
    [product_name] => 俱樂部全犬種成犬糧天然健康狗糧10kg
    [product_price] => 269
    [created_at] => MongoDB\BSON\UTCDateTime Object(
        [milliseconds] => 1592379129885
    )
)

更新與刪除操作

更新與刪除依然使用 MongoDB\Driver\BulkWrite 進行操作:

$manager = new MongoDB\Driver\Manager("mongodb://192.168.10.10:27017");

$bulk = new MongoDB\Driver\BulkWrite();

// 修改 update 
$filters = ['product_id' => 103];
$sets = ['$set' => ['product_price' => 111.22]];
$updateOptions = ['multi' => false, 'upsert' => false];
$bulk->update($filters, $sets, $updateOptions);

// 刪除 delete
$filters = ['product_id' => 101];
$bulk->delete($filters);

try {
    $result = $manager->executeBulkWrite('testdb.products', $bulk);
    var_dump('修改影響的條數: ' . $result->getModifiedCount());
    var_dump('刪除影響的條數: ' . $result->getDeletedCount());
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    var_dump($e->getWriteResult()->getWriteErrors());
}

操作返回結果如下:

$ php mongodb.php
string(24) "修改影響的條數: 1" 
string(24) "刪除影響的條數: 1"

請使用推薦的類庫進行操作

以上內容僅演示如何使用 php mongodb 擴展進行簡單的增刪改查操作。

如果真要再項目中使用 PHP 進行 MongoDB 操作,還是需要使用一些封裝好的 PHP 類庫。

(1) MongoDB PHP Library

該類庫是 MongoDB 自己出品的操作類。 The MongoDB PHP Library is a high-level abstraction for the MongoDB PHP driver.

$ composer require mongodb/mongodb

(2) 如果是 Laravel/Lumen 項目,可以使用:jenssegers/laravel-mongodb

該類庫對 mongodb/mongodb 進行了封裝,能與 Laravel/Lumen 進行更好的融合,可以使用 Laravel/Lumen 封裝好的查詢構造器,方便操作。

$ composer require jenssegers/mongodb

(3) 更多類型請參考 MongoDB 網站的 PHP Libraries, Frameworks, and Tools

參考鏈接

https://docs.mongodb.com/drivers/php-libraries
https://blog.csdn.net/weixin_43910923/article/details/89606752

[END]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章