AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

LINQ로 엔터티 데이터 찾기 및 쿼리

Entity Framework Core를 사용하면 데이터베이스 명령을 명시적으로 실행 하지 않고도 애플리케이션 에서 데이터로 작업할 수 있습니다. 데이터를 쿼리 하려면 LINQ(Language-Integrated Query) 구문을 사용합니다. LINQ를 사용하면 C# 관련 키워드 및 연산자를 사용하여 강력한 형식의 쿼리를 쓰기 (write) 수 있습니다. 애플리케이션 을 실행 하면 EF Core Provider가 자동으로 LINQ 쿼리를 변환하고 MongoDB 쿼리 API 를 사용하여 데이터베이스 에서 실행합니다.

이 가이드 에서는 EF Core Provider를 사용하도록 구성된 애플리케이션 에서 일반적인 쿼리 작업의 예를 확인할 수 있습니다.

EF 코어 제공자를 사용하도록 애플리케이션 을 구성하는 방법을 학습 보려면 EF 코어 제공자 구성을 참조하세요.

이 가이드 의 예제에서는 sample_guides 데이터베이스 의 planets 컬렉션 사용합니다. 이 컬렉션 의 문서는 다음 Planet 클래스를 모델로 사용합니다.

public class Planet
{
public ObjectId _id { get; set; }
public string name { get; set; } = null!;
public int orderFromSun { get; set; }
public bool hasRings { get; set; }
}

이 컬렉션은 Atlas에서 제공하는 샘플 데이터 세트 에서 가져온 것입니다. 빠른 시작 가이드 참조하여 무료 MongoDB 클러스터 생성하고 이 샘플 데이터를 로드하는 방법을 학습 .

FirstOrDefault() 메서드를 사용하여 단일 엔터티를 찾거나 Where() 메서드를 사용하여 여러 엔터티를 찾습니다.

FirstOrDefault() 메서드는 collection에서 검색 기준과 일치하는 첫 번째 엔터티를 반환하고, 일치하는 엔터티가 없으면 null 를 반환합니다.

다음 코드는 FirstOrDefault() 메서드를 사용하여 Planets DBSet 에서 name 필드가 'mercury'인 행성을 찾아 콘솔에 행성 이름을 출력합니다.

var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury");
Console.WriteLine(planet?.name);

Where() 메서드를 사용하여 collection에서 여러 엔터티를 검색할 수 있습니다. Where() 은 검색 기준과 일치하는 모든 엔터티를 반환합니다.

다음 코드는 Where() 메서드를 사용하여 hasRings 필드가 true 로 설정된 모든 행성을 찾고 행성 이름을 콘솔에 출력합니다.

var planets = db.Planets.Where(p => p.hasRings);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

A 섀도 속성 은 .NET 엔터티 클래스에 정의되지 않았지만 Entity Framework 모델에 포함되며 데이터베이스 의 필드에 매핑되는 속성 입니다. 섀도 속성을 사용하면 문서의 데이터를 엔터티에 속성 으로 노출하지 않고도 쿼리 하거나 추적 수 있습니다.

LINQ 쿼리 에서 섀도 속성 참조하려면 EF.Property<T>() 메서드를 호출하고 구성된 속성 이름을 인수로 전달합니다. 일반 유형 인수는 섀도 속성 의 데이터 유형 과 일치해야 합니다.

예시 를 들어 Planet 클래스는 mainAtmosphere 필드 에 대한 속성 을 정의하지 않습니다. 이 필드 섀도 속성 으로 구성하려면 다음 예시 와 같이 PlanetDbContextOnModelCreating() 메서드에서 Property<T>() 메서드를 호출합니다.

public class PlanetDbContext : DbContext
{
public DbSet<Planet> Planets { get; init; } = null!;
public static PlanetDbContext Create(IMongoDatabase database) =>
new(new DbContextOptionsBuilder<PlanetDbContext>()
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
.Options);
public PlanetDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Planet>().ToCollection("planets");
modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere");
}
}

modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere") 호출은 프레임워크 에 모델에 mainAtmosphere 을 포함하고 이를 MongoDB 의 string[] 필드 에 매핑하도록 지시합니다.

