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_type
launch_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'); });
Atlas Search とベクトル検索インデックスの管理
MongoDBでは、Atlas Search インデックスが全文クエリをサポートしています。Atlas ベクトル検索インデックスは、クエリ ベクトルとドキュメント内のベクトル埋め込みを比較する類似性検索をサポートします。
Atlas Search および Atlas ベクトル検索機能の詳細については、次のガイドを表示します。
Atlas Search guide
Atlas Search
Atlas Search インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schema
ファケイドでcreate()
メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprint
パラメータを指定してコレクション名とコールバックメソッドをcreate()
に渡します。Atlasインデックス作成の詳細を
Blueprint
インスタンスのsearchIndex()
メソッドに渡します。
この移行例では、galaxies
コレクションに次の Atlas Search インデックスを作成します。
dynamic_index
: 動的マッピングを作成しますauto_index
:name
フィールドのオートコンプリート クエリをサポートします
移行を実行中て作成された検索インデックスを確認するには、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" } ] } } }, ... }
ベクトル検索
Atlas ベクトル検索インデックスを作成するには、次のアクションを実行します。
移行ファイル内の
Schema
ファケイドでcreate()
メソッドを呼び出します。MongoDB\Laravel\Schema\Blueprint
パラメータを指定してコレクション名とコールバックメソッドをcreate()
に渡します。ベクトルインデックス作成の詳細を
Blueprint
インスタンスのvectorSearchIndex()
メソッドに渡します。
次の移行例では、galaxies
コレクションに vs_index
という Atlas ベクトル検索インデックスが作成されます。
移行を実行中て作成された検索インデックスを確認するには、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" } ] }, ... }
検索インデックスを削除する
Atlas Search または Atlas ベクトル検索インデックスをコレクションから削除するには、次のアクションを実行します。
移行ファイル内の
Schema
ファケイドでtable()
メソッドを呼び出します。これに、コレクション名とコールバックメソッドを
MongoDB\Laravel\Schema\Blueprint
パラメーターとともに渡します。Blueprint
インスタンスで検索インデックス名を指定してdropSearchIndex()
メソッドを呼び出します。
次の移行例では、 galaxies
コレクションからauto_index
というインデックスを削除します。
Schema::table('galaxies', function (Blueprint $collection) { $collection->dropSearchIndex('auto_index'); });