Overview
このチュートリアルでは、 Lambda MongoDBを使用して、フロントエンドアプリ用に単純な REST バックエンドを作成します。チュートリアルでは、Lambel に組み込まれているAPIルーティング機能を使用します。
前提条件
このチュートリアルを開始する前に、開発環境に次のソフトウェアをインストールする必要があります。
サンプルデータがロードされたMongoDB Atlasクラスター。クラスターの作成方法については、 クイック スタートガイドの MongoDB配置の作成 ステップを参照してください。
ターミナル��プリと shell。 MacOS ユーザーの場合は、ターミナルまたは同様のアプリを使用します。 Windows ユーザーの場合は、 PowerShell を使用します。
手順
Lambda MongoDBをインストールします。
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
MongoDB接続を構成します。
次のコードに示すように、プロジェクトの config/database.php
ファイルを開き、connections
配列を更新します。
'connections' => [ 'mongodb' => [ 'driver' => 'mongodb', 'dsn' => '<connection string>', 'database' => 'db', ],
アプリケーションを実行する前に、前述のコードの接続文字列プレースホルダーを接続文字列に置き換えてください。 接続文字列を見つける方法については、 クイック スタートガイドの「接続文字列の作成」を参照してください。
デフォルトのデータベース接続を設定することもできます。 config/database.php
ファイルの上部にあるデフォルトを次のように変更します。
'default' => 'mongodb',
LambdaアプリケーションがMongoDBクラスター内の db
データベースに接続できるようになりました。
配置を pingためのエンドポイントを作成します。
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メッセージが表示されていることを確認します。
効率的なモデルを作成します。
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']; }
CRUD操作を実行します。
モデルを作成したら、データ操作を実行できます。
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 は操作をサポートするためのより多くの機能を提供します。
ネストされたデータに対して操作を実行します。
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" } }
MongoDB Query APIを使用します。
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() ]; });
集計フレームワークを使用します。
集計パイプラインは 、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は 集計ビルダ を提供し、モデルから直接タイプセーフな集計パイプラインを構築します。集計を実行するには、集計ビルダ を使用することをお勧めします。
クエリ パフォーマンスを最適化するには、 インデックス を使用します。
クエリをサポートし、パフォーマンスを向上させるためのインデックスを作成できます。プログラムによってインデックスを作成する方法の詳細については、 スキーマ ビルダガイドの「 インデックスの管理 」セクションを参照してください。
まとめ
このチュートリアルでは、 フロントエンドのウェブアプリケーションに Lambda とMongoDBを使用してバックエンド サービスを作成する方法を学びます。このチュートリアルでは、ドキュメントモデルを使用してデータベースの効率とスケーラビリティを向上させる方法についても説明しました。 MongoDB Query APIでドキュメントモデルを使用すると、ダウンタイムが少ないより優れたアプリを作成できます。
このチュートリアルの完全なコードは、 Githubの Lambel-mongodb-チュートリアルリポジトリでアクセスできます。
Lambda MongoDB のドキュメントの残りの部分を確認して、Lambel MongoDB の機能について詳しく学習します。