다음 코드는 EF.Property<string[]>() 메서드를 사용하여 비어 있지 않은 mainAtmosphere 그림자 속성 있는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planets = db.Planets.Where(
p => EF.Property<string[]>(p, "mainAtmosphere").Length > 0);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

필드 존재하는지, 누락되었는지 또는 null 값이 있는지 여부에 따라 Mql 클래스의 메서드를 사용하여 문서를 쿼리 할 수 있습니다.

참고

이러한 메서드는 실제 속성과 그림자 속성 모두에서 작동합니다.

Mql.Exists() 메서드는 필드 값이 null인 문서를 포함하여 지정된 필드 포함하는 문서와 일치합니다.

다음 코드는 Mql.Exists() 메서드를 사용하여 hasRings 필드 있는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planetNames = db.Planets
.Where(p => Mql.Exists(p.hasRings))
.Select(p => p.name);
foreach (var name in planetNames)
{
Console.WriteLine(name);
}

Mql.IsMissing() 메서드는 지정된 필드 포함하지 않는 문서와 일치합니다.

다음 코드는 Mql.IsMissing() 메서드를 사용하여 hasRings 필드 없는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planetNames = db.Planets
.Where(p => Mql.IsMissing(p.hasRings))
.Select(p => p.name);
foreach (var name in planetNames)
{
Console.WriteLine(name);
}

Mql.IsNullOrMissing() 메서드는 지정된 필드 누락되었거나 null 값이 있는 문서와 일치합니다.

다음 코드는 Mql.IsNullOrMissing() 메서드를 사용하여 hasRings 필드 누락되었거나 null 가 있는 모든 행성을 찾아 콘솔에 행성 이름을 출력합니다.

var planetNames = db.Planets
.Where(p => Mql.IsNullOrMissing(p.hasRings))
.Select(p => p.name);
foreach (var name in planetNames)
{
Console.WriteLine(name);
}

OrderBy() 메서드를 사용하여 쿼리에서 엔터티를 반환할 순서를 지정합니다. OrderBy() 지정된 정렬 기준에 따라 요소를 오름차순으로 정렬합니다.

다음 코드는 OrderBy() 메서드를 사용하여 모든 행성을 찾아 orderFromSun 필드 값을 기준으로 오름차순으로 정렬합니다. 그런 다음 결과를 콘솔에 인쇄합니다.

var planetList = db.Planets.OrderBy(p => p.orderFromSun);
foreach (var p in planetList)
{
Console.WriteLine(p.name);
}
{"_id":"...","name":"Mercury","orderFromSun":1,"hasRings":false}
{"_id":"...","name":"Venus","orderFromSun":2,"hasRings":false}
{"_id":"...","name":"Earth","orderFromSun":3,"hasRings":false}
{"_id":"...","name":"Mars","orderFromSun":4,"hasRings":false}
{"_id":"...","name":"Jupiter","orderFromSun":5,"hasRings":true}
{"_id":"...","name":"Saturn","orderFromSun":6,"hasRings":true}
{"_id":"...","name":"Uranus","orderFromSun":7,"hasRings":true}
{"_id":"...","name":"Neptune","orderFromSun":8,"hasRings":true}

내림차순 정렬

OrderByDescending() 메서드를 사용하여 쿼리 결과를 내림차순으로 정렬할 수 있습니다.

ThenBy() 메서드를 사용하여 쿼리를 2차 정렬할 수 있습니다. ThenBy() 메서드는 지정된 정렬 기준에 따라 OrderBy() 메서드의 결과를 오름차순으로 정렬합니다. ThenBy() 메서드는 OrderBy() 메서드에 연결되어야 합니다.

내림차순으로 2차 정렬

ThenByDescending() 메서드를 사용하여 내림차순으로 2차 정렬을 수행할 수 있습니다.

다음 코드에서는 OrderBy()ThenBy() 메서드를 사용하여 모든 행성을 찾아 hasRings() 필드를 기준으로 정렬하고, name 필드에서 2차 정렬을 수행합니다.

