빌더와의 운영
이 페이지의 내용
개요
이 가이드에서는 .NET/C# 드라이버가 작업에 사용되는 유형을 생성하기 위해 제공하는 헬퍼 클래스 또는 빌더에 대해 알아볼 수 있습니다. 빌더를 사용하면 컴파일 타임의 오류를 식별하여 런타임 오류를 방지할 수 있습니다. 이 가이드에서는 다음 작업에 사용할 수 있는 빌더 클래스에 대한 정보를 제공합니다.
필터 정의 만들기
프로젝션 만들기
정렬 순서 정의
업데이트 작업 정의
인덱스 키 선택
팁
MongoDB C# 분석기
MongoDB C# Analyzer 는 빌더 정의를 분석 .NET/C# 코드가 MongoDB 쿼리 API 로 변환되는 방식을 이해하는 데 도움이 되는 도구입니다. 자세한 내용 및 설치 지침은 MongoDB C# Analyzer 참조 페이지를 참조하세요.
이 가이드를 통해 빌더를 사용하여 정의를 구성하고 구문을 작성하는 방법을 자세히 알아볼 수 있습니다.
샘플 클래스
이 가이드의 코드 예시는 빌더를 사용하여 plants.flowers
샘플 컬렉션의 문서와 상호 작용하는 유형을 만드는 방법을 보여줍니다. 이 컬렉션의 문서는 다음 Flower
클래스에 의해 모델링됩니다:
public class Flower { public ObjectId Id { get; set; } public string Name { get; set; } public string Category { get; set; } public double Price { get; set; } public List<string> Season { get; set; } public double Stock { get; set; } public string Description { get; set; } }
각 빌더 클래스는 작업 중인 문서 유형을 나타내는 일반적인(generic) 형식 매개 변수 TDocument
를 사용합니다. 이 가이드에서 Flower
클래스는 각 빌더 클래스 예시에 사용되는 문서 유형입니다.
필터 만들기
FilterDefinitionBuilder
클래스는 쿼리 구성을 위해 형식 안정(type-safe) 인터페이스를 제공합니다. 다음 기준과 일치하는 문서에 대한 컬렉션을 쿼리한다고 가정해 보겠습니다.
Price
필드 값이 20 미만인 경우Category
필드 값은 'Perennial'입니다
빌더를 사용하여 형식화된 버전으로 필터 정의를 생성합니다.
var builder = Builders<Flower>.Filter; var filter = builder.Lt(f => f.Price, 20) & builder.Eq(f => f.Category, "Perennial");
형식화된 버전 양식을 사용하면 컴파일 시 안전성을 높일 수 있습니다. 또한 IDE에서 리팩터링 지원을 제공할 수도 있습니다.
또는 문자열 기반 필드 이름을 사용하여 필터를 구성할 수 있습니다.
var builder = Builders<Flower>.Filter; var filter = builder.Lt("Price", 20) & builder.Eq("Category", "Perennial");
배열 연산자
문서에 배열로 직렬화하는 속성이나 필드가 있는 경우 Any
로 시작하는 메서드(예: AnyEq()
또는 AnyLt()
)를 사용하여 전체 배열을 단일 항목과 비교할 수 있습니다.
빌더를 사용하여 'winter'를 포함하는 Season
배열이 있는 컬렉션 내 문서를 확인할 수 있습니다.
var builder = Builders<Flower>.Filter; var filter = builder.AnyEq(f => f.Season, "winter");
프로젝션 만들기
ProjectionDefinitionBuilder
클래스는 프로젝션을 정의하기 위해 형식 안전(type-safe) 인터페이스를 제공합니다. Name
및 Price
필드에 프로젝션을 생성하고 Id
필드는 제외하려는 경우를 가정해 보겠습니다.
빌더를 사용하여 입력된 변형으로 프로젝션 정의를 생성합니다.
var builder = Builders<Flower>.Projection; var projection = builder.Include(f => f.Name).Include(f => f.Price).Exclude(f => f.Id);
문자열 기반 필드 이름을 사용하여 프로젝션을 정의할 수도 있습니다.
var builder = Builders<Flower>.Projection; var projection = builder.Include("Name").Include("Price").Exclude("Id");
마지막으로 Expression()
메서드를 사용하여 프로젝션을 정의할 수 있습니다:
var builder = Builders<Flower>.Projection; var projection = builder.Expression(f => new { Name = f.Name, Price = f.Price });
이 정의는 반환 유형이 ProjectionDefinition<TDocument,
TProjection>
인 반면 다른 정의는 ProjectionDefinition<TDocument>
유형을 반환합니다.
Lambda 표현식
이 드라이버는 Lambda 표현식을 사용한 프로젝션 렌더링을 지원합니다. Expression()
메서드를 사용하여 Find()
프로젝션을 정의하여 Lambda 표현식을 만드는 경우, 드라이버는 표현식을 검사하여 참고할 필드를 확인하고 해당 필드만 반환하도록 서버 쪽 프로젝션을 자동으로 생성합니다.
Lambda 표현식을 사용하면 문서의 값에 대한 작업을 수행하여 새 필드를 만들 수도 있습니다. 다음 예시는 Lambda 표현식을 통해 Price
및 Stock
필드를 사용하여 새 Profit
필드를 프로젝션하는 방법을 보여줍니다.
var builder = Builders<Flower>.Projection; var projection = builder.Expression(f => new { Profit = f.Price * f.Stock });
참고
ID 필드 제외
Lambda 표현식을 사용하여 프로젝션을 생성하면 Id
필드를 프로젝션 필드로 명시적으로 포함하지 않는 한 출력에서 자동으로 제외됩니다.
정렬 정의
SortDefinitionBuilder
클래스는 구문 구성을 위해 형식 안정(type-safe) 인터페이스를 제공합니다. 다음과 같은 순서로 정렬을 정의하고 싶다고 가정해 보겠습니다:
오름차순
Price
내림차순
Category
빌더를 사용하여 형식화된 버전으로 정렬 정의를 생성합니다.
var builder = Builders<Flower>.Sort; var sort = builder.Ascending(f => f.Price).Descending(f => f.Category);
또는 문자열 기반 필드 이름을 사용하여 정렬을 정의할 수 있습니다.
var builder = Builders<Flower>.Sort; var sort = builder.Ascending("Price").Descending("Category");
업데이트 정의
UpdateDefinitionBuilder
클래스는 업데이트 사양을 위해 형식 안정(type-safe) 인터페이스를 제공합니다. 다음 기준을 사용하여 업데이트 사양을 만들려고 한다고 가정해 보겠습니다.
새 필드 만들기
SunRequirement
Price
필드 값에 0.9를 곱합니다.
빌더를 사용하여 형식화된 버전으로 업데이트 사양을 생성합니다.
var builder = Builders<Flower>.Update; var update = builder.Set(f => f.SunRequirement, "Full sun").Mul(f => f.Price, 0.9);
또는 문자열 기반 필드 이름을 사용하여 업데이트를 정의할 수도 있습니다:
var builder = Builders<Flower>.Update; var update = builder.Set("SunRequirement", "Full sun").Mul("Price", 0.9);
인덱스 키 정의
IndexKeysDefinitionBuilder
클래스는 인덱스 키를 정의하기 위한 형식 안전(type-safe) 인터페이스를 제공합니다. 오름차순 인덱스 키로 Category
를 선택한다고 가정해 보겠습니다.
빌더를 사용하여 입력된 변형으로 인덱스 키를 선택합니다.
var builder = Builders<Flower>.IndexKeys; var keys = builder.Ascending(f => f.Category);
또는 문자열 기반 필드 이름을 사용하여 인덱스 키를 선택할 수 있습니다.
var builder = Builders<BsonDocument>.IndexKeys; var keys = builder.Ascending("Category");
IndexKeysDefinitionBuilder
클래스는 와일드카드 인덱스를 빌드하는 메서드도 제공합니다. All field paths
또는 A
single field path
을(를) 사용하여 와일드카드 인덱스를 생성할 수 있으며, 이 경우 Category
을(를) 사용합니다.
var builder = Builders<Flower>.IndexKeys; var keys = builder.Wildcard();
var builder = Builders<Flower>.IndexKeys; // Using the typed variant var keys = builder.Wildcard(f => f.Category); // Using string-based field names var keys = builder.Wildcard("Category");
와일드카드 인덱스 사용 방법에 대한 자세한 내용은 와일드카드 인덱스를 참조하세요.
집계 파이프라인 구축
PipelineDefinitionBuilder
클래스는 집계 파이프라인을 정의하기 위한 유형 안전 인터페이스를 제공합니다. 집계 파이프라인은 문서를 변환하는 데 사용되는 일련의 단계입니다. 다음 작업을 수행하는 파이프라인을 생성한다고 가정해 보겠습니다.
모든 문서를
Season
필드에서 'spring' 과 일치시킵니다.Category
필드를 기준으로 결과를 정렬합니다.문서를 카테고리별로 그룹화하고 해당 카테고리의 모든 문서에 대해 사용 가능한 평균 가격과 총액을 표시합니다.
PipelineDefinitionBuilder
클래스를 사용하여 파이프라인을 빌드합니다:
var sortBuilder = Builders<Flower>.Sort.Ascending(f => f.Category); var matchFilter = Builders<Flower>.Filter.AnyEq(f => f.Season, "spring"); var pipeline = new EmptyPipelineDefinition<Flower>() .Match(matchFilter) .Sort(sortBuilder) .Group(f => f.Category, g => new { name = g.Key, avgPrice = g.Average(f => f.Price), totalAvailable = g.Sum(f => f.Stock) } );
앞의 예는 다음과 같은 파이프라인을 생성합니다:
[{ "$match" : { "season" : "spring" } }, { "$sort" : { "category" : 1 } }, { "$group" : { "_id" : "$category", "avgPrice" : { "$avg" : "$price" }, "totalAvailable" : { "$sum" : "$stock" } } }]
PipelineDefinitionBuilder
인터페이스에 상응하는 형식 안정(type-safe) 메서드가 없는 경우, 쿼리를 BsonDocument
로 AppendStage() 메서드에 제공하여 파이프라인에 단계를 추가할 수 있습니다.
var pipeline = new EmptyPipelineDefinition<BsonDocument>().AppendStage<BsonDocument, BsonDocument, BsonDocument>("{ $set: { field1: '$field2' } }");
참고
BsonDocument
를 사용하여 파이프라인 단계를 정의할 경우 드라이버는 BsonClassMap
, 직렬화 속성 또는 직렬화 규칙 등을 전혀 고려하지 않습니다. BsonDocument
에 사용된 필드 이름은 서버에 저장된 필드 이름과 일치해야 합니다.
쿼리를 BsonDocument
로 제공하는 방법에 대한 자세한 내용은 FAQ 페이지를 참조하세요.
집계 파이프라인에 대한 자세한 내용은 집계 파이프라인 서버 매뉴얼 페이지를 참조하십시오.
Atlas Search 쿼리 작성
Search
클래스는 $search 파이프라인 단계를 생성하기 위한 형식 안정(type-safe) 인터페이스를 제공합니다.
Search
클래스를 사용하여 검색 쿼리를 구성하는 방법을 알아보려면 Atlas Search를 참조하세요.
추가 정보
다양한 연산을 위한 빌더를 사용하여 실행 가능한 예시를 찾아보려면 사용 예시를 확인해보세요.
API 문서
이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.