Docs Menu
Docs Home
/ / /
Lambda MongoDB
/

チュートリアル: Lambda MongoDBを使用してバックエンド サービスを構築する

このチュートリアルでは、 Lambda MongoDBを使用して、フロントエンドアプリ用に単純な REST バックエンドを作成します。チュートリアルでは、Lambel に組み込まれているAPIルーティング機能を使用します。

このチュートリアルを開始する前に、開発環境に次のソフトウェアをインストールする必要があります。

  • サンプルデータがロードされたMongoDB Atlasクラスター。クラスターの作成方法については、 クイック スタートガイドの MongoDB配置の作成 ステップを参照してください。

  • PHP.

  • Composer。

  • MongoDB PHP拡張機能。

  • ターミナル��プリと shell。 MacOS ユーザーの場合は、ターミナルまたは同様のアプリを使用します。 Windows ユーザーの場合は、 PowerShell を使用します。

1

まず、 Lambdaプロジェクトディレクトリを作成します。次に、次のコマンドを実行して、laraproject という新しい Lambdaプロジェクトを作成します。

composer create-project laravel/laravel laraproject
2

Lambda MongoDB がウェブサーバーで実行中いることを確認するには、 Lambda のウェブウェブサイトにウェブページを追加します 。プロジェクトで、/routes/web.php に移動し、次のルートを追加します。

Route::get('/info', function () {
phpinfo();
});

次に、 シェルで次のコマンドを実行して、アプリケーションを起動します。

php artisan serve

アプリケーションが の実行中を開始したら、 http://:127.0.0.1 8000/info に移動して PHP 情報ページを表示します。 mongodb エントリまで下にスクロールするか、検索して、 MongoDB PHP拡張機能がインストールされていることを確認します。

Lambda MongoDBをインストールするには、 シェルで次のコマンドを実行します。

composer require mongodb/laravel-mongodb:^5.4
3

次のコードに示すように、プロジェクトの config/database.phpファイルを開き、connections 配列を更新します。

'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'dsn' => '<connection string>',
'database' => 'db',
],

アプリケーションを実行する前に、前述のコードの接続文字列プレースホルダーを接続文字列に置き換えてください。 接続文字列を見つける方法については、 クイック スタートガイドの「接続文字列の作成」を参照してください。

デフォルトのデータベース接続を設定することもできます。 config/database.phpファイルの上部にあるデフォルトを次のように変更します。

'default' => 'mongodb',

LambdaアプリケーションがMongoDBクラスター内の dbデータベースに接続できるようになりました。

4

APIルーティングを設定するには、次のシェルコマンドを実行します。

php artisan install:api

新しく作成された routes/api.phpファイルに、次のルートを追加します。

// Add the DB use statement to the top of the file.
use Illuminate\Support\Facades\DB;
Route::get('/ping', function (Request $request) {
$connection = DB::connection('mongodb');
$msg = 'MongoDB is accessible!';
try {
$connection->command(['ping' => 1]);
} catch (\Exception $e) {
$msg = 'MongoDB is not accessible. Error: ' . $e->getMessage();
}
return ['msg' => $msg];
});

アプリケーションを再読み込みし、 http://:127.0.0.1 8000/api/ pingに成功したpingメッセージが表示されていることを確認します。

5

Lambda は、データベースバックエンドを抽象化する ORM である Eloqueent と統合され、共通のインターフェースを使用して異なるデータベースに接続できるようになります。

Elastic は、コードと特定のコレクション間のインターフェースとして機能する Modelクラスを提供します。 Model クラスのインスタンスは、関係データベース内のテーブルの行を表します。 MongoDBでは、それらはコレクション内のドキュメントです。

Tip

Eloqueent モデルで入力可能なフィールドを定義すると、アプリケーション内でドキュメントスキーマを強制し、名前の入力ミスなどのエラーを防ぐことができます。詳しくは、「 Elasty モデル クラスガイド 」の「 一括割り当てをカスタマイズする 」セクションを参照してください。

プロジェクトルートから次のコマンドを実行中て、CustomerMongoDB という Equality モデルを作成します。

php artisan make:model CustomerMongoDB

Lambda は /modelsディレクトリに CustomerMongoDBクラスを作成します。デフォルトでは 、モデルは defaultデータベース接続を使用しますが、使用する接続を指定するには $connection メンバーをクラスに追加します。$collection メンバーを追加してコレクション名を指定することもできます。

MongoDB Eloquet モデルの use ステートメントを必ず含めてください。これは、_id をプライマリキーとして設定するために必要です。

CustomerMongoDB.phpファイルの内容を次のコードで置き換えます。