var planetList = db.Planets.OrderBy(o => o.hasRings).ThenBy(o => o.name);
foreach (var p in planetList)
{
Console.WriteLine("Has rings: " + p.hasRings + ", Name: " + p.name);
}
{"_id":"...","name":"Earth","orderFromSun":3,"hasRings":false}
{"_id":"...","name":"Mars","orderFromSun":4,"hasRings":false}
{"_id":"...","name":"Mercury","orderFromSun":1,"hasRings":false}
{"_id":"...","name":"Venus","orderFromSun":2,"hasRings":false}
{"_id":"...","name":"Jupiter","orderFromSun":5,"hasRings":true}
{"_id":"...","name":"Neptune","orderFromSun":8,"hasRings":true}
{"_id":"...","name":"Saturn","orderFromSun":6,"hasRings":true}
{"_id":"...","name":"Uranus","orderFromSun":7,"hasRings":true}

부울 값이 있는 필드를 정렬할 때 필드 값이 false 인 엔터티가 값이 true 인 엔터티보다 먼저 표시됩니다.

Take() 메서드를 사용하여 쿼리에서 반환할 최대 개체 수를 지정합니다.

다음 코드는 Take() 메서드를 사용하여 Planets 컬렉션에서 첫 번째 3 행성을 반환합니다.

var planetList = db.Planets.Take(3);
foreach (var p in planetList)
{
Console.WriteLine(p.name);
}

쿼리 에서 결과를 반환하기 전에 건너뛸 엔터티 수를 지정하려면 Skip() 메서드를 사용합니다.

다음 코드는 OrderBy()Skip() 메서드를 사용하여 첫 번째 5 행성(정렬 기준: orderFromSun)을 건너뛰고 나머지 행성을 반환합니다.

var planetList = db.Planets.OrderBy(p => p.orderFromSun).Skip(5);
foreach (var p in planetList)
{
Console.WriteLine(p.name);
}

EF Core Provider는 다음과 같은 스칼라 집계 메서드를 지원합니다.

  • Count(): 컬렉션 의 요소 수 또는 조건자와 일치하는 문서 수를 반환합니다.

  • LongCount(): 컬렉션 의 요소 수를 long 로 반환하거나 술어와 일치하는 문서 수를 반환합니다.

  • Any(): 컬렉션 의 요소가 조건자와 일치하는 경우 true 를 반환합니다.

  • Max(): 컬렉션 에 있는 지정된 필드 의 최대값을 반환합니다.

  • Min(): 컬렉션 에 있는 지정된 필드 의 최소값을 반환합니다.

  • Sum(): 컬렉션 에서 지정된 필드 값의 합계를 반환합니다.

  • Average(): 컬렉션 에 있는 지정된 필드 값의 평균을 반환합니다.

다음 섹션에서는 앞의 각 메서드의 예를 보여줍니다.

다음 예시 에서는 Count() 메서드를 사용하여 Planets 컬렉션 의 요소 수를 계산합니다.

var planetCount = db.Planets.Count();
Console.WriteLine("Planet Count: " + planetCount);

다음 예시 에서는 Count() 메서드를 사용하여 Planets 컬렉션 에서 hasRings 필드 가 true로 설정하다 요소의 수를 계산합니다.

var planetCountWithRings = db.Planets.Count(p => p.hasRings);
Console.WriteLine("Planet Count with Rings: " + planetCountWithRings);

다음 예시 에서는 LongCount() 메서드를 사용하여 Planets 컬렉션 의 요소 수를 계산하고 결과를 long로 반환합니다.

var planetCountLong = db.Planets.LongCount();
Console.WriteLine("Long Planet Count: " + planetCountLong);

다음 예시 에서는 LongCount() 메서드를 사용하여 Planets 컬렉션 에서 true 로 설정하다 hasRings 필드 있는 요소의 수를 계산하고 결과를 long로 반환합니다.

var planetCountLongWithRings = db.Planets.LongCount(p => p.hasRings);
Console.WriteLine("Long Planet Count with Rings: " + planetCountLongWithRings);

다음 예시 에서는 Any() 메서드를 사용하여 Planets 컬렉션 의 요소에 hasRings 필드 true로 설정하다 있는지 확인합니다.

var results = db.Planets.Any(p => p.hasRings);
Console.WriteLine("Planet with Rings: " + results);

다음 예시 에서는 Max() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 최대값을 찾습니다.

