Overview
Laravel は、スキーマビルダクラスSchema にアクセスするためのファサードを提供します。これにより、 MongoDBでテーブルやコレクションを作成および変更できます。ファジーは、構文をより簡潔にし、テスト可能性を向上させるクラスへの静的インターフェースです。
Lambda 統合は、Lambda Schemaファサードのインデックスとコレクション管理メソッドのサブセットをサポートします。
ファサードの詳細については、Lambel ドキュメントの ファサード を参照してください。
次のセクションでは、Laravel 統合で使用できる Lambda スキーマ ビルダの機能について説明し、その使用方法の例を示します。
ラベル移行の実行
Lambda 移行では、 Schemaファサードに含まれるメソッドを実行して、データベース スキーマをプログラムで作成、変更、削除できます。 次のセクションでは、MongoDB database を使用する場合に移行クラスを認可する方法と、その実行方法について説明します。
移行内からデータベースとコレクションを変更することで、アプリケーションの整合性、バージョン管理、元に戻すことが可能になる制御されたアプローチが提供されます。
移行クラスを作成する
移行クラスは手動で作成することも、 php artisan make:migrationコマンドを使用して生成することもできます。 これらを生成する場合、MongoDB database でスキーマの変更を実行するために次の変更を行う必要があります。
移行で参照されている場合は、
Illuminate\Database\Schema\BlueprintインポートをMongoDB\Laravel\Schema\Blueprintに置き換えLambda 統合でサポートされているコマンドと構文のみを使用
Tip
デフォルトのデータベース接続が MongoDB database 以外に設定されている場合は、次の設定を更新して、移行で正しいデータベースが指定されていることを確認してください。
connections配列項目にconfig/database.phpファイルに有効なmongodbエントリが含まれていることを確認します移行クラスの
$connectionフィールドに"mongodb"を指定する
次のサンプル移行クラスには、次のメソッドが含まれています。
up()は、移行を実行するとコレクションとインデックスを作成します。down()は、移行をロールバックしたときにコレクションとその上のすべてのインデックスを削除します。
declare(strict_types=1); use Illuminate\Database\Migrations\Migration; use Illuminate\Support\Facades\Schema; use MongoDB\Laravel\Schema\Blueprint; return new class extends Migration { protected $connection = 'mongodb'; /** * Run the migrations. */ public function up(): void { Schema::create('astronauts', function (Blueprint $collection) { $collection->index('name'); }); } /** * Reverse the migrations. */ public function down(): void { Schema::drop('astronauts'); } };
移行の実行またはロールバック
クラス ファイルからデータベース移行を実行するには、 プレースホルダーを置き換えた後に次のコマンドを実行します。
php artisan migrate --path=<path to your migration class file>
このコマンドは、クラス ファイル内のup()関数を実行して、 config/database.phpファイルで指定されたデータベースにコレクションとインデックスを作成します。
移行をロールバックするには、 プレースホルダーを置き換えた後に次のコマンドを実行します。
php artisan migrate:rollback --path=<path to your migration class file>
このコマンドは、クラスファイルでdown()関数を実行して、コレクションと関連インデックスを削除します。
Lambel の移行の詳細については、Lambel ドキュメントのデータベース: 移行を参照してください。
スキーマ検証の実装
Lambda 統合 v5.5 以降では、次のスキーマビルダ メソッドを使用する場合、jsonSchema() メソッドを使用してスキーマ検証を実装できます。
Schema::create(): 新しいコレクションを作成する場合Schema::table():コレクションのプロパティを更新する場合
スキーマ検証を使用して、 指定されたコレクション内のドキュメントフィールドのデータ型と値の範囲を制限できます。スキーマ検証を実装すると、サーバーは検証ルールに従さない書込み操作を制限します。
次のパラメータを jsonSchema() に渡すことができます。
schema:コレクションの検証ルールを指定する配列。スキーマの構築の詳細については、サーバー マニュアルの $jsonSchema に関する参照を参照してください。validationLevel: 検証適用のレベルを設定します。指定可能な値は"strict"(デフォルト)と"moderate"です。validationAction: 無効な操作が試行された場合に実行するアクションを指定します。指定可能な値は"error"(デフォルト)と"warn"です。
この例では、コレクションを作成するときに jsonSchema() メソッドでスキーマを指定する方法を示します。スキーマ検証には、次の仕様があります。
pilotsコレクション内のドキュメントにはlicense_numberフィールドが含まれている必要があります。license_numberフィールドには、1000から9999までの整数値が必要です。無効な書込み操作を実行しようとすると、サーバーはエラーを発生させます。
Schema::create('pilots', function (Blueprint $collection) { $collection->jsonSchema( schema: [ 'bsonType' => 'object', 'required' => ['license_number'], 'properties' => [ 'license_number' => [ 'bsonType' => 'int', 'minimum' => 1000, 'maximum' => 9999, ], ], ], validationAction: 'error', ); });
pilotsスキーマ検証ルールに違反するドキュメントを コレクションに挿入しようとすると、 MongoDBは BulkWriteException を返します。
コレクションが存在するかどうかの確認
コレクションが存在するかどうかを確認するには、移行ファイル内のSchemaファケイドでhasCollection()メソッドを呼び出します。 これを使用して、条件付きで移行ロジックを実行できます。
次の移行例では、 starsという名前のコレクションが存在する場合にtelescopesコレクションを作成します。
$hasCollection = Schema::hasCollection('stars'); if ($hasCollection) { Schema::create('telescopes'); }
インデックスの管理
MongoDB インデックスは、クエリ結果の検索に必要なドキュメント数を減らし、クエリの効率を向上させるデータ構造です。 地理空間インデックスなどの特定のインデックスは、データのクエリ方法を拡張します。
インデックスを使用してクエリのパフォーマンスを向上させるには、インデックスがクエリを カバー することを確認してください。 インデックスとクエリの最適化の詳細については、次のサーバー マニュアル エントリを参照してください。
次のセクションでは、スキーマ ビルダを使用してコレクションのさまざまなタイプのインデックスを作成および削除する方法を示します。
インデックスの作成
インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでcreate()メソッドを呼び出します。これに、コレクション名とコールバックメソッドを
MongoDB\Laravel\Schema\Blueprintパラメーターとともに渡します。Blueprintインスタンスでのインデックス作成の詳細を指定します。
次の移行例では、次のコレクション フィールドにインデックスが作成されます。
単一フィールド インデックスのオン
mission_typelaunch_locationとlaunch_dateの複合インデックス、launch_dateで降順の並べ替え順序を指定インデックス名
"unique_mission_id_idx"を指定するmission_idフィールドの一意のインデックス
[ VIEW OUTPUTボタンをクリックすると、 _idフィールドのデフォルト インデックスを含む、移行の実行によって作成されたインデックスが表示されます。
Schema::create('flights', function (Blueprint $collection) { $collection->index('mission_type'); $collection->index(['launch_location' => 1, 'launch_date' => -1]); $collection->unique('mission_id', options: ['name' => 'unique_mission_id_idx']); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { mission_type: 1 }, name: 'mission_type_1' }, { v: 2, key: { launch_location: 1, launch_date: -1 }, name: 'launch_location_1_launch_date_-1' }, { v: 2, key: { mission_id: 1 }, name: 'unique_mission_id_idx', unique: true } ]
インデックス オプションの指定
MongoDB インデックス オプションによって、インデックスの使用方法と保存方法が決まります。 Blueprintインスタンスでindex()などのインデックス作成メソッドを呼び出すときにインデックス オプションを指定できます。
次の移行コードは、インデックス オプションとしてインデックスに照合を追加する方法を示しています。 [ VIEW OUTPUTボタンをクリックすると、 _idフィールドのデフォルト インデックスを含む、移行を実行することによって作成されたインデックスが表示されます。
Schema::create('passengers', function (Blueprint $collection) { $collection->index( 'last_name', name: 'passengers_collation_idx', options: [ 'collation' => [ 'locale' => 'de@collation=phonebook', 'numericOrdering' => true ], ], ); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { last_name: 1 }, name: 'passengers_collation_idx', collation: { locale: 'de@collation=phonebook', caseLevel: false, caseFirst: 'off', strength: 3, numericOrdering: true, alternate: 'non-ignorable', maxVariable: 'punct', normalization: false, backwards: false, version: '57.1' } } ]
インデックス オプションの詳細については、サーバー マニュアルの「すべてのインデックス タイプのオプション 」を参照してください。
スパース、TTL、一意のインデックスの作成
Lambda MongoDB ヘルパー メソッドを使用して、次のタイプのインデックスを作成できます。
スパース インデックス。指定されたフィールドを含むドキュメントのみにインデックスエントリを許可します。
Time-to-Live(TTL)インデックスは一定時間の経過後に期限切れになります
一意なインデックス 。インデックス フィールドに重複する値を含むドキュメントの挿入を防止します
これらのインデックスタイプを作成するには、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでcreate()メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprintパラメータを指定してコレクション名とコールバックメソッドをcreate()に渡します。Blueprintインスタンスのインデックスタイプに適切なヘルパーメソッドを呼び出し、インデックス作成の詳細を渡します。
次の移行コードは、インデックス ヘルパーを使用してスパース インデックスと TTL インデックスを作成する方法を示しています。 [ VIEW OUTPUTボタンをクリックすると、 _idフィールドのデフォルト インデックスを含む、移行を実行することによって作成されたインデックスが表示されます。
Schema::create('planets', function (Blueprint $collection) { $collection->sparse('rings'); $collection->expire('last_visible_dt', 86400); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { rings: 1 }, name: 'rings_1', sparse: true }, { v: 2, key: { last_visible_dt: 1 }, name: 'last_visible_dt_1', expireAfterSeconds: 86400 } ]
スパース インデックス、TTL インデックス、ユニーク インデックスは、インデックス オプションで指定することで、単一フィールドまたは複合インデックスで指定できます。
次の移行コードは、1 つのフィールドに 3 種類のインデックスすべてを作成する方法を示しています。 [ VIEW OUTPUTボタンをクリックすると、 _idフィールドのデフォルト インデックスを含む、移行を実行することによって作成されたインデックスが表示されます。
Schema::create('planet_systems', function (Blueprint $collection) { $collection->index('last_visible_dt', options: ['sparse' => true, 'expireAfterSeconds' => 3600, 'unique' => true]); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { last_visible_dt: 1 }, name: 'last_visible_dt_1', unique: true, sparse: true, expireAfterSeconds: 3600 } ]
これらのインデックスの詳細については、サーバー マニュアルの「インデックス プロパティ」を参照してください。
地理空間インデックスの作成
MongoDB では、 地理空間インデックス を使用して、包含、交差、近接性について地理空間座標データを照会できます。
地理空間インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでcreate()メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprintパラメータを指定してコレクション名とコールバックメソッドをcreate()に渡します。Blueprintインスタンスで地理空間インデックス作成の詳細を指定します。
次の移行例では、 spaceportsコレクションに2dと2dsphereの地理空間インデックスを作成します。 [ VIEW OUTPUT ] ボタンをクリックすると、 _idフィールドのデフォルト インデックスを含む、移行の実行によって作成されたインデックスが表示されます。
Schema::create('spaceports', function (Blueprint $collection) { $collection->geospatial('launchpad_location', '2dsphere'); $collection->geospatial('runway_location', '2d'); });
[ { v: 2, key: { _id: 1 }, name: '_id_' }, { v: 2, key: { launchpad_location: '2dsphere' }, name: 'launchpad_location_2dsphere', '2dsphereIndexVersion': 3 }, { v: 2, key: { runway_location: '2d' }, name: 'runway_location_2d' } ]
地理空間インデックスの詳細については、サーバー マニュアルの「地理空間インデックス 」を参照してください。
インデックスの削除
コレクションからインデックスを削除するには 、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでtable()メソッドを呼び出します。これに、テーブル名とコールバックメソッドを
MongoDB\Laravel\Schema\Blueprintパラメーターとともに渡します。Blueprintインスタンスでインデックス名を指定してdropIndex()メソッドを呼び出します。
注意
コレクションを削除すると、MongoDB はそれに関連付けられているすべてのインデックスを自動的に削除します。
次の移行例では、 flightsコレクションからunique_mission_id_idxというインデックスを削除します。
Schema::table('flights', function (Blueprint $collection) { $collection->dropIndex('unique_mission_id_idx'); });
MongoDB Search とMongoDB ベクトル検索インデックスの管理
MongoDBでは、 MongoDB Search インデックス が全文クエリをサポートしています。 MongoDB ベクトル検索インデックスは、クエリベクトルをドキュメント内のベクトル埋め込みと比較する類似性検索をサポートします。
MongoDB Search およびMongoDB ベクトル検索機能の詳細については、次のガイドを表示します。
MongoDB ベクトル検索ガイド
MongoDB Search
MongoDB Search インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでcreate()メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprintパラメータを指定してコレクション名とコールバックメソッドをcreate()に渡します。MongoDB Searchインデックス作成の詳細を
BlueprintインスタンスのsearchIndex()メソッドに渡します。
この移行例では、galaxiesコレクションに次のMongoDB Search インデックスを作成します。
dynamic_index: 動的マッピングを作成しますauto_index:nameフィールドのオートコンプリート クエリをサポートします
移行 を実行中て作成されたMongoDB Search インデックスを確認するには、 VIEW OUTPUT ボタンをクリックします。
Schema::create('galaxies', function (Blueprint $collection) { $collection->searchIndex([ 'mappings' => [ 'dynamic' => true, ], ], 'dynamic_index'); $collection->searchIndex([ 'mappings' => [ 'fields' => [ 'name' => [ ['type' => 'string', 'analyzer' => 'lucene.english'], ['type' => 'autocomplete', 'analyzer' => 'lucene.english'], ['type' => 'token'], ], ], ], ], 'auto_index'); });
{ "id": "...", "name": "dynamic_index", "type": "search", "status": "READY", "queryable": true, "latestDefinition": { "mappings": { "dynamic": true } }, ... } { "id": "...", "name": "auto_index", "type": "search", "status": "READY", "queryable": true, "latestDefinition": { "mappings": { "fields": { "name": [ { "type": "string", "analyzer": "lucene.english" }, { "type": "autocomplete", "analyzer": "lucene.english" }, { "type": "token" } ] } } }, ... }
MongoDB ベクトル検索
MongoDB ベクトル検索インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでcreate()メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprintパラメータを指定してコレクション名とコールバックメソッドをcreate()に渡します。ベクトルインデックス作成の詳細を
BlueprintインスタンスのvectorSearchIndex()メソッドに渡します。
次の移行例では、galaxiesコレクションに vs_index というMongoDB ベクトル検索インデックスが作成されます。
移行 を実行中て作成されたMongoDB ベクトル検索インデックスを確認するには、 VIEW OUTPUT ボタンをクリックします。
Schema::create('galaxies', function (Blueprint $collection) { $collection->vectorSearchIndex([ 'fields' => [ [ 'type' => 'vector', 'numDimensions' => 4, 'path' => 'embeddings', 'similarity' => 'cosine', ], ], ], 'vs_index'); });
{ "id": "...", "name": "vs_index", "type": "vectorSearch", "status": "READY", "queryable": true, "latestDefinition": { "fields": [ { "type": "vector", "numDimensions": 4, "path": "embeddings", "similarity": "cosine" } ] }, ... }
MongoDB Search またはMongoDB ベクトル検索インデックスの削除
MongoDB Search またはMongoDB ベクトル検索インデックスをコレクションから削除するには 、次のアクションを実行します。
移行ファイル内の
Schemaファケイドでtable()メソッドを呼び出します。これに、コレクション名とコールバックメソッドを
MongoDB\Laravel\Schema\Blueprintパラメーターとともに渡します。BlueprintインスタンスでMongoDB Search またはMongoDB ベクトル検索インデックス名を指定して、dropSearchIndex()メソッドを呼び出します。
次の移行例では、 galaxiesコレクションからauto_indexというインデックスを削除します。
Schema::table('galaxies', function (Blueprint $collection) { $collection->dropSearchIndex('auto_index'); });