개요
이 가이드에서는 Search 빌더를 사용하여 MongoDB .NET/C# 드라이버로 $search 집계 파이프라인 단계를 빌드하는 방법에 대해 설명합니다.
$search 파이프라인 단계에 대해 자세히 알아보려면 $search를 참조하세요.
참고
Atlas 및 Community Edition 버전 요구 사항
$search 집계 파이프라인 연산자는 MongoDB v4.2 이상을 실행하는 MongoDB Atlas 클러스터 또는 MongoDB v8.2 이상을 실행하는 MongoDB Community Edition 클러스터에서 호스팅되는 컬렉션에만 사용할 수 있습니다. 컬렉션은 MongoDB 검색 인덱스에 포함되어야 합니다. 이 연산자 의 필수 설정 및 기능에 대해 자세히 학습하려면 MongoDB 검색 설명서를 참조하세요.
샘플 데이터
이 가이드 의 예제에서는 sample_mflix 데이터베이스 의 movies 컬렉션 사용합니다. 이 컬렉션 의 문서에는 제목, 줄거리, 장르, 평점 등 영화에 대한 정보가 포함되어 있습니다. 다음 Movie 클래스는 이 컬렉션 의 문서를 모델링합니다.
[] public class Movie { [] public ObjectId Id { get; set; } public string Title { get; set; } = null!; public string Plot { get; set; } = null!; public string[] Genres { get; set; } = null!; public int Year { get; set; } public string Rated { get; set; } = null!; public Imdb Imdb { get; set; } = null!; [] public float[] PlotEmbedding { get; set; } = null!; public double Score { get; set; } [] public string PaginationToken { get; set; } = null!; }
Movie 클래스는 각 문서 의 중첩된 imdb 필드 모델링하는 다음 Imdb 클래스를 참조합니다.
[] public class Imdb { public double Rating { get; set; } public int Votes { get; set; } public int Id { get; set; } }
참고
샘플 데이터의 카멜 표기법 필드 이름
movies 컬렉션의 문서는 카멜 케이스 명명 규칙을 사용합니다. 이 가이드의 예시에서는 ConventionPack 사용하여 컬렉션의 필드를 파스칼식 대/소문자로 역직렬화하고 Movie 클래스의 속성에 매핑합니다.
사용자 지정 직렬화에 대해 자세히 알아보려면 사용자 지정 직렬화를 참조하세요.
이 가이드 의 일부 예제에서는 관련 섹션에서 소개하는 추가 컬렉션과 모델 클래스를 사용합니다. 모든 컬렉션은 Atlas 에서 제공하는 샘플 데이터 세트 에서 가져온 것입니다. 무료 MongoDB 클러스터를 생성하고 이 샘플 데이터를 로드하는 방법을 학습하려면 .NET/C# 드라이버 시작하기 를 참조하세요.
참고
샘플 데이터의 일관되지 않은 필드 유형
movies 컬렉션 의 일부 문서는 imdb.rating 및 imdb.votes 필드를 숫자 대신 문자열로 저장 . 모델 클래스에서 이러한 필드를 double 또는 int 로 정의하면 드라이버 해당 문서를 역직렬화할 때 FormatException 가 발생합니다.
필드 유형이 혼합된 문서를 처리하다 하려면 여러 BSON 유형을 허용하는 사용자 지정 직렬 변환기를 구현 하고 영향을 받는 속성에 [BsonSerializer] 속성을 사용 적용 .
[] public class Imdb { [] public double Rating { get; set; } [] public int Votes { get; set; } public int Id { get; set; } }
FlexibleDoubleSerializer과 같은 사용자 지정 직렬 변환기를 구현 방법을 학습 보려면 사용자 지정 직렬 변환기를 참조하세요.
MongoDB Search 인덱스 생성
Atlas 컬렉션 에서 검색 수행하려면 먼저 컬렉션 에 MongoDB Search 인덱스 만들어야 합니다. MongoDB 검색 인덱스는 데이터를 검색 가능한 형식으로 분류하는 데이터 구조입니다.
MongoDB Search 인덱스를 만드는 방법을 학습하려면 MongoDB Search 인덱스 만들기 가이드를 참조하세요.
MongoDB 검색하다 연산자 및 수집기
Search 클래스에는 $search 작업을 수행하는 데 사용할 수 있는 메서드가 포함되어 있습니다. 사용 가능한 $search 연산자 및 수집기의 전체 목록은 연산자 및 수집기 Atlas 가이드 참조하세요.
자동 완성 기능
불완전한 입력 문자열에서 일련의 문자가 포함된 단어나 구문을 검색하려면 Autocomplete() 메서드를 사용합니다.
다음 예시 string "Gravity"로 시작하는 텍스트에 대해 title 필드 에서 자동 완성 쿼리 수행합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Autocomplete(m => m.Title, "Gravity"), indexName: "movietitles") .ToList();
... { "_id" : ObjectId("..."), "title" : "Gravity", "plot" : "...", "genres" : ["Drama", "Sci-Fi", "Thriller"], "year" : 2013, "rated" : "PG-13", "imdb" : { "rating" : 7.7, "votes" : "...", "id" : "..." } } ...
autocomplete 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 autocomplete를 참조하세요.
참고
자동 완성 쿼리를 위한 인덱싱
자동 완성 쿼리를 성공적으로 수행하려면 자동 완성을 지원하는 MongoDB 검색 인덱스를 만들어야 합니다. 자세히 학습 Atlas 설명서에서 자동 완성을 위한 필드 인덱싱 방법을 참조하세요.
MongoDB Search 인덱스 생성한 후에는 앞의 예시 와 같이 인덱스 이름을 Autocomplete() 메서드에 전달해야 합니다.
복합
두 개 이상의 연산자를 하나의 검색으로 결합하려면 Compound() 메서드를 사용합니다.
다음 예에서는 movies 컬렉션에서 다음 기준과 모두 일치하는 문서를 검색합니다.
문서에
imdb.rating필드가 있음rated필드 값이"G"이(가) 아닙니다.year필드 2000보다 큰 값이 있습니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Compound() .Must(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .MustNot(Builders<Movie>.Search.Equals(m => m.Rated, "G")) .Must(Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gt(2000)))) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Dark Knight", "plot" : "...", "genres" : ["Action", "Crime", "Drama"], "year" : 2008, "rated" : "PG-13", "imdb" : { "rating" : 9.0, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Inception", "plot" : "...", "genres" : ["Action", "Adventure", "Sci-Fi"], "year" : 2010, "rated" : "PG-13", "imdb" : { "rating" : 8.8, "votes" : "...", "id" : "..." } } ...
compound 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 compound를 참조하세요.
embeddedDocument
EmbeddedDocument() 방법을 사용하여 필드의 배열 값 내에 있는 문서에 대한 검색 작업을 수행합니다.
참고
내장된 문서 인덱스 필요
내장된 문서에서 Atlas Search를 사용하려면 배열 필드에 embeddedDocument 인덱스를 생성해야 합니다.
embeddedDocument 인덱스를 정의하는 방법을 알아보려면 Atlas 설명서에서 embeddedDocument 유형에 대한 인덱스 정의를 참조하세요.
이 예시 sample_restaurants 데이터베이스 의 restaurants 컬렉션 사용합니다. 다음 클래스는 해당 컬렉션 의 문서를 모델링합니다.
[] public class Restaurant { [] public ObjectId Id { get; set; } public string Name { get; set; } = null!; public string Cuisine { get; set; } = null!; public string Borough { get; set; } = null!; public List<GradeEntry> Grades { get; set; } = null!; }
[] public class GradeEntry { public string Grade { get; set; } = null!; public int? Score { get; set; } }
다음 예시 해당 컬렉션 에서 grades 배열 에 grade 필드 값이 "A"인 항목이 포함된 레스토랑을 검색합니다.
var result = restaurantsCollection.Aggregate() .Search(Builders<Restaurant>.Search.EmbeddedDocument( r => r.Grades, Builders<GradeEntry>.Search.Equals(g => g.Grade, "A") ), indexName: "restaurantsembedded").ToList();
... { "_id" : ObjectId("..."), "name" : "Riviera Caterer", "cuisine" : "American", "borough" : "Brooklyn", "grades" : [{ "grade" : "A", "score" : 5 }, { "grade" : "B", "score" : 23 }] } ...
embeddedDocument 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 embeddedDocument 를 참조하세요.
Equals
필드가 지정된 값과 일치하는지 확인하려면 Equals() 메서드를 사용합니다.
다음 예시 movies 컬렉션 에서 year 필드 의 값이 2000인 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Equals(m => m.Year, 2000)) .ToList();
... { "_id" : ObjectId("..."), "title" : "Gladiator", "plot" : "...", "genres" : ["Action", "Adventure", "Drama"], "year" : 2000, "rated" : "R", "imdb" : { "rating" : 8.5, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Cast Away", "plot" : "...", "genres" : ["Adventure", "Drama", "Romance"], "year" : 2000, "rated" : "PG-13", "imdb" : { "rating" : 7.8, "votes" : "...", "id" : "..." } } ...
equals 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 equals를 참조하세요.
Exists
지정된 인덱싱된 필드 이름이 있는 문서를 검색 하려면 Exists() 메서드를 사용합니다. 지정된 필드 존재하지만 인덱싱되지 않은 경우 문서 결과 설정하다 에 포함되지 않습니다.
다음 예시 movies 컬렉션 에서 imdb.rating 필드 존재하는 모든 문서를 검색합니다. 이 검색 imdb.rating 필드 있는 모든 문서를 반환합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Exists(m => m.Imdb.Rating)) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Godfather", "plot" : "...", "genres" : ["Crime", "Drama"], "year" : 1972, "rated" : "R", "imdb" : { "rating" : 9.2, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "The Shawshank Redemption", "plot" : "...", "genres" : ["Drama"], "year" : 1994, "rated" : "R", "imdb" : { "rating" : 9.3, "votes" : "...", "id" : "..." } } ...
exists 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 exists를 참조하세요.
패싯
Facet() 메서드를 사용하여 지정된 패싯 필드의 값 또는 범위를 기준으로 결과를 그룹화하고 각 그룹의 개수를 반환합니다.
$search 및 $searchMeta 단계 모두에서 Facet() 메서드를 사용할 수 있습니다. MongoDB $searchMeta 단계와 함께 패싯 사용하여 쿼리 대한 메타데이터 결과만 조회 것을 권장합니다. $search 단계를 사용하여 메타데이터 결과 및 쿼리 결과를 조회 하려면 $$SEARCH_META 집계 변수를 사용해야 합니다. 이 변수에 대해 자세히 학습하려면 SEARCH_META 애그리게이션 변수 Atlas 가이드를 참조하세요.
다음과 같은 제한 사항이 적용됩니다:
단일 필드에 대해서만 패싯 쿼리를 실행할 수 있습니다. 필드 그룹에 대해서는 패싯 쿼리를 실행할 수 없습니다.
MongoDB v6.0을 실행하는 클러스터에서만 샤딩된 컬렉션에 대해 패싯 쿼리를 실행할 수 있습니다.
다음 예시 movies 컬렉션 에서 year 필드 의 값이 2000보다 크거나 같은 문서가 있는지 검색합니다. 쿼리 Facet() 메서드를 사용하여 입력 문서를 프로세스 하며, genres 필드 기반으로 결과에 반환할 패싯 카테고리의 최대 수는 100 입니다. 쿼리 는 발견된 고유 장르 카테고리의 수를 반환합니다.
var result = moviesCollection.Aggregate() .SearchMeta( Builders<Movie>.Search.Facet( Builders<Movie>.Search.Range(m => m.Year, SearchRangeBuilder.Gte(2000)), Builders<Movie>.SearchFacet.String("genres", m => m.Genres, 100)), indexName: "moviesfacetsearch") .Single() .Facet["genres"].Buckets.Count();
23
facet 수집기에 대해 자세히 알아보려면 패싯 Atlas 가이드를 참조하세요.
GeoShape
특정 도형과 관련된 문서를 검색하려면 GeoShape() 메서드를 사용합니다. 검색할 좌표를 지정할 때에는 경도를 먼저 지정하고 위도를 지정해야 합니다. 경도 값 범위는 -180 ~ 180(두 값 모두 포함)입니다. 위도 값범위는 -90 ~ 90(두 값 모두 포함)입니다.
참고
MongoDB Search는 다음을 지원 하지 않습니다.
기본값이 좌표 기준계(CRS)
평면형 XY 좌표계(2차원)
좌표쌍 점 표기법(pointFieldName: [12, 34])
이 예시 sample_mflix 데이터베이스 의 theaters 컬렉션 사용합니다. 다음 클래스는 해당 컬렉션 의 문서를 모델링합니다.
[] public class Theater { [] public ObjectId Id { get; set; } public int TheaterId { get; set; } public TheaterLocation Location { get; set; } = null!; }
[] public class TheaterLocation { [] public GeoJsonPoint<GeoJson2DGeographicCoordinates> Geo { get; set; } = null!; }
다음 예시 해당 컬렉션 에서 location.geo 필드 의 좌표가 미네소타주 미니애폴리스 지역에서 지정된 다각형 과 교차하는 모든 문서를 검색합니다.
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-93.5, 44.7), new(-93.5, 45.0), new(-93.0, 45.0), new(-93.0, 44.7), new(-93.5, 44.7), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoShape( t => t.Location.Geo, GeoShapeRelation.Intersects, searchArea), indexName: "theatersgeo") .ToList();
... { "_id" : ObjectId("..."), "theaterId" : 1000, "location" : { "geo" : { "type" : "Point", "coordinates" : [-93.24565, 44.85466] } } } ...
geoShape 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 geoShape을 참조하세요.
GeoWithin
GeoWithin() 메서드를 사용하여 지정된 GeoJSON 필드의 좌표가 지정된 도형 내에 속하는 문서를 검색합니다. 다음 범위 내에 있는 점을 검색할 수 있습니다.
원
경계 박스
다각형
검색할 좌표를 지정할 때에는 경도를 먼저 지정하고 위도를 지정해야 합니다. 경도 값 범위는 -180 ~ 180(두 값 모두 포함)입니다. 위도 값 범위는 -90 ~ 90(두 값 모두 포함)입니다.
참고
MongoDB Search는 다음을 지원 하지 않습니다.
기본값이 좌표 기준계(CRS)
평면형 XY 좌표계(2차원)
좌표쌍 점 표기법(pointFieldName: [12, 34])
다음 예시 theaters 컬렉션 에서 location.geo 필드 의 좌표가 지정된 다각형 내에 속하는 모든 문서를 검색합니다.
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-94.0, 44.5), new(-94.0, 45.2), new(-92.5, 45.2), new(-92.5, 44.5), new(-94.0, 44.5), }))); var result = theatersCollection.Aggregate() .Search(Builders<Theater>.Search.GeoWithin(t => t.Location.Geo, searchArea), indexName: "theatersgeo") .ToList();
... { "_id" : ObjectId("..."), "theaterId" : 1000, "location" : { "geo" : { "type" : "Point", "coordinates" : [-93.24565, 44.85466] } } } ...
geoWithin 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 geoWithin을 참조하세요.
인
지정된 값 목록과 일치하는 필드 값이 있는 문서를 검색 하려면 In() 메서드를 사용합니다.
다음 예시 movies 컬렉션 에서 "Action" 또는 "Comedy"를 포함하는 genres 배열 있는 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.In(m => m.Genres, new[] { "Action", "Comedy" })) .ToList();
... { "_id" : ObjectId("..."), "title" : "Home Alone", "plot" : "...", "genres" : ["Comedy", "Family"], "year" : 1990, "rated" : "PG", "imdb" : { "rating" : 7.4, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Die Hard", "plot" : "...", "genres" : ["Action", "Thriller"], "year" : 1988, "rated" : "R", "imdb" : { "rating" : 8.2, "votes" : "...", "id" : "..." } } ...
유사한 콘텐츠 더 보기
입력 문서와 유사한 문서를 검색하려면 MoreLikeThis() 메서드를 사용합니다.
이 예시 다음 클래스를 사용하여 검색 위한 입력 문서 지정합니다.
public class MovieSearch { public string Plot { get; set; } = null!; }
다음 예시 movies 컬렉션 에서 plot 필드 의 값이 "time travel"인 객체 와 유사한 문서를 검색합니다.
var searchDocument = new MovieSearch() { Plot = "time travel", }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.MoreLikeThis(searchDocument)) .ToList();
... { "_id" : ObjectId("..."), "title" : "Thrill Seekers", "plot" : "...", "genres" : ["Action", "Sci-Fi", "Thriller"], "year" : 1999, "rated" : "...", "imdb" : { "rating" : "...", "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "About Time", "plot" : "...", "genres" : ["Drama", "Fantasy", "Romance"], "year" : 2013, "rated" : "R", "imdb" : { "rating" : 7.8, "votes" : "...", "id" : "..." } } ...
moreLikeThis 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 moreLikeThis를 참조하세요.
Near
지정된 필드가 지정된 값에 가까운 문서를 검색하려면 Near() 메서드를 사용합니다. 다음에서 검색을 수행할 수 있습니다.
숫자 필드
날짜 필드
지리적 점
다음 예시 movies 컬렉션 에서 imdb.rating 필드 의 값이 8.5에 가까운 문서를 검색합니다. 값이 8.5에 얼마나 가까운지에 따라 문서가 순서대로 반환됩니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Near(m => m.Imdb.Rating, 8.5, 1)) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Dark Knight", "plot" : "...", "genres" : ["Action", "Crime", "Drama"], "year" : 2008, "rated" : "PG-13", "imdb" : { "rating" : 9.0, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "The Godfather", "plot" : "...", "genres" : ["Crime", "Drama"], "year" : 1972, "rated" : "R", "imdb" : { "rating" : 9.2, "votes" : "...", "id" : "..." } } ...
near 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 near를 참조하세요.
Phrase
지정된 필드에 입력 문자열이 포함된 문서를 검색하려면 Phrase() 메서드를 사용합니다.
다음 예시 movies 컬렉션 에서 plot 필드 에 "time travel" 구문이 포함된 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, "time travel")) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Time Traveler's Wife", "plot" : "...", "genres" : ["Drama", "Fantasy", "Romance"], "year" : 2009, "rated" : "PG-13", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Safety Not Guaranteed", "plot" : "...", "genres" : ["Comedy", "Drama", "Romance"], "year" : 2012, "rated" : "R", "imdb" : { "rating" : 7, "votes" : "...", "id" : "..." } } ...
컬렉션 에서 plot 필드 에 "time travel" 또는 "space adventure" 이 포함된 문서를 검색 할 수도 있습니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Phrase(m => m.Plot, new List<string>() { "time travel", "space adventure" })) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Time Traveler's Wife", "plot" : "...", "genres" : ["Drama", "Fantasy", "Romance"], "year" : 2009, "rated" : "PG-13", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Safety Not Guaranteed", "plot" : "...", "genres" : ["Comedy", "Drama", "Romance"], "year" : 2012, "rated" : "R", "imdb" : { "rating" : 7, "votes" : "...", "id" : "..." } } ...
phrase 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 phrase를 참조하세요.
QueryString
다음 연산자 및 구분자와 함께 문자열을 사용하여 문서를 검색하려면 QueryString() 메서드를 사용합니다.
ANDORNOT()
다음 예에서는 movies 컬렉션에서 plot 필드의 값이 다음 각 기준과 일치하는 문서를 검색합니다.
string
"time"또는 string"space"포함문자열을 포함하지 않음
"comedy"
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.QueryString(m => m.Plot, "(time OR space) AND NOT comedy")) .ToList();
... { "_id" : ObjectId("..."), "title" : "Interstellar", "plot" : "...", "genres" : ["Adventure", "Drama", "Sci-Fi"], "year" : 2014, "rated" : "PG-13", "imdb" : { "rating" : 8.7, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Tomorrowland", "plot" : "...", "genres" : ["Action", "Adventure", "Family"], "year" : 2015, "rated" : "PG", "imdb" : { "rating" : 6.6, "votes" : "...", "id" : "..." } } ...
queryString 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 queryString을 참조하세요.
범위
지정된 필드 의 값이 지정된 숫자, 날짜 또는 문자열 범위 내에 속하는 문서를 검색 하려면 Range() 메서드를 사용합니다.
다음 예시 movies 컬렉션 에서 year 값이 2000 보다 크고 2010보다 작은 모든 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Year, SearchRangeBuilder.Gt(2000).Lt(2010))) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Dark Knight", "plot" : "...", "genres" : ["Action", "Crime", "Drama"], "year" : 2008, "rated" : "PG-13", "imdb" : { "rating" : 9.0, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "The Departed", "plot" : "...", "genres" : ["Crime", "Drama", "Thriller"], "year" : 2006, "rated" : "R", "imdb" : { "rating" : 8.5, "votes" : "...", "id" : "..." } } ...
지정된 필드의 값이 문자열 범위 내에 있는 문서를 검색하려면 먼저 필드에 토큰 인덱스 만들어야 합니다. 인덱스 생성한 후 문자열 범위 를 기반으로 문서를 검색 할 수 있습니다. 다음 예시 title "A" "G" 에서는 필드 값이사전순으로 비교하여 에서 사이인 문서를 반환합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search .Range(m => m.Title, SearchRangeV2Builder.Gte("A").Lte("G"))) .ToList();
... { "_id" : ObjectId("..."), "title" : "Apollo 13", "plot" : "...", "genres" : ["Adventure", "Drama", "History"], "year" : 1995, "rated" : "PG", "imdb" : { "rating" : 7.6, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Braveheart", "plot" : "...", "genres" : ["Biography", "Drama", "History"], "year" : 1995, "rated" : "R", "imdb" : { "rating" : 8.3, "votes" : "...", "id" : "..." } } ...
range 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 range를 참조하세요.
정규식
정규 표현식을 사용하여 문서를 검색하려면 Regex() 메서드를 사용합니다.
다음 예시 movies 컬렉션 에서 title 필드 값에 정확히 6개의 문자가 포함된 문서를 검색합니다.
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
... { "_id" : ObjectId("..."), "title" : "Gandhi", "plot" : "...", "genres" : ["Biography", "Drama", "History"], "year" : 1982, "rated" : "PG", "imdb" : { "rating" : 8.0, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "Batman", "plot" : "...", "genres" : ["Action", "Adventure"], "year" : 1989, "rated" : "PG-13", "imdb" : { "rating" : 7.5, "votes" : "...", "id" : "..." } } ...
참고
분석된 필드에서 정규식 실행
기본값 으로 regex 연산자 분석된 필드 에서 실행 수 없습니다. 다음과 같이 allowAnalyzedField 옵션을 true로 설정하여 분석된 필드 에서 실행 할 수 있습니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true)) .ToList();
allowAnalyzedField 옵션을 true 로 설정하면 예기치 않은 검색 결과가 나올 수 있습니다. 자세히 알아보려면 Atlas regex 가이드의 동작 을 참조하세요.
regex 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 regex를 참조하세요.
Span
필드 리전 내에서 텍스트 검색 일치 항목을 검색하려면 Span() 메서드를 사용합니다. 이 메서드를 사용하면 지정된 정밀도까지 서로 가까이 있는 문자열을 찾을 수 있습니다.
참고
스팬 연산자 성능
쿼리가 위치 정보를 추적해야 하기 때문에 span 연산자는 다른 연산자보다 계산 집약적입니다.
다음 예시 movies 컬렉션 에서 plot 필드 값이 서로 한 단어 내에 "time" 및 "travel" 문자열을 포함하는 문서를 검색합니다.
var searchTerms = new[] { Builders<Movie>.SearchSpan.Term(m => m.Plot, "time"), Builders<Movie>.SearchSpan.Term(m => m.Plot, "travel") }; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Span(Builders<Movie>.SearchSpan.Near(searchTerms, 1))) .ToList();
... { "_id" : ObjectId("..."), "title" : "The Time Traveler's Wife", "plot" : "...", "genres" : ["Drama", "Fantasy", "Romance"], "year" : 2009, "rated" : "PG-13", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "About Time", "plot" : "...", "genres" : ["Drama", "Fantasy", "Romance"], "year" : 2013, "rated" : "R", "imdb" : { "rating" : 7.8, "votes" : "...", "id" : "..." } } ...
span 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 span을 참조하세요.
Text
Text() 메서드를 사용하여 문서 에서 지정된 문자열 또는 문자열 배열 검색 . 주어진 문자열에 여러 개의 용어가 있는 경우, MongoDB Search는 문자열의 각 텀 에 대해 개별적으로 일치하는 항목을 찾습니다.
다음 예시 movies 컬렉션 에서 plot 필드 값에 "secret agent" 문자열이 포함된 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text(m => m.Plot, "secret agent")) .ToList();
... { "_id" : ObjectId("..."), "title" : "Spy Kids", "plot" : "...", "genres" : ["Action", "Adventure", "Comedy"], "year" : 2001, "rated" : "PG", "imdb" : { "rating" : 5.4, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "The Spy Who Loved Me", "plot" : "...", "genres" : ["Action", "Adventure", "Thriller"], "year" : 1977, "rated" : "PG", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } } ...
팁
다중 텀 검색 동작
검색 문자열에 여러 용어가 포함된 경우 이 메서드는 문자열에 있는 각 용어에 대해 개별적으로 일치하는 항목도 찾습니다.
text 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 text를 참조하세요.
와일드카드
검색 문자열에서 모든 문자와 일치할 수 있는 특수 문자를 사용하여 문서를 검색하려면 Wildcard() 메서드를 사용합니다. 검색에 사용할 수 있는 문자는 다음과 같습니다.
캐릭터 | 설명 |
|---|---|
| 모든 단일 문자와 일치 |
| 0개 이상의 문자와 일치 |
| 이스케이프 문자 |
다음 예시 title 필드 값에 string "Amer" 뒤에 다른 문자가 포함된 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
... { "_id" : ObjectId("..."), "title" : "American Beauty", "plot" : "...", "genres" : ["Drama"], "year" : 1999, "rated" : "R", "imdb" : { "rating" : 8.4, "votes" : "...", "id" : "..." } } { "_id" : ObjectId("..."), "title" : "American Gangster", "plot" : "...", "genres" : ["Biography", "Crime", "Drama"], "year" : 2007, "rated" : "R", "imdb" : { "rating" : 7.8, "votes" : "...", "id" : "..." } } ...
참고
분석된 필드에서 와일드카드 실행
기본값 으로 wildcard 연산자 분석된 필드 에서 실행 수 없습니다. 다음과 같이 allowAnalyzedField 옵션을 true로 설정하여 분석된 필드 에서 실행 할 수 있습니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Wildcard(m => m.Title, "Amer*", allowAnalyzedField: true)) .ToList();
allowAnalyzedField 옵션을 true로 설정하면 예기치 않은 검색 결과가 나올 수 있습니다. 자세한 내용은 wildcard 동작을 참조하세요.
wildcard 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 wildcard를 참조하세요.
검색 경로 지정
SearchPathDefinitionBuilder 클래스를 사용하여 검색 할 필드 의 경로를 지정할 수 있습니다. Builders<TDocument>.SearchPath 를 사용하여 SearchPathDefinitionBuilder 인스턴스 에 액세스 하고 해당 메서드 중 하나를 호출하여 검색 경로를 지정합니다. 다음 섹션에서는 사용 가능한 메서드에 대해 설명합니다.
단일 필드
Single() 메서드를 사용하여 하나의 필드 검색 경로로 지정합니다. 다음 예제에서는 유형이 지정된 모델과 함께 Lambda 표현식 사용하거나, 런타임에 값이 알려진 fieldName 변수 또는 메서드 매개변수와 같은 문자열 필드 이름을 전달하거나, 유형이 지정되지 않은 문서 사용하여 필드 지정하는 세 가지 방법을 보여줍니다. .
참고
메서드에 전달하는 Single() 필드 는 검색 인덱스 정의에 포함되어야 합니다. 필드 포함되지 않은 경우 MongoDB Server 오류를 반환하지 않고 빈 결과 설정하다 반환합니다.
Lambda 표현식
형식화된 모델로 작업하고 컴파일 타임에 필드 이름을 알고 있는 경우 Lambda 표현식 사용합니다. 이 양식은 컴파일 타임 유형 검사를 제공합니다.
다음 예시 plot 필드 에서 "secret agent" 텍스트가 포함된 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(m => m.Plot), "secret agent")) .ToList();
[ "...", { "_id" : ObjectId("..."), "title" : "Spy Kids", "plot" : "...", "genres" : ["Action", "Adventure", "Comedy"], "year" : 2001, "rated" : "PG", "imdb" : { "rating" : 5.4, "votes" : "...", "id" : "..." } }, "...", { "_id" : ObjectId("..."), "title" : "The Spy Who Loved Me", "plot" : "...", "genres" : ["Action", "Adventure", "Thriller"], "year" : 1977, "rated" : "PG", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } }, "..." ]
문자열 필드 이름
유형이 지정된 모델로 작업하지만 컴파일 타임에 필드 이름을 모르는 경우 FieldDefinition<TDocument> 를 사용합니다. 사용자 입력 또는 구성 파일 에서 필드 이름을 검색하는 경우 이 양식을 사용하는 것이 좋습니다.
다음 예시 필드 이름을 FieldDefinition<Movie> 변수에 할당하고 이를 Single()에 전달합니다.
FieldDefinition<Movie> runtimeField = fieldName; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Single(runtimeField), "secret agent")) .ToList();
[ "...", { "_id" : ObjectId("..."), "title" : "Spy Kids", "plot" : "...", "genres" : ["Action", "Adventure", "Comedy"], "year" : 2001, "rated" : "PG", "imdb" : { "rating" : 5.4, "votes" : "...", "id" : "..." } }, "...", { "_id" : ObjectId("..."), "title" : "The Spy Who Loved Me", "plot" : "...", "genres" : ["Action", "Adventure", "Thriller"], "year" : 1977, "rated" : "PG", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } }, "..." ]
BsonDocument
또한 유형이 지정된 모델 대신 BsonDocument 객체로 작업할 때 필드 이름을 문자열로 지정해야 합니다.
다음 예시 유형이 지정되지 않은 컬렉션 에서 plot 필드 에서 "secret agent" 텍스트가 포함된 문서를 검색합니다.
var result = moviesCollectionBson.Aggregate() .Search(Builders<BsonDocument>.Search.Text( Builders<BsonDocument>.SearchPath.Single("plot"), "secret agent")) .ToList();
[ "...", { "_id" : ObjectId("..."), "title" : "Spy Kids", "plot" : "...", "...": "..." }, "...", { "_id" : ObjectId("..."), "title" : "The Spy Who Loved Me", "plot" : "...", "...": "..." }, "..." ]
여러 필드
여러 필드에 대한 검색 경로를 지정하려면 Multi() 메서드를 사용합니다. 결과 설정하다 지정된 필드 중 하나와 일치하는 문서가 포함됩니다.
참고
검색 인덱스 정의에 메서드에 전달하는 모든 필드를 포함해야 Multi() 합니다. 포함되지 않은 필드 전달하면 MongoDB Server 해당 필드를 검색 에서 자동으로 제외합니다.
다음 예시 plot 또는 title 필드 에서 "time travel" 구문을 검색합니다.
var result = moviesCollection.Aggregate().Search( Builders<Movie>.Search.Phrase(Builders<Movie>.SearchPath .Multi(m => m.Plot, m => m.Title), "time travel"), indexName: "moviesmulti") .ToList();
[ "...", { "title" : "Safety Not Guaranteed", "year" : 2012, "rated" : "R" }, { "title" : "The Time Traveler's Wife", "year" : 2009, "rated" : "PG-13" }, "..." ]
분석기
분석기는 소문자 등의 연산을 적용하여 텍스트를 검색 가능한 토큰으로 프로세스 . MongoDB Server 필드 를 인덱싱 때와 해당 필드 대해 쿼리 실행 때 다시 분석기 적용합니다. 검색 인덱스 생성할 때 다중 옵션을 지정하면 MongoDB Server 대체 분석기 에서 생성된 두 번째 토큰 설정하다 도 저장합니다.
필드의 기본값 분석기 에서 생성된 토큰 대신 Analyzer() 메서드를 사용하여 multi 분석기 에서 생성된 토큰에 대해 쿼리 실행 수 있습니다. Analyzer() 에 전달하는 이름은 기본 분석기 의 이름이 아니라 인덱스 정의에 있는 multi 차단 의 키 이름이어야 합니다.
다음 예시 "lucene" 이라는 multi 분석기 사용하여 title 필드 에서 "gravity" 텍스트가 포함된 문서를 검색 .
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Analyzer(m => m.Title, "lucene"), "gravity"), indexName: "moviesanalyzer") .ToList();
[ "...", { "title" : "Gravity", "year" : 2013, "rated" : "PG-13" }, "..." ]
와일드카드 경로
Wildcard() 메서드를 사용하여 필드 이름과 일치하는 와일드카드 문자를 사용하는 검색 경로를 지정합니다. 필드 이름에 * 문자를 사용하여 모든 문자 시퀀스와 일치시킬 수 있습니다.
MongoDB Server 다음 조건을 충족하는 필드만 검색합니다.
필드 인덱싱해야 합니다.
필드 이름은 지정된 패턴 과 일치해야 합니다.
필드의 데이터 유형 검색 연산자 와 일치해야 합니다. 예시 를 들어
Text()쿼리 문자열 필드만 검색합니다.
다음 예시 이름이 "p" 로 시작하는 모든 필드에서 "secret agent" 텍스트가 포함된 문서를 검색합니다.
var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Text( Builders<Movie>.SearchPath.Wildcard("p*"), "secret agent")) .ToList();
[ "...", { "_id" : ObjectId("..."), "title" : "Spy Kids", "plot" : "...", "genres" : ["Action", "Adventure", "Comedy"], "year" : 2001, "rated" : "PG", "imdb" : { "rating" : 5.4, "votes" : "...", "id" : "..." } }, "...", { "_id" : ObjectId("..."), "title" : "The Spy Who Loved Me", "plot" : "...", "genres" : ["Action", "Adventure", "Thriller"], "year" : 1977, "rated" : "PG", "imdb" : { "rating" : 7.1, "votes" : "...", "id" : "..." } }, "..." ]
참고
와일드카드 성능
"*"와 같은 광범위한 패턴은 인덱싱된 모든 필드와 일치하며 대규모 인덱스의 쿼리 성능에 영향을 미칠 수 있습니다.
문서 점수
MongoDB Server MongoDB Search 쿼리 에서 반환하는 모든 문서 에 관련성 점수를 할당합니다. 쿼리 가장 높은 점수부터 가장 낮은 점수 순으로 문서를 반환합니다. 점수가 할당되는 방법에 대해 자세히 학습하려면 점수 Atlas 가이드를 참조하세요.
반환된 문서 에 할당된 점수는 문서 메타데이터 의 일부입니다. 집계 파이프라인 에서 $project 단계를 사용하여 반환된 각 문서의 점수를 결과 설정하다 와 함께 포함할 수 있습니다.
다음 예시 에서는 movies 컬렉션 에서 title 필드 값이 정확히 6개의 문자를 포함하고 $project 단계를 사용하여 반환된 문서에 score 이라는 필드 추가하는 문서를 검색합니다.
var regex = "[A-Za-z]{6}"; var result = moviesCollection.Aggregate() .Search(Builders<Movie>.Search.Regex(m => m.Title, regex, allowAnalyzedField: true), indexName: "moviescore") .Project<Movie>(Builders<Movie>.Projection .Include(m => m.Id) .Include(m => m.Title) .Include(m => m.Plot) .MetaSearchScore(m => m.Score)) .ToList();
... { "_id" : ObjectId("..."), "title" : "Gandhi", "plot" : "...", "score" : 1.0 } { "_id" : ObjectId("..."), "title" : "Batman", "plot" : "...", "score" : 1.0 } ...
MongoDB 검색 동작 수정
SearchOptions 객체 매개변수로 전달하여 Search() 메서드의 동작을 수정할 수 있습니다.
SearchOptions 클래스에는 다음과 같은 속성이 포함되어 있습니다.
속성 | 설명 |
|---|---|
| The options for counting the search results. Data type: SearchCountOptions Default: null |
| The options for displaying search terms in their original context. Data type: SearchHighlightOptions<TDocument> Default: null |
| The index to use for the search. Data type: stringDefault: null |
| A flag that specifies whether to perform a full document lookup on
the database or to return only stored source fields directly from
MongoDB Search. Data type: booleanDefault: false |
| A flag that specifies whether to return detailed information about the
score for each document in the results. Data type: booleanDefault: false |
| The starting point for pagination. When set, the search retrieves documents
starting immediately after the specified reference point. Data type: stringDefault: null |
| The end point for pagination. When set, the search retrieves documents
starting immediately before the specified reference point. Data type: stringDefault: null |
| The sorting criteria to apply to the results. Data type: SortDefinition<TDocument> Default: null |
| The options for tracking search terms. Data type: SearchTrackingOptions Default: null |
SearchAfter 예시
다음 예시는 다음 조치를 수행하여 MongoDB 검색 작업의 결과를 페이지 매김합니다.
MetaSearchSequenceToken()빌더 메서드를 사용하는 프로젝션을 정의합니다. 이 메서드는 참고 지점을 포함하도록PaginationToken을 지정합니다.SearchOptions인스턴스를 생성하고 사용할 인덱스와 정렬 기준을 설정합니다.초기 검색을 실행하여
plot필드 값에"time travel"텍스트가 포함된 문서를 찾고, 프로젝션 및 옵션을 작업에 적용합니다.동일한
SearchOptions인스턴스의SearchAfter속성을 설정하여 기본 검색의 첫 번째 결과 이후에 다음 검색이 시작되도록 지시합니다.동일한 일치 조건을 가진 다른 검색 작업을 실행하고, 검색 옵션을 적용하여 결과를 페이지로 나눕니다.
var projection = Builders<Movie>.Projection .Include(x => x.Title) .MetaSearchSequenceToken(x => x.PaginationToken); var searchDefinition = Builders<Movie>.Search.Text(m => m.Plot, "time travel"); var searchOptions = new SearchOptions<Movie> { IndexName = "default", Sort = Builders<Movie>.Sort.Ascending(m => m.Id) }; // Runs the base search operation var baseSearchResults = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList(); if (baseSearchResults.Count == 0) return baseSearchResults; // Sets the starting point for the next search searchOptions.SearchAfter = baseSearchResults[0].PaginationToken; var result = moviesCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Movie>(projection) .ToList();
... { "_id" : ObjectId("..."), "title" : "About Time", "plot" : "...", "genres" : ["Comedy", "Drama", "Romance"], "year" : 2013, "rated" : "R", "imdb" : { "rating" : 7.8, "votes" : "...", "id" : "..." } } ...