var furthestPlanet = db.Planets.Max(p => p.orderFromSun);
Console.WriteLine("Furthest Planet: " + furthestPlanet);

다음 예시 에서는 Min() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 최소값을 찾습니다.

var closestPlanet = db.Planets.Min(p => p.orderFromSun);
Console.WriteLine("Closest Planet: " + closestPlanet);

다음 예시 에서는 Sum() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 합계를 찾습니다.

var totalOrderFromSun = db.Planets.Sum(p => p.orderFromSun);
Console.WriteLine("Total Order From Sun: " + totalOrderFromSun);

다음 예시 에서는 Average() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 평균값을 찾습니다.

var averageOrderFromSun = db.Planets.Average(p => p.orderFromSun);
Console.WriteLine("Average Order From Sun: " + averageOrderFromSun);

LINQ 쿼리를 작성한 후 생성된 쿼리를 검사하여 제공자가 MongoDB Server에 예상된 형상을 보내는지 확인합니다. 개발 중 쿼리를 검사하려면 LogTo() 메서드를 사용하여 DbContext 에 EF Core 로그를 활성화합니다.

다음 예시는 DbContext 객체를 만들 때 콘솔에 로그인을 사용하는 방법을 보여줍니다.

var mongoClient = new MongoClient("<connection string URI>");
var dbContextOptions =
new DbContextOptionsBuilder<MyDbContext>()
.UseMongoDB(mongoClient, "sample_guides")
.LogTo(Console.WriteLine)
.Options;
var db = new MyDbContext(dbContextOptions);

제공자는 중요 데이터 로그인이 활성화되어 있는 경우에만 전체 MQL 쿼리 텍스트를 로그합니다. 중요 데이터 로그인을 활성화하지 않으면 쿼리 로그에서 값이 생략될 수 있습니다. 중요 데이터 로그인을 활성화하려면 다음 예에서 보여준 것과 같이 DbContextOptionsBuilder 객체에서 EnableSensitiveDataLogging() 메서드를 호출합니다.

var mongoClient = new MongoClient("<connection string URI>");
var dbContextOptions =
new DbContextOptionsBuilder<MyDbContext>()
.UseMongoDB(mongoClient, "sample_guides")
.LogTo(Console.WriteLine)
.EnableSensitiveDataLogging()
.Options;
var db = new MyDbContext(dbContextOptions);

중요

주요 사용에서 피하세요.

개발 환경에서만 민감한 데이터 로그인을 활성화합니다.

카멜 케이스 필드 이름 지정과 같이 MongoClient에 사용자 지정 BSON 직렬화 관례를 등록하면 이러한 관례는 MongoDB에 저장된 필드 이름을 변경하여 엔티티 모델의 속성 이름과 다르게 할 수 있습니다. EF Core 제공자는 엔티티 속성 이름을 사용하여 MQL을 생성하므로 불일치가 발생하면 쿼리가 잘못된 필드를 대상하고 해당 필드의 인덱스를 우회할 수 있습니다. 저장된 필드 이름과 엔티티 속성 이름이 다른 경우 다음 예시에 표시된 것처럼 HasElementName()를 사용하여 OnModelCreating() 에서 속성을 저장된 필드 이름에 명시적으로 매핑할 수 있습니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Planet>()
.Property(p => p.name)
.HasElementName("name");
}

NET/C# 드라이버 모니터링 API

MongoDB 명령에 대한 하위 수준 가시성이 필요한 경우 MongoClient 객체에 .NET/C# 드라이버 모니터링 API를 사용할 수 있습니다. 이 API에 대한 자세한 내용은 .NET/C# 드라이버 문서의 모니터링 을 참조하십시오.

MongoDB 의 애그리게이션에 대해 자세히 학습 MongoDB Server 매뉴얼의 습 가이드 참조하세요.

이 가이드에 설명된 EF Core 메서드에 대해 자세히 알아보려면 다음 .NET API 문서 링크를 참조하세요.

이 페이지에서 사용되는 .NET/C# 드라이버 메서드에 대한 자세한 내용은 다음 API 설명서 링크를 참조하세요.

HasElementName() 메서드에 대해 자세히 알아보려면 다음 EF Core 제공자 API 설명서 링크를 참조하세요.