Docs Menu

스키마 빌더

Laravel은 테이블을 생성하고 수정할 수 있는 스키마 빌더 클래스 Schema 에 액세스할 수 있는 파사드 를 제공합니다. Facade는 구문을 보다 간결하게 만들고 테스트 가능성을 개선하는 클래스에 대한 정적 인터페이스입니다.

Laravel 통합은 Laravel Schema 파사드에서 인덱스 및 컬렉션 관리 메서드의 하위 집합을 지원합니다.

파사드에 학습 보려면 Laravel 문서에서파사드 를 참조하세요.

다음 섹션에서는 Laravel 통합에서 사용할 수 있는 Laravel 스키마 빌더 기능을 설명하고 사용 방법의 예를 보여줍니다.

참고

Laravel 통합은 인덱스 및 컬렉션 관리를 지원하지만 데이터 유효성 검사 를 위한 MongoDB JSON schema 지원 은 제외합니다. JSON schema 유효성 검사 에 학습 보려면 서버 매뉴얼의 스키마 유효성 검사 검사를 참조하세요.

Laravel 마이그레이션을 사용하면 Schema 파사드에 포함된 메서드를 실행하여 프로그래밍 방식으로 데이터베이스 스키마를 생성, 수정 및 삭제할 수 있습니다. 다음 섹션에서는 MongoDB database 를 사용할 때 마이그레이션 클래스를 작성하는 방법과 이를 실행하는 방법을 설명합니다.

마이그레이션 내에서 데이터베이스 및 컬렉션을 수정하면 애플리케이션의 일관성, 버전 제어 및 가역성을 보장하는 제어된 접근 방식이 제공됩니다.

마이그레이션 클래스를 수동으로 만들거나 php artisan make:migration 명령을 사용하여 생성할 수 있습니다. 스키마를 생성하는 경우 MongoDB database 에서 스키마 변경을 수행하려면 다음과 같이 변경해야 합니다.

  • 마이그레이션 에서 참조된 경우 Illuminate\Database\Schema\Blueprint 가져오기를 MongoDB\Laravel\Schema\Blueprint 로 바꿉니다.

  • Laravel 통합에서 지원하는 명령과 구문만 사용하세요.

기본 데이터베이스 연결이 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() 함수를 실행하여 컬렉션 및 관련 인덱스를 삭제합니다.

Laravel 마이그레이션에 대해 자세히 알아보려면 데이터베이스: 마이그레이션 을 참조하세요. Laravel 문서에서 확인할 수 있습니다.

컬렉션이 있는지 확인하려면 마이그레이션 파일의 Schema 파사드에서 hasCollection() 메서드를 호출합니다. 이를 사용하여 조건부로 마이그레이션 로직을 수행할 수 있습니다.

다음 예제 마이그레이션은 stars 이라는 컬렉션이 있는 경우 telescopes 컬렉션을 생성합니다.

$hasCollection = Schema::hasCollection('stars');
if ($hasCollection) {
Schema::create('telescopes');
}

MongoDB 인덱스는 쿼리 결과를 검색하는 데 필요한 문서 수를 줄여 쿼리 효율성을 개선하는 데이터 구조입니다. 지리 공간적 인덱스와 같은 특정 인덱스는 데이터 쿼리 방법을 확장합니다.

인덱스를 사용하여 쿼리 성능을 향상시키려면 인덱스가 쿼리를 포함하는지 확인하세요. 인덱스 및 쿼리 최적화에 대해 자세히 알아보려면 다음 MongoDB Server 수동 항목을 참조하세요.

다음 섹션에서는 스키마 빌더를 사용하여 컬렉션에서 다양한 유형의 인덱스를 만들고 삭제하는 방법을 보여줍니다.

인덱스를 생성하려면 다음 작업을 수행합니다.

  1. 마이그레이션 파일 의 Schema 파사드에서 create() 메서드를 호출합니다.

  2. 컬렉션 이름과 MongoDB\Laravel\Schema\Blueprint 매개 변수를 사용하여 콜백 메서드를 전달합니다.

  3. Blueprint 인스턴스 에 대한 인덱스 생성 세부 정보를 지정합니다.

다음 예제 마이그레이션에서는 다음 컬렉션 필드에 인덱스를 생성합니다.

  • 단일 필드 인덱스 mission_type

  • launch_locationlaunch_date 에 대한 복합 인덱스 로, launch_date에 내림차순 정렬 순서를 지정합니다.

  • mission_id 필드 의 고유 인덱스 로, 인덱스 이름 "unique_mission_id_idx"을(를) 지정합니다.

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

인덱스 옵션에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 모든 인덱스 유형에 대한 옵션을 참조하세요.

Laravel MongoDB 헬퍼 메서드를 사용하여 다음 유형의 인덱스를 생성할 수 있습니다.

  • 지정된 필드가 포함된 문서에 대해서만 인덱스 항목을 허용하는 희소 인덱스

  • 일정 시간이 지나면 만료되는 TTL(Time-to-Live) 인덱스

  • 고유 인덱스: 인덱싱된 필드에 대해 중복된 값이 포함된 문서의 삽입을 방지합니다.

이러한 인덱스 유형을 만들려면 다음 작업을 수행하세요.

  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 및 고유 인덱스를 지정할 수 있습니다.

다음 마이그레이션 코드는 단일 필드에 세 가지 유형의 인덱스를 모두 생성하는 방법을 보여줍니다. 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 Server 매뉴얼의 인덱스 속성 을 참조하세요.

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 Vector Search 인덱스는 쿼리 벡터를 문서의 벡터 임베딩과 비교하는 유사성 검색을 지원 .

Atlas Search 및 Vector Search 기능에 대해 자세히 학습 다음 가이드를 참조하세요.

Atlas Search 인덱스를 만들려면 다음 작업을 수행하세요.

  1. 마이그레이션 파일 의 Schema 파사드에서 create() 메서드를 호출합니다.

  2. MongoDB\Laravel\Schema\Blueprint 매개 변수를 사용하여 컬렉션 이름과 콜백 메서드를 create() 에 전달합니다.

  3. Blueprint 인스턴스 의 searchIndex() 메서드에 Atlas 인덱스 생성 세부 정보를 전달합니다.

이 예시 마이그레이션 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" }
] }
}
},
...
}

Vector Search 인덱스를 생성하려면 다음 작업을 수행합니다.

  1. 마이그레이션 파일 의 Schema 파사드에서 create() 메서드를 호출합니다.

  2. MongoDB\Laravel\Schema\Blueprint 매개 변수를 사용하여 컬렉션 이름과 콜백 메서드를 create() 에 전달합니다.

  3. 벡터 인덱스 생성 세부 정보를 Blueprint 인스턴스 의 vectorSearchIndex() 메서드에 전달합니다.

다음 예시 마이그레이션 galaxies 컬렉션 에 vs_index(이)라는 Vector Search 인덱스 생성합니다.

마이그레이션 실행 하여 생성된 검색 인덱스를 보려면 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 또는 Vector Search 인덱스 삭제하려면 다음 작업을 수행합니다.

  1. 마이그레이션 파일 의 Schema 파사드에서 table() 메서드를 호출합니다.

  2. 컬렉션 이름과 MongoDB\Laravel\Schema\Blueprint 매개 변수를 사용하여 콜백 메서드를 전달합니다.

  3. Blueprint 인스턴스 에서 검색 인덱스 이름을 사용하여 dropSearchIndex() 메서드를 호출합니다.

다음 마이그레이션 예시에서는 galaxies 컬렉션에서 auto_index 인덱스를 삭제합니다.

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