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]