스키마 빌더
이 페이지의 내용
개요
Laravel은 테이블을 생성하고 수정할 수 있는 스키마 빌더 클래스 Schema
에 액세스할 수 있는 파사드 를 제공합니다. Facade는 구문을 보다 간결하게 만들고 테스트 가능성을 개선하는 클래스에 대한 정적 인터페이스입니다.
Laravel 통합은 Laravel Schema
파사드에서 인덱스 및 컬렉션 관리 메서드의 하위 집합을 지원합니다.
파사드에 학습 보려면 Laravel 문서에서파사드 를 참조하세요.
다음 섹션에서는 Laravel 통합에서 사용할 수 있는 Laravel 스키마 빌더 기능을 설명하고 사용 방법의 예를 보여줍니다.
참고
Laravel 통합은 인덱스 및 컬렉션 관리를 지원하지만 데이터 유효성 검사 를 위한 MongoDB JSON schema 지원 은 제외합니다. JSON schema 유효성 검사 에 학습 보려면 서버 매뉴얼의 스키마 유효성 검사 검사를 참조하세요.
Laravel 마이그레이션 수행
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()
마이그레이션 을 롤백할 때 컬렉션 과 컬렉션에 포함된 모든 인덱스를 삭제합니다.
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 수동 항목을 참조하세요.
다음 섹션에서는 스키마 빌더를 사용하여 컬렉션에서 다양한 유형의 인덱스를 만들고 삭제하는 방법을 보여줍니다.
인덱스 만들기
인덱스를 생성하려면 다음 작업을 수행합니다.
마이그레이션 파일 의
Schema
파사드에서create()
메서드를 호출합니다.컬렉션 이름과
MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 콜백 메서드를 전달합니다.Blueprint
인스턴스 에 대한 인덱스 생성 세부 정보를 지정합니다.
다음 예제 마이그레이션에서는 다음 컬렉션 필드에 인덱스를 생성합니다.
단일 필드 인덱스
mission_type
launch_location
및launch_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 매뉴얼의 모든 인덱스 유형에 대한 옵션을 참조하세요.
희소 인덱스, TTL 및 고유 인덱스 만들기
Laravel MongoDB 헬퍼 메서드를 사용하여 다음 유형의 인덱스를 생성할 수 있습니다.
지정된 필드가 포함된 문서에 대해서만 인덱스 항목을 허용하는 희소 인덱스
일정 시간이 지나면 만료되는 TTL(Time-to-Live) 인덱스
고유 인덱스: 인덱싱된 필드에 대해 중복된 값이 포함된 문서의 삽입을 방지합니다.
이러한 인덱스 유형을 만들려면 다음 작업을 수행하세요.
마이그레이션 파일 의
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 및 고유 인덱스를 지정할 수 있습니다.
다음 마이그레이션 코드는 단일 필드에 세 가지 유형의 인덱스를 모두 생성하는 방법을 보여줍니다. 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에서 지리 공간적 인덱스를 사용하면 지리 공간 좌표 데이터를 쿼리하여 포함, 교차 및 근접성에 대해 확인할 수 있습니다.
지리 공간적 인덱스를 생성하려면 다음 작업을 수행합니다.
마이그레이션 파일 의
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 및 Vector Search 인덱스 관리
MongoDB 에서Atlas Search 인덱스는 전체 텍스트 쿼리를 지원 . Atlas Vector Search 인덱스는 쿼리 벡터를 문서의 벡터 임베딩과 비교하는 유사성 검색을 지원 .
Atlas Search 및 Vector Search 기능에 대해 자세히 학습 다음 가이드를 참조하세요.
Atlas Search guide
Atlas Search
Atlas Search 인덱스를 만들려면 다음 작업을 수행하세요.
마이그레이션 파일 의
Schema
파사드에서create()
메서드를 호출합니다.MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 컬렉션 이름과 콜백 메서드를create()
에 전달합니다.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
Vector Search 인덱스를 생성하려면 다음 작업을 수행합니다.
마이그레이션 파일 의
Schema
파사드에서create()
메서드를 호출합니다.MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 컬렉션 이름과 콜백 메서드를create()
에 전달합니다.벡터 인덱스 생성 세부 정보를
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 인덱스 삭제하려면 다음 작업을 수행합니다.
마이그레이션 파일 의
Schema
파사드에서table()
메서드를 호출합니다.컬렉션 이름과
MongoDB\Laravel\Schema\Blueprint
매개 변수를 사용하여 콜백 메서드를 전달합니다.Blueprint
인스턴스 에서 검색 인덱스 이름을 사용하여dropSearchIndex()
메서드를 호출합니다.
다음 마이그레이션 예시에서는 galaxies
컬렉션에서 auto_index
인덱스를 삭제합니다.
Schema::table('galaxies', function (Blueprint $collection) { $collection->dropSearchIndex('auto_index'); });