PHP Conference Japan 2024

使用 MongoDB 的 PHP 函式庫 (PHPLIB)

在初始擴充功能設定完成後,我們將繼續說明如何開始使用對應的使用者層函式庫來撰寫第一個專案。

使用 Composer 安裝 PHP 函式庫

為了開始應用程式本身的開發,我們最後需要安裝的是 PHP 函式庫。

此函式庫需要使用 » Composer 安裝,Composer 是 PHP 的套件管理器。在各種平台上安裝 Composer 的說明可以在其網站上找到。

執行以下命令安裝函式庫

$ composer require mongodb/mongodb

它會輸出類似以下的內容

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing mongodb/mongodb (1.0.0)
    Downloading: 100%

Writing lock file
Generating autoload files

Composer 將會建立數個檔案:composer.jsoncomposer.lock,以及一個 vendor 目錄,其中將包含函式庫以及專案可能需要的任何其他相依性。

使用 PHP 函式庫

除了管理您的相依性之外,Composer 還將為您提供一個自動載入器(用於這些相依性的類別)。請確保在腳本的開頭或應用程式的引導程式碼中包含它。

<?php
// 此路徑應指向 Composer 的自動載入器
require 'vendor/autoload.php';

完成此操作後,您現在可以使用 » 函式庫文件中所述的任何功能。

如果您在其他語言中使用過 MongoDB 驅動程式,則該函式庫的 API 應該看起來很熟悉。它包含一個 » Client 類別,用於連線到 MongoDB,一個 » Database 類別,用於資料庫層級的操作(例如命令、集合管理),以及一個 » Collection 類別,用於集合層級的操作(例如 » CRUD 方法、索引管理)。

例如,這是將文件插入 *demo* 資料庫的 *beers* 集合中的方法

<?php
require 'vendor/autoload.php'; // 包含 Composer 的自動載入器

$client = new MongoDB\Client("mongodb://127.0.0.1:27017");
$collection = $client->demo->beers;

$result = $collection->insertOne( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

echo
"以物件 ID '{$result->getInsertedId()}'" 插入";
?>

由於插入的文件不包含 _id 欄位,因此擴充功能將產生一個 MongoDB\BSON\ObjectId,供伺服器用作 _id。此值也可透過 insertOne 方法傳回的結果物件提供給呼叫者。

插入後,您可以查詢剛插入的資料。為此,您可以使用 find 方法,它會傳回可迭代的游標

<?php
require 'vendor/autoload.php'; // 包含 Composer 的自動載入器

$client = new MongoDB\Client("mongodb://127.0.0.1:27017");
$collection = $client->demo->beers;

$result = $collection->find( [ 'name' => 'Hinterland', 'brewery' => 'BrewDog' ] );

foreach (
$result as $entry) {
echo
$entry['_id'], ': ', $entry['name'], "\n";
}
?>

雖然在範例中可能不明顯,但 BSON 文件和陣列預設會在此函式庫中反序列化為特殊類別。這些類別會擴展 ArrayObject 以提高可用性,並實作擴充功能的 MongoDB\BSON\SerializableMongoDB\BSON\Unserializable 介面,以確保值在序列化回 BSON 時保留其類型。這避免了傳統 mongo 擴充功能中的一個警告,其中陣列可能會變成文件,反之亦然。有關值如何在 PHP 和 BSON 之間轉換的更多資訊,請參閱持久化資料規格。

新增註解

使用者貢獻的註解 7 則註解

surajtiwari020 at gmail dot com
6 年前
大多數的教學都沒解釋清楚,所以我希望這對某些人有所幫助
注意:這是我的 Laravel 專案的一部分

// 從集合中取得資料
<?php

use MongoDB\Client as Mongo;

$user = "admin";
$pwd = 'password';

$mongo = new Mongo("mongodb://${user}:${pwd}@127.0.0.1:27017");
$collection = $mongo->db_name->collection;
$result = $collection->find()->toArray();

print_r($result);

?>
salos_12 at hotmail dot com
5 年前
當您的資料庫名稱包含「-」(例如 database-name)時,您需要改用字串。

<?php

$client
= new MongoDB\Client("mongodb://ip_address:port");
$collection = $client->{'database-name'}->collection;

?>
wpg
5 年前
如果您有一些 JSON 文件,其中包含巢狀元素(例如下方的 'responseId'),而且您想知道有多少文件具有 responseId
{"result":{"responseId":"xyz"}}
{"result":NULL}
{"result":{"responseId":"abc"}}

我使用以下格式時不順利
<?php
// 嘗試取得 responseId 不等於 NULL 的文件計數(對我來說無效)
$intCount = $collection->count(['result' => ['responseId' => ['$ne' => NULL]]]);
?>

相反地,我需要在 JSON 元素之間使用句點。
<?php
// 取得 responseId 不等於 NULL 的文件計數
$intCount = $collection->count(['result.responseId' => ['$ne' => NULL]]);
?>
crystale dot darck at gmail dot com
7 年前
要測試您的連線字串,您可以執行類似以下的操作

<?php
$mongo
= new MongoDB\Client('mongodb://my_server_does_not_exist_here:27017');
try
{
$dbs = $mongo->listDatabases();
}
catch (
MongoDB\Driver\Exception\ConnectionTimeoutException $e)
{
// PHP 無法使用指定的 MongoDB 連線字串找到 MongoDB 伺服器
// 在此處執行某些操作
}
?>
Dc Shiman
8 年前
使用投影對集合執行文字搜尋

$search['$text'] = ['$search' => "foo"];
$options["projection"] = ['score' => ['$meta' => "textScore"]];
$options["sort"] = ["score" => ['$meta' => "textScore"]];

$cursor = $collection->find($search, $options);
Basher
8 年前
撰寫本文時,可以安裝 Pecl MongoDB(請參閱 phpinfo()),但 composer 會抱怨它不存在。

$ composer require "mongodb/mongodb=^1.0.0"
...
您的需求無法解析為可安裝的套件組合。

如果您看到此訊息,請嘗試

$ composer require "mongodb/mongodb=^1.0.0" --ignore-platform-reqs
drankinatty at NOSPAMgmail dot com
28 天前
一個未解答的問題是如何處理將完整的 JSON 文件作為參數(或在字串變數中)插入。mongodb 擴充功能可以透過簡單地使用 json_decode() 將 JSON 文件轉換為物件來處理,然後可以輕鬆插入,例如(完整的檔案作為第二個命令列參數提供)

<?php
/* 包含 libmongo API */
require "vendor/autoload.php";

/* 包含連線字串、資料庫和集合值 */
require __DIR__ . '/site/db-mongo-inc.php';

/* 使用 MongoDBClient; */
use MongoDB\Client;

/* 連線字串 */
$uri = "mongodb://$user:$pass@localhost";

/* 嘗試使用 $uri 連線到資料庫 */
$client = new MongoDB\Client("$uri");
if (!isset(
$client)) {
echo
'error: connection failed';
}

/* 定義文件集合 */
$collection = $client->$db->$collection;

/* 從字串變數(此處為 $argv[2])插入 JSON 文件 */
if ($argc > 2) {
$jsobj = json_decode ($argv[2]);
if (
$jsobj) {
$iresult = $collection->insertOne ( $jsobj );
if (!
$iresult) {
printf ("error: insert of object failed.\n");
}
}
}
?>

擴充功能的區塊插入功能會遞迴解析物件中包含的所有欄位和資料值,並將整個文件插入集合中。 最好移除 "_id:" 欄位並讓系統自動產生,以避免問題。
To Top