use MongoDB\Laravel\Eloquent\Model;
class CustomerMongoDB extends Model
{
// the selected database as defined in /config/database.php
protected $connection = 'mongodb';
// equivalent to $table for MySQL
protected $collection = 'laracoll';
// defines the schema for top-level properties (optional).
protected $fillable = ['guid', 'first_name', 'family_name', 'email', 'address'];
}
6

モデルを作成したら、データ操作を実行できます。

api.phpファイルに次のルートを作成します。

Route::get('/create_eloquent_mongo/', function (Request $request) {
$success = CustomerMongoDB::create([
'guid'=> 'cust_1111',
'first_name'=> 'John',
'family_name' => 'Doe',
'email' => 'j.doe@gmail.com',
'address' => '123 my street, my city, zip, state, country'
]);
});

ドキュメントを挿入した後、次のコードに示すように where() メソッドを使用してそのドキュメントを取得できます。

Route::get('/find_eloquent/', function (Request $request) {
$customer = CustomerMongoDB::where('guid', 'cust_1111')->get();
});

Elastic を使用すると、一致する条件が複数ある複雑なクエリを使用してデータを検索できます。

次のルートに表示されているデータをアップデートおよび削除することもできます。

Route::get('/update_eloquent/', function (Request $request) {
$result = CustomerMongoDB::where('guid', 'cust_1111')->update( ['first_name' => 'Jimmy'] );
});
Route::get('/delete_eloquent/', function (Request $request) {
$result = CustomerMongoDB::where('guid', 'cust_1111')->delete();
});

この点で 、 MongoDBに接続されたバックエンド サービスは実行中ますが、 MongoDB は操作をサポートするためのより多くの機能を提供します。

7

Lambda MongoDB は、ネストされたデータに対してMongoDB固有の操作を提供します。ただし、embedsMany() メソッドと embedsOne() メソッドを使用せずにネストされたデータを追加する方法も直感的です。

前の手順で示されているように、最上位のスキーマ属性を定義できます。ただし、ドキュメントに配列や埋め込みドキュメントが含まれる場合は、これらの属性を定義する際、より複雑になります。

PHPでモデルのデータ構造を作成できます。次の例では、addressフィールドはオブジェクトタイプです。emailフィールドは string の配列です。

Route::get('/create_nested/', function (Request $request) {
$message = "executed";
$success = null;
$address = new stdClass;
$address->street = '123 my street name';
$address->city = 'my city';
$address->zip= '12345';
$emails = ['j.doe@gmail.com', 'j.doe@work.com'];
try {
$customer = new CustomerMongoDB();
$customer->guid = 'cust_2222';
$customer->first_name = 'John';
$customer->family_name= 'Doe';
$customer->email= $emails;
$customer->address= $address;
$success = $customer->save(); // save() returns 1 or 0
}
catch (\Exception $e) {
$message = $e->getMessage();
}
return ['msg' => $message, 'data' => $success];
});

/api/create_nested/ エンドポイントにアクセスすると、 MongoDBにドキュメントが作成されます。

{
"_id": {...},
"guid": "cust_2222",
"first_name": "John",
"family_name": "Doe",
"email": [
"j.doe@gmail.com",
"j.doe@work.com"
],
"address": {
"street": "123 my street name",
"city": "my city",
"zip": "12345"
},
"updated_at": {
"$date": "2025-05-27T17:38:28.793Z"
},
"created_at": {
"$date": "2025-05-27T17:38:28.793Z"
}
}
8

MongoDB は最適化されたクエリのための Query APIを提供します。

collectionオブジェクトを使用して、クエリの作成を開始できます。 Eloquet は、「raw クエリ」を使用することで、基礎となるデータベースの完全な機能を公開します。このクエリは Lambda が Elastic Query Builder からの処理なしでデータベースに送信するものです。

次のコードに示すように、 モデルから未加工のネイティブMongoDBクエリを実行できます。

$mongodbquery = ['guid' => 'cust_1111'];
// returns a "Illuminate\Database\Eloquent\Collection" Object
$results = CustomerMongoDB::whereRaw( $mongodbquery )->get();

また、ネイティブMongoDBコレクションオブジェクトにアクセスし、ネイティブMongoDBドキュメントやカーソルなどのオブジェクトを返すクエリを実行できます。

$mongodbquery = ['guid' => 'cust_1111', ];
$mongodb_native_collection = DB::connection('mongodb')->getCollection('laracoll');
$document = $mongodb_native_collection->findOne( $mongodbquery );
$cursor = $mongodb_native_collection->find( $mongodbquery );

次のコードは、クエリを実行する複数の方法を示しています。

