Docs Menu
Docs Home
/ / /
C#/.NET
/

빌더와의 운영

이 페이지의 내용

  • 개요
  • 샘플 클래스
  • 필터 만들기
  • 배열 연산자
  • 프로젝션 만들기
  • Lambda 표현식
  • 정렬 정의
  • 업데이트 정의
  • 인덱스 키 정의
  • 집계 파이프라인 구축
  • Atlas Search 쿼리 작성
  • 추가 정보
  • API 문서

이 가이드에서는 .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) 인터페이스를 제공합니다. NamePrice 필드에 프로젝션을 생성하고 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 표현식을 사용한 프로젝션 렌더링을 지원합니다. Expression() 메서드를 사용하여 Find() 프로젝션을 정의하여 Lambda 표현식을 만드는 경우, 드라이버는 표현식을 검사하여 참고할 필드를 확인하고 해당 필드만 반환하도록 서버 쪽 프로젝션을 자동으로 생성합니다.

Lambda 표현식을 사용하면 문서의 값에 대한 작업을 수행하여 새 필드를 만들 수도 있습니다. 다음 예시는 Lambda 표현식을 통해 PriceStock 필드를 사용하여 새 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) 메서드가 없는 경우, 쿼리를 BsonDocumentAppendStage() 메서드에 제공하여 파이프라인에 단계를 추가할 수 있습니다.

var pipeline = new EmptyPipelineDefinition<BsonDocument>().AppendStage<BsonDocument, BsonDocument, BsonDocument>("{ $set: { field1: '$field2' } }");

참고

BsonDocument를 사용하여 파이프라인 단계를 정의할 경우 드라이버는 BsonClassMap, 직렬화 속성 또는 직렬화 규칙 등을 전혀 고려하지 않습니다. BsonDocument에 사용된 필드 이름은 서버에 저장된 필드 이름과 일치해야 합니다.

쿼리를 BsonDocument로 제공하는 방법에 대한 자세한 내용은 FAQ 페이지를 참조하세요.

집계 파이프라인에 대한 자세한 내용은 집계 파이프라인 서버 매뉴얼 페이지를 참조하십시오.

Search 클래스는 $search 파이프라인 단계를 생성하기 위한 형식 안정(type-safe) 인터페이스를 제공합니다.

Search 클래스를 사용하여 검색 쿼리를 구성하는 방법을 알아보려면 Atlas Search를 참조하세요.

다양한 연산을 위한 빌더를 사용하여 실행 가능한 예시를 찾아보려면 사용 예시를 확인해보세요.

이 가이드에서 설명하는 메서드나 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.

돌아가기

데이터 변경 사항 모니터링