Docs Menu
Docs Home
/ / /
Lambda MongoDB
/

スキーマビルダ

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()は、移行をロールバックしたときにコレクションとその上のすべてのインデックスを削除します。

<?php
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 インデックスは、クエリ結果の検索に必要なドキュメント数を減らし、クエリの効率を向上させるデータ構造です。 地理空間インデックスなどの特定のインデックスは、データのクエリ方法を拡張します。

インデックスを使用してクエリのパフォーマンスを向上させるには、インデックスがクエリを カバー することを確認してください。 インデックスとクエリの最適化の詳細については、次のサーバー マニュアル エントリを参照してください。

次のセクションでは、スキーマ ビルダを使用してコレクションのさまざまなタイプのインデックスを作成および削除する方法を示します。

インデックスを作成するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで create() メソッドを呼び出します。

  2. これに、コレクション名とコールバックメソッドを MongoDB\Laravel\Schema\Blueprint パラメーターとともに渡します。

  3. Blueprintインスタンスでのインデックス作成の詳細を指定します。

次の移行例では、次のコレクション フィールドにインデックスが作成されます。

  • 単一フィールド インデックスのオン mission_type

  • launch_locationlaunch_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'
}
}
]

インデックス オプションの詳細については、サーバー マニュアルの「すべてのインデックス タイプのオプション 」を参照してください。

Lambda MongoDB ヘルパー メソッドを使用して、次のタイプのインデックスを作成できます。

  • スパース インデックス。指定されたフィールドを含むドキュメントのみにインデックスエントリを許可します。

  • Time-to-Live(TTL)インデックスは一定時間の経過後に期限切れになります

  • 一意なインデックス 。インデックス フィールドに重複する値を含むドキュメントの挿入を防止します

これらのインデックスタイプを作成するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで create() メソッドを呼び出します。

  2. MongoDB\Laravel\Schema\Blueprint パラメータを指定してコレクション名とコールバックメソッドを create() に渡します。

  3. 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 では、 地理空間インデックス を使用して、包含、交差、近接性について地理空間座標データを照会できます。

地理空間インデックスを作成するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで create() メソッドを呼び出します。

  2. MongoDB\Laravel\Schema\Blueprint パラメータを指定してコレクション名とコールバックメソッドを create() に渡します。

  3. Blueprintインスタンスで地理空間インデックス作成の詳細を指定します。

次の移行例では、 spaceportsコレクションに2d2dsphereの地理空間インデックスを作成します。 [ 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' }
]

地理空間インデックスの詳細については、サーバー マニュアルの「地理空間インデックス 」を参照してください。

コレクションからインデックスを削除するには 、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで table() メソッドを呼び出します。

  2. これに、テーブル名とコールバックメソッドを MongoDB\Laravel\Schema\Blueprint パラメーターとともに渡します。

  3. Blueprintインスタンスでインデックス名を指定して dropIndex() メソッドを呼び出します。

注意

コレクションを削除すると、MongoDB はそれに関連付けられているすべてのインデックスを自動的に削除します。

次の移行例では、 flightsコレクションからunique_mission_id_idxというインデックスを削除します。

Schema::table('flights', function (Blueprint $collection) {
$collection->dropIndex('unique_mission_id_idx');
});

MongoDBでは、Atlas Search インデックスが全文クエリをサポートしています。Atlas ベクトル検索インデックスは、クエリ ベクトルとドキュメント内のベクトル埋め込みを比較する類似性検索をサポートします。

Atlas Search および Atlas ベクトル検索機能の詳細については、次のガイドを表示します。

  • Atlas Search guide

  • Atlas Vector Search ガイド

Atlas Search インデックスを作成するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで create() メソッドを呼び出します。

  2. MongoDB\Laravel\Schema\Blueprint パラメータを指定してコレクション名とコールバックメソッドを create() に渡します。

  3. 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 ベクトル検索インデックスを作成するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで create() メソッドを呼び出します。

  2. MongoDB\Laravel\Schema\Blueprint パラメータを指定してコレクション名とコールバックメソッドを create() に渡します。

  3. ベクトルインデックス作成の詳細を 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 ベクトル検索インデックスをコレクションから削除するには、次のアクションを実行します。

  1. 移行ファイル内の Schema ファケイドで table() メソッドを呼び出します。

  2. これに、コレクション名とコールバックメソッドを MongoDB\Laravel\Schema\Blueprint パラメーターとともに渡します。

  3. Blueprintインスタンスで検索インデックス名を指定して dropSearchIndex() メソッドを呼び出します。

次の移行例では、 galaxiesコレクションからauto_indexというインデックスを削除します。

Schema::table('galaxies', function (Blueprint $collection) {
$collection->dropSearchIndex('auto_index');
});

戻る

関係