개요
이 가이드에서는 Search 빌더를 사용하여 MongoDB .NET/C# 드라이버로 $search 집계 파이프라인 단계를 빌드하는 방법에 대해 설명합니다.
$search 파이프라인 단계에 대해 자세히 알아보려면 $search를 참조하세요.
참고
MongoDB v4.2 이상용 Atlas 에서 사용 가능
$search 집계 파이프라인 연산자 MongoDB 4.2 Search 인덱스 가 적용되는 MongoDB v 이상을 실행 MongoDB Atlas 클러스터에서 호스팅되는 컬렉션에 사용할 수 있습니다. 이 연산자 의 필수 설정 및 기능에 대해 자세히 학습 MongoDB Search 설명서를 참조하세요.
이 가이드의 예에서는 guitars 컬렉션의 다음 문서를 사용합니다.
{ "_id": 1, "make": "Fender", "description": "Classic guitars known for their versatility.", "establishedYear": 1946, "in_stock": true, "rating": 9 } { "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in_stock": true, "rating": 8 } { "_id": 3, "make": "PRS", "description": "High-end guitars known for their quality.", "establishedYear": 1985, "in_stock": true, "rating": 9 } { "_id": 4, "make": "Kiesel", "description": "Quality guitars made only for custom orders.", "establishedYear": 2015, "in_stock": false } { "_id": 5, "make": "Ibanez", "description": "Well-crafted guitars used by many professional guitarists.", "establishedYear": 1957, "in_stock": true, "rating": 7 } { "_id": 6, "make": "Strandberg", "description": "Modern guitars known for their headless models.", "establishedYear": 1982, "in_stock": false }
다음 Guitar 클래스는 이 컬렉션의 문서를 모델링합니다.
public class Guitar { public int Id { get; set; } public string Make { get; set; } public string Description { get; set; } public int EstablishedYear { get; set; } [] public bool InStock { get; set; } [] public Location InStockLocation { get; set; } public int? Rating { get; set; } public double Score {get; set;} [] public string PaginationToken { get; set; } }
참고
guitars 컬렉션의 문서는 카멜 케이스 명명 규칙을 사용합니다. 이 가이드의 예시에서는 ConventionPack 사용하여 컬렉션의 필드를 파스칼식 대/소문자로 역직렬화하고 Guitar 클래스의 속성에 매핑합니다.
사용자 지정 직렬화에 대해 자세히 알아보려면 사용자 지정 직렬화를 참조하세요.
MongoDB Search 인덱스 생성
Atlas 컬렉션 에서 검색 수행하려면 먼저 컬렉션 에 MongoDB Search 인덱스 만들어야 합니다. MongoDB Search 인덱스 는 데이터를 검색 가능한 형식으로 분류하는 데이터 구조입니다.
MongoDB Search 인덱스를 만드는 방법을 학습 MongoDB Search 인덱스 만들기 가이드 를 참조하세요.
MongoDB Search 연산자 및 수집기
Search 클래스에는 $search 작업을 수행하는 데 사용할 수 있는 메서드가 포함되어 있습니다. 사용 가능한 $search 연산자 및 수집기의 전체 목록은 연산자 및 수집기 Atlas 가이드 참조하세요.
자동 완성 기능
불완전한 입력 문자열에서 일련의 문자가 포함된 단어나 구문을 검색하려면 Autocomplete() 메서드를 사용합니다.
다음 예시에서는 make 필드에서 "Gib" 스트링으로 시작하는 텍스트에 대한 자동 완성 쿼리를 수행합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Autocomplete(g => g.Make, "Gib"), indexName: "guitarmakes") .ToList();
참고
자동 완성 쿼리를 위한 인덱싱
자동 완성 쿼리를 성공적으로 수행하려면 자동 완성을 지원하는 MongoDB Search 인덱스 만들어야 합니다. 자세히 학습 Atlas 설명서에서 자동 완성을 위한 필드 인덱싱 방법을 참조하세요.
MongoDB Search 인덱스 생성한 후에는 앞의 코드에 표시된 대로 인덱스 이름을 Autocomplete() 메서드에 전달해야 합니다.
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
autocomplete 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 autocomplete를 참조하세요.
복합
두 개 이상의 연산자를 하나의 검색으로 결합하려면 Compound() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 다음 기준과 모두 일치하는 문서를 검색합니다.
문서에
rating필드가 있음in_stock필드가false가 아님establishedYear필드의 값이 1940보다 큼
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Compound() .Must(Builders<Guitar>.Search.Exists(g => g.Rating)) .MustNot(Builders<Guitar>.Search.Equals(g => g.InStock, false)) .Must(Builders<Guitar>.Search.Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1940)))) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
compound 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 compound를 참조하세요.
embeddedDocument
EmbeddedDocument() 방법을 사용하여 필드의 배열 값 내에 있는 문서에 대한 검색 작업을 수행합니다.
참고
내장된 문서에서 Atlas Search를 사용하려면 배열 필드에 embeddedDocument 인덱스를 생성해야 합니다.
embeddedDocument 인덱스를 정의하는 방법을 알아보려면 Atlas 설명서에서 embeddedDocument 유형에 대한 인덱스 정의를 참조하세요.
guitars 컬렉션의 일부 문서에 제품 세부 정보 객체 배열을 포함하는 productDetails 필드가 추가되었다고 가정해 보겠습니다.
{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 1234, "serial": "YZ5678"}] } { "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "rating": 8 } { "_id": 3, "make": "PRS", "description": "...", "establishedYear": 1985, "in_stock": true, "rating": 9, "productDetails": [{"product_id": 9870, "serial": "AB5555"}] } { "_id": 4, "make": "Kiesel", "description": "...", "establishedYear": 2015, "in_stock": false } { "_id": 5, "make": "Ibanez", "description": "...", "establishedYear": 1957, "in_stock": true, "rating": 7, "productDetails": [{"product_id": 5432, "serial": "ZZ1234"}] } { "_id": 6, "make": "Strandberg", "description": "...", "establishedYear": 1982, "in_stock": false }
productDetails 필드 에 embeddedDocument 인덱스 만든 후 해당 필드 의 문서에 대해 MongoDB Search 작업을 수행할 수 있습니다. 다음 예시 productDetails 배열 필드에서 텍스트 검색 수행하고 serial 필드 값이 "YZ5678"인 문서를 반환합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.EmbeddedDocument( g => g.ProductDetails, Builders<ProductDetails>.Search.Text(p => p.Serial, "YZ5678") )).ToList(); return result;
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9, "productDetails" : [{ "product_id" : 1234, "serial" : "YZ5678" }] }
embeddedDocument 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 embeddedDocument 를 참조하세요.
Equals
필드가 지정된 값과 일치하는지 확인하려면 Equals() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 in_stock 필드 값이 true인 모든 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Equals(g => g.InStock, true)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 } { "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
equals 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 equals를 참조하세요.
Exists
지정된 인덱스 필드 이름이 있는 문서를 검색하려면 Exists() 메서드를 사용합니다. 지정된 필드가 존재하지만 인덱스되지 않은 경우 문서는 결과 집합에 포함되지 않습니다.
다음 예에서는 guitars 컬렉션에서 rating 필드가 존재하는 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Exists(g => g.Rating)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 } { "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
exists 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 exists를 참조하세요.
패싯
Facet() 메서드를 사용하여 지정된 패싯 필드의 값 또는 범위를 기준으로 결과를 그룹화하고 각 그룹의 개수를 반환합니다.
$search 및 $searchMeta 단계 모두에서 Facet() 메서드를 사용할 수 있습니다. MongoDB $searchMeta 단계와 함께 패싯 사용하여 쿼리 대한 메타데이터 결과만 조회 것을 권장합니다. $search 단계를 사용하여 메타데이터 결과 및 쿼리 결과를 조회 하려면 $$SEARCH_META 집계 변수를 사용해야 합니다. 이 변수에 대해 자세히 학습하려면 SEARCH_META 애그리게이션 변수 Atlas 가이드를 참조하세요.
다음과 같은 제한 사항이 적용됩니다:
단일 필드에 대해서만 패싯 쿼리를 실행할 수 있습니다. 필드 그룹에 대해서는 패싯 쿼리를 실행할 수 없습니다.
MongoDB v6.0을 실행하는 클러스터에서만 샤딩된 컬렉션에 대해 패싯 쿼리를 실행할 수 있습니다.
다음 예시에서는 guitars 컬렉션에서 in_stock 필드 값이 true인 모든 문서를 검색합니다. 쿼리는 입력 문서를 처리하기 위해 Facet() 메서드를 사용하며, 결과에 반환되는 패싯 카테고리는 최대 100개입니다. 이 쿼리는 in_stock의 값이 true인 문서의 총 개수를 반환합니다.
var result = guitarsCollection.Aggregate() .SearchMeta( Builders<Guitar>.Search.Facet( Builders<Guitar>.Search.Equals(g => g.InStock, true), Builders<Guitar>.SearchFacet.String("string", g => g.Make, 100)), indexName: "guitarfacetsearch") .Single() .Facet["string"].Buckets.Count();
검색 다음과 같은 결과를 반환합니다.
4
facet 수집기에 대해 자세히 알아보려면 패싯 Atlas 가이드를 참조하세요.
GeoShape
특정 도형과 관련된 문서를 검색하려면 GeoShape() 메서드를 사용합니다. 검색할 좌표를 지정할 때에는 경도를 먼저 지정하고 위도를 지정해야 합니다. 경도 값 범위는 -180 ~ 180(두 값 모두 포함)입니다. 위도 값범위는 -90 ~ 90(두 값 모두 포함)입니다.
참고
MongoDB Search는 다음을 지원 하지 않습니다.
기본값이 좌표 기준계(CRS)
평면형 XY 좌표계(2차원)
좌표쌍 점 표기법(pointFieldName: [12, 34])
guitars 컬렉션의 일부 문서에 in_stock_location 필드가 추가되었다고 가정해 보겠습니다. 이제 컬렉션의 변경된 문서는 다음과 같습니다.
{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 } { "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }
다음 예에서는 in_stock_location 필드의 좌표가 지정된 다각형과 교차하는 모든 문서를 검색합니다.
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-72.93615, 41.69791), new(-72.93615, 40.59791), new(-74.93615, 40.59791), new(-74.93615, 41.69791), new(-72.93615, 41.69791), }))); var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.GeoShape(g => g.InStockLocation, GeoShapeRelation.Intersects, searchArea)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "in_stock_location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }
geoShape 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 geoShape을 참조하세요.
GeoWithin
GeoWithin() 메서드를 사용하여 지정된 GeoJSON 필드의 좌표가 지정된 도형 내에 속하는 문서를 검색합니다. 다음 범위 내에 있는 점을 검색할 수 있습니다.
원
경계 박스
다각형
검색할 좌표를 지정할 때에는 경도를 먼저 지정하고 위도를 지정해야 합니다. 경도 값 범위는 -180 ~ 180(두 값 모두 포함)입니다. 위도 값 범위는 -90 ~ 90(두 값 모두 포함)입니다.
참고
MongoDB Search는 다음을 지원 하지 않습니다.
기본값이 좌표 기준계(CRS)
평면형 XY 좌표계(2차원)
좌표쌍 점 표기법(pointFieldName: [12, 34])
guitars 컬렉션의 일부 문서에 in_stock_location 필드가 추가되었다고 가정해 보겠습니다. 이제 컬렉션의 변경된 문서는 다음과 같습니다.
{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ -73.93615, 40.69791 ]}, "rating": 9 } { "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "in_stock_location": { "type": "Point", "coordinates": [ 47.6062, 122.321 ]}, "rating": 8 }
다음 예에서는 in_stock_location 필드의 좌표가 지정된 다각형 내에 속하는 모든 문서를 검색합니다.
GeoJsonPolygon<GeoJson2DGeographicCoordinates> searchArea = new(new(new(new GeoJson2DGeographicCoordinates[] { new(-74.3994140625, 40.5305017757), new(-74.7290039063, 40.5805846641), new(-74.7729492188, 40.9467136651), new(-74.0698242188, 41.1290213475), new(-73.65234375, 40.9964840144), new(-72.6416015625, 40.9467136651), new(-72.3559570313, 40.7971774152), new(-74.3994140625, 40.5305017757), }))); var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.GeoWithin(g => g.InStockLocation, searchArea)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "in_stock_location" : { "type" : "Point", "coordinates" : ["-73.93615", "40.69791"] }, "rating" : 9 }
geoWithin 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 geoWithin을 참조하세요.
인
지정된 값 목록과 일치하는 필드 값이 있는 문서를 검색 하려면 In() 메서드를 사용합니다.
다음 예시 guitars 컬렉션 에서 make 필드 값이 "Fender" 또는 "Gibson"인 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.In(g => g.Make, ["Fender", "Gibson"])) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id": 1, "make": "Fender", "description": "...", "establishedYear": 1946, "in_stock": true, "rating": 9 } { "_id": 2, "make": "Gibson", "description": "...", "establishedYear": 1902, "in_stock": true, "rating": 8 }
유사한 콘텐츠 더 보기
입력 문서와 유사한 문서를 검색하려면 MoreLikeThis() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 Description 필드의 값이 'high quality'인 객체와 유사한 문서를 검색합니다.
var searchDocument = new GuitarSearch() { Description = "high quality", }; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.MoreLikeThis(searchDocument)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
moreLikeThis 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 moreLikeThis를 참조하세요.
Near
지정된 필드가 지정된 값에 가까운 문서를 검색하려면 Near() 메서드를 사용합니다. 다음에서 검색을 수행할 수 있습니다.
숫자 필드
날짜 필드
지리적 점
다음 예에서는 guitars 컬렉션에서 rating 필드의 값이 9에 가까운 문서를 검색합니다. 값이 숫자 9에 얼마나 가까운지에 따라 문서가 순서대로 반환됩니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Near(g => g.Rating, 9, 1)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "...", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 3, "make" : "PRS", "description" : "...", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "...", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 } { "_id" : 5, "make" : "Ibanez", "description" : "...", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
near 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 near를 참조하세요.
Phrase
지정된 필드에 입력 문자열이 포함된 문서를 검색하려면 Phrase() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 description 필드에 'classic guitars'라는 구문이 포함된 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Phrase(g => g.Description, "classic guitars")) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
다음과 같이 컬렉션에서 여러 개의 별도 구문과 일치하는 문서를 검색할 수도 있습니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Phrase(g => g.Description, new List<string>() { "classic guitars", "quality guitars" })) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
phrase 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 phrase를 참조하세요.
QueryString
다음 연산자 및 구분자와 함께 문자열을 사용하여 문서를 검색하려면 QueryString() 메서드를 사용합니다.
ANDORNOT()
다음 예에서는 guitars 컬렉션에서 description 필드의 값이 다음 각 기준과 일치하는 문서를 검색합니다.
문자열 'classic' 또는 문자열 'quality' 포함
'custom' 문자열을 포함하지 않음
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.QueryString(g => g.Description, "(classic OR quality) AND NOT custom")) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 }
queryString 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 queryString을 참조하세요.
범위
지정된 필드 의 값이 지정된 숫자, 날짜 또는 문자열 범위 내에 속하는 문서를 검색 하려면 Range() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 establishedYear 값이 1980보다 크고 2020보다 작은 모든 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search .Range(g => g.EstablishedYear, SearchRangeBuilder.Gt(1980).Lt(2020))) .ToList();
이 검색을 수행하면 다음 결과가 반환됩니다.
{ "_id" : 3, "make" : "PRS", "description" : "High-end guitars known for their quality.", "establishedYear" : 1985, "in_stock" : true, "rating" : 9 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null } { "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in_stock" : false, "rating" : null }
지정된 필드 값이 문자열 범위 내에 있는 문서를 검색하려면 먼저 해당 필드에 토큰 인덱스를 생성해야 합니다. 인덱스를 생성한 후, 다음 예시와 같이 문자열 범위를 기준으로 문서를 검색할 수 있습니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search .Range(g => g.Make, SearchRangeV2Builder.Gte("Fender").Lte("Kiesel"))) .ToList();
앞의 예시 에서는 make 필드 의 문자열 값이 "Fender" 보다 크거나 같고 "Kiesel" 보다 작거나 같은 문서를 검색합니다. 운전자 문자열 값을 사전순으로비교합니다.
이 검색을 수행하면 다음 결과가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null } { "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
range 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 range를 참조하세요.
정규식
정규 표현식을 사용하여 문서를 검색하려면 Regex() 메서드를 사용합니다.
다음 예에서는 guitars 컬렉션에서 make 필드의 값에 정확히 6개의 문자가 포함된 문서를 검색합니다.
var regex = "[A-Za-z]{6}"; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Regex(g => g.Make, regex)) .ToList();
이 검색을 수행하면 다음 결과가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null } { "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
참고
기본적으로 regex 연산자는 분석된 필드에서 실행할 수 없습니다. 다음과 같이 allowAnalyzedField 옵션을 true로 설정하여 분석된 필드에서 실행되도록 할 수 있습니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, true)) .ToList();
allowAnalyzedField 옵션을 true로 설정하면 예기치 않은 검색 결과가 나올 수 있습니다. 자세히 알아보려면 regex 동작을 참조하세요.
regex 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 regex를 참조하세요.
Span
필드 리전 내에서 텍스트 검색 일치 항목을 검색하려면 Span() 메서드를 사용합니다. 이 메서드를 사용하면 지정된 정밀도까지 서로 가까이 있는 문자열을 찾을 수 있습니다.
참고
쿼리가 위치 정보를 추적해야 하기 때문에 span 연산자는 다른 연산자보다 계산 집약적입니다.
다음 예에서는 guitars 컬렉션에서 description 필드 값에 서로 한 단어 내에 'guitars' 및 'quality' 문자열이 포함된 문서를 검색합니다.
var searchTerms = new[] { Builders<Guitar>.SearchSpan.Term(g => g.Description, "guitars"), Builders<Guitar>.SearchSpan.Term(g => g.Description, "quality") }; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Span(Builders<Guitar>.SearchSpan.Near(searchTerms, 1))) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 2015, "in_stock" : false, "rating" : null }
_id: 3인 문서에 'guitars' 및 'quality'라는 문자열이 포함되어 있지만 이 문자열은 두 단어 이상으로 구분되어 있으므로 검색 결과에서 이 문서가 생략됩니다.
span 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 span을 참조하세요.
Text
Text() 메서드를 사용하여 문서 에서 지정된 문자열 또는 문자열 배열 검색 . 주어진 문자열에 여러 개의 용어가 있는 경우, MongoDB Search는 문자열의 각 텀 에 대해 개별적으로 일치하는 항목을 찾습니다.
다음 예에서는 guitars 컬렉션에서 description 필드 값에 'used by professionals' 문자열이 포함된 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Text(g => g.Description, "used by professional")) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 1957, "in_stock" : true, "rating" : 7 }
팁
검색 문자열에 여러 용어가 포함된 경우 이 메서드는 문자열에 있는 각 용어에 대해 개별적으로 일치하는 항목도 찾습니다.
text 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 text를 참조하세요.
와일드카드
검색 문자열에서 모든 문자와 일치할 수 있는 특수 문자를 사용하여 문서를 검색하려면 Wildcard() 메서드를 사용합니다. 검색에 사용할 수 있는 문자는 다음과 같습니다.
캐릭터 | 설명 |
|---|---|
| 모든 단일 문자와 일치 |
| 0개 이상의 문자와 일치 |
| 이스케이프 문자 |
다음 예에서는 make 필드의 값에 'Strand'라는 문자열과 그 뒤에 다른 문자가 포함되어 있는 문서를 검색합니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*")) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 6, "make" : "Strandberg", "description" : "Modern guitars known for their headless models.", "establishedYear" : 1982, "in_stock" : false, "rating" : null }
참고
기본적으로 wildcard 연산자는 분석된 필드에서 실행할 수 없습니다. 다음과 같이 allowAnalyzedField 옵션을 true로 설정하여 분석된 필드에서 실행되도록 할 수 있습니다.
var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Wildcard(g => g.Make, "Strand*", true)) .ToList();
allowAnalyzedField 옵션을 true로 설정하면 예기치 않은 검색 결과가 나올 수 있습니다. 자세한 내용은 wildcard 동작을 참조하세요.
wildcard 연산자에 대해 자세히 알아보려면 Atlas 가이드에서 wildcard를 참조하세요.
여러 필드 검색
path 매개변수는 MongoDB Search 연산자가 검색할 필드 를 지정하는 데 사용됩니다.path 매개변수에 포함될 수 있는 내용에 대해 자세히 학습 쿼리 경로 구성 가이드 참조하세요.
참고
모든 연산자가 다양한 유형의 경로를 모두 사용할 수 있는 것은 아닙니다. 지원하는 경로 유형에 대한 자세한 내용은 각 개별 연산자에 대한 문서를 참조하세요.
여러 개의 인덱싱된 필드를 검색하려면 Multi() 메서드를 사용하고 필드에 전달하세요. 지정된 필드 중 하나와 일치하는 문서가 결과 집합에 포함됩니다.
다음 예시에서는 make 또는 description 필드에서 classic 문자열을 검색합니다.
var result = guitarsCollection.Aggregate().Search( Builders<Guitar>.Search.Phrase(Builders<Guitar>.SearchPath .Multi(g => g.Description, g => g.Make), "classic"), indexName: "guitarmulti") .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 1946, "in_stock" : true, "rating" : 9} { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 1902, "in_stock" : true, "rating" : 8}
문서 점수
MongoDB Search 쿼리 가 반환하는 모든 문서 관련성에 따라 점수가 할당되며, 결과 설정하다 에 포함된 문서는 가장 높은 점수부터 가장 낮은 점수 순으로 반환됩니다. 점수가 할당되는 방법에 대해 자세히 학습 점수 Atlas 가이드 참조하세요.
반환된 문서 에 할당된 점수는 문서 메타데이터 의 일부입니다. 집계 파이프라인 에서 $project 단계를 사용하여 반환된 각 문서의 점수를 결과 설정하다 와 함께 포함할 수 있습니다.
다음 예시 guitars 컬렉션 에서 make 필드 의 값이 정확히 6개의 문자를 포함하는 문서를 검색하고 $project 단계를 사용하여 반환된 문서에 score 이라는 필드 추가합니다.
var regex = "[A-Za-z]{6}"; var result = guitarsCollection.Aggregate() .Search(Builders<Guitar>.Search.Regex(g => g.Make, regex, allowAnalyzedField: true), indexName: "guitarscore") .Project<Guitar>(Builders<Guitar>.Projection .Include("Id") .Include("Make") .Include("Description") .MetaSearchScore(g => g.Score)) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id" : 1, "make" : "Fender", "description" : "Classic guitars known for their versatility.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 4, "make" : "Kiesel", "description" : "Quality guitars made only for custom orders.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 5, "make" : "Ibanez", "description" : "Well-crafted guitars used by many professional guitarists.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "score" : 1.0 } { "_id" : 2, "make" : "Gibson", "description" : "Classic guitars known for their rich, full tones.", "establishedYear" : 0, "in_stock" : false, "rating" : null, "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 Search 작업의 결과를 페이지 매김합니다.
MetaSearchSequenceToken()빌더 메서드를 사용하는 프로젝션을 정의합니다. 이 메서드는 참고 지점을 포함하도록PaginationToken을 지정합니다.SearchOptions인스턴스를 생성하고 사용할 인덱스와 정렬 기준을 설정합니다.초기 검색을 실행하여
description필드 값에"classic"텍스트가 포함된 문서를 찾고, 프로젝션 및 옵션을 작업에 적용합니다.동일한
SearchOptions인스턴스의SearchAfter속성을 설정하여 기본 검색의 첫 번째 결과 이후에 다음 검색이 시작되도록 지시합니다.동일한 일치 조건을 가진 다른 검색 작업을 실행하고, 검색 옵션을 적용하여 결과를 페이지로 나눕니다.
var projection = Builders<Guitar>.Projection .Include(x => x.Make) .MetaSearchSequenceToken(x => x.PaginationToken); var searchDefinition = Builders<Guitar>.Search.Text(g => g.Description, "classic"); var searchOptions = new SearchOptions<Guitar> { IndexName = "default", Sort = Builders<Guitar>.Sort.Ascending(g => g.Id) }; // Runs the base search operation var baseSearchResults = guitarsCollection.Aggregate() .Search(searchDefinition, searchOptions) .Project<Guitar>(projection) .ToList(); // Sets the starting point for the next search searchOptions.SearchAfter = baseSearchResults[0].PaginationToken; var result = guitarsCollection.Aggregate() .Search(searchDefinition, searchOptions) .ToList();
이 검색을 수행하면 다음 문서가 반환됩니다.
{ "_id": 2, "make": "Gibson", "description": "Classic guitars known for their rich, full tones.", "establishedYear": 1902, "in_stock": true, "rating": 8 }
팁
MongoDB Search 페이지 매김에 대해 자세히 학습 Atlas 문서에서 결과 페이지 매김을 참조하세요.