Route::get('/find_native/', function (Request $request) {
// a simple MongoDB query that looks for a customer based on the guid
$mongodbquery = ['guid' => 'cust_2222'];
// Option #1
// =========
// use Eloquent's whereRaw() function
// returns a "Illuminate\Database\Eloquent\Collection" Object
$results = CustomerMongoDB::whereRaw( $mongodbquery )->get();
// Option #2 & #3
// ==============
// use the native MongoDB driver Collection object and the Query API
$mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
// find the first document that matches the query
$mdb_bsondoc = $mdb_collection->findOne( $mongodbquery ); // returns a "MongoDB\Model\BSONDocument" Object
// to convert the MongoDB Document to a Laravel Model, use the Model's newFromBuilder() method
$cust = new CustomerMongoDB();
$one_doc = $cust->newFromBuilder((array) $mdb_bsondoc);
// find all documents because you pass an empty query
$mdb_cursor = $mdb_collection->find(); // returns a "MongoDB\Driver\Cursor" object
$cust_array = array();
foreach ($mdb_cursor->toArray() as $bson) {
$cust_array[] = $cust->newFromBuilder( $bson );
}
return ['msg' => 'executed', 'whereraw' => $results, 'document' => $one_doc, 'cursor_array' => $cust_array];
});

次のコードは、updateOne() メソッドを使用してドキュメントをアップデートする方法を示しています。

Route::get('/update_native/', function (Request $request) {
$mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
$match = ['guid' => 'cust_2222'];
$update = ['$set' => ['first_name' => 'Henry', 'address.street' => '777 new street name'] ];
$result = $mdb_collection->updateOne($match, $update );
return ['msg' => 'executed', 'matched_docs' => $result->getMatchedCount(), 'modified_docs' => $result->getModifiedCount()];
});

次のコードは、deleteOne() メソッドを使用してドキュメントを削除する方法を示しています。

Route::get('/delete_native/', function (Request $request) {
$mdb_collection = DB::connection('mongodb')->getCollection('laracoll');
$match = ['guid' => 'cust_2222'];
$result = $mdb_collection->deleteOne($match );
return ['msg' => 'executed', 'deleted_docs' =>
$result->getDeletedCount() ];
});

CRUD操作の実行方法の詳細については、「 書込み操作 」および「 読み取り操作 」のガイドを参照してください。

9

集計パイプラインは 、MongoDB の集計フレームワーク内のタスクです。集計フレームワークを使用して、リアルタイムダッシュボードや大規模なデータ分析などのさまざまなタスクを実行できます。

集計パイプラインは複数の ステージsample_mflix で構成され、各ステージの出力は次のステージの入力になります。この手順では、Atlasサンプルデータセット の を使用します。 Lambda では同じアプリ内で複数のMongoDB database にアクセスできるため、次のようにsample_mflix データベース接続を に追加します。database.php

'mongodb_mflix' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI'),
'database' => 'sample_mflix',
],

次に、/aggregate/ APIエンドポイントを作成し、moviesコレクションからデータを取得するための集計パイプラインを定義し、各ジャンルの平均映画評価を計算し、 リストを返します。

Route::get('/aggregate/', function (Request $request) {
$mdb_collection = DB::connection('mongodb_mflix')->getCollection('movies');
$stage0 = ['$unwind' => ['path' => '$genres']];
$stage1 = ['$group' => ['_id' => '$genres', 'averageGenreRating' => ['$avg' => '$imdb.rating']]];
$stage2 = ['$sort' => ['averageGenreRating' => -1]];
$aggregation = [$stage0, $stage1, $stage2];
$mdb_cursor = $mdb_collection->aggregate( $aggregation );
return ['msg' => 'executed', 'data' => $mdb_cursor->toArray() ];
});

MongoDBは 集計ビルダ を提供し、モデルから直接タイプセーフな集計パイプラインを構築します。集計を実行するには、集計ビルダ を使用することをお勧めします。

10

クエリをサポートし、パフォーマンスを向上させるためのインデックスを作成できます。プログラムによってインデックスを作成する方法の詳細については、 スキーマ ビルダガイドの「 インデックスの管理 」セクションを参照してください。

このチュートリアルでは、 フロントエンドのウェブアプリケーションに Lambda とMongoDBを使用してバックエンド サービスを作成する方法を学びます。このチュートリアルでは、ドキュメントモデルを使用してデータベースの効率とスケーラビリティを向上させる方法についても説明しました。 MongoDB Query APIでドキュメントモデルを使用すると、ダウンタイムが少ないより優れたアプリを作成できます。

このチュートリアルの完全なコードは、 Githubの Lambel-mongodb-チュートリアルリポジトリでアクセスできます。

Lambda MongoDB のドキュメントの残りの部分を確認して、Lambel MongoDB の機能について詳しく学習します。

戻る

次のステップ