정의
$meta
문서와 관련된 메타데이터를 반환합니다(예: 텍스트 검색 시
"textScore"
).$meta
표현식의 구문은 다음과 같습니다.{ $meta: <metaDataKeyword> } $meta
표현식은 다음 값을<metaDataKeyword>
로 지정할 수 있습니다.Keyword설명"textScore"
일치하는 각 문서에 대한 해당
$text
쿼리와 연결된 점수를 반환합니다. 텍스트 점수는 문서가 검색어 또는 텀과 얼마나 일치하는지를 나타냅니다.{ $meta: "textScore" }
는$text
쿼리와 함께 사용해야 합니다.이전 버전에서는
$text
쿼리와 함께 사용되지 않으면 null 점수를 반환합니다.$text
이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas Search를 제공합니다."indexKey"
텍스트가 아닌 인덱스를 사용하면 문서의 인덱스 키를 반환합니다.
{ $meta: "indexKey" }
표현식은 디버깅 목적으로만 사용되고 애플리케이션 로직에는 사용되지 않으며cursor.returnKey()
보다 선호됩니다.MongoDB Atlas Search는 다음과 같은
$meta
키워드를 추가로 제공합니다.자세한 내용은 Atlas Search 설명서를 참조하세요.
중요
다음
$meta
키워드는 Stable API V1에서 지원되지 않습니다."textScore"
"indexKey"
"searchScore"
"searchHighlights"
"searchSequenceToken"
"searchScoreDetails"
행동
텍스트 점수 메타데이터 $meta: "textScore"
$text 검색 필수
{ $meta: "textScore" }
표현식은$text
와 함께 사용해야 합니다. 예시:집계에서 앞으로의 단계에서
{ $meta: "textScore" }
표현식을 사용하려면 파이프라인에$text
쿼리가 있는$match
단계를 반드시 지정합니다.$match
단계에서$text
쿼리를 지정하지 않으면 작업이 실패합니다.찾기에서
{ $meta: "textScore" }
를 사용하려면 쿼리 조건에$text
연산자를 지정해야 합니다. 쿼리 조건에$text
연산자를 지정하지 않으면 작업이 실패합니다.
참고
$text
이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas Search를 제공합니다.
가용성
프로젝션에서의 사용
텍스트 점수 필터링
집계에서 텍스트 점수 값이 있는 필드를 출력하는 단계 다음에 쿼리 조건을 지정하거나 후속 단계에서 필드에 대한 작업을 수행할 수 있습니다. 예시는 자체 관리 배포의 집계 파이프라인에서 $text를 참조하세요.
찾기에서는 텍스트 점수에 쿼리 조건을 지정할 수 없습니다. 대신 집계를 사용하세요.
정렬에서 사용
프로젝션 없이 정렬
집계에서는
textScore
를 프로젝션하지 않고도 결과 문서를{ $meta: "textScore" }
별로 정렬할 수 있습니다.찾기에서는
textScore
를 프로젝션할 필요 없이 결과 문서를{ $meta: "textScore" }
별로 정렬할 수 있습니다.
프로젝션으로 정렬
집계에서 프로젝션과 정렬 모두에
{ $meta: "textScore" }
표현식을 포함하면 프로젝션과 정렬에서 표현식에 대해 서로 다른 필드 이름을 가질 수 있습니다. 정렬의 필드 이름은 쿼리 시스템에서 무시됩니다.찾기에서 프로젝션과 정렬 모두에
{ $meta: "textScore" }
표현식을 포함하면 프로젝션과 정렬에서 표현식에 대해 서로 다른 필드 이름을 가질 수 있습니다. 정렬의 필드 이름은 쿼리 시스템에서 무시됩니다.
인덱스 키 메타데이터 $meta: "indexKey" (집계 및 찾기)
사용법
{ $meta: "indexKey" }
표현식은 디버깅 목적으로만 사용되며 애플리케이션 로직용으로는 사용할 수 없습니다.cursor.returnKey()
보다{ $meta: "indexKey" }
표현식을 사용하는 것이 좋습니다.
가용성
집계에서
{ $meta: "indexKey" }
표현식은$project
,$group
$sortByCount
등과 같은 집계 표현식을 허용하는 다양한 단계에 포함될 수 있지만$sort
은(는) 포함되지 않습니다. 그러나 집계 파이프라인을 사용하면 먼저{ $meta: "indexKey" }
표현식(예:$project
,$addFields
등)을 프로젝트한 다음 후속$sort
단계에서 해당 필드를 기준으로 정렬할 수 있습니다.찾기에서
{ $meta: "indexKey" }
표현식은 프로젝션 문서의 일부로만 사용할 수 있습니다.
반환 값
반환되는 값은 데이터베이스가 인덱스의 값을 나타내기로 결정하는 방법에 따라 달라지며 버전에 따라 변경될 수 있습니다. 표시된 값은 필드의 실제 값이 아닐 수 있습니다.
반환되는 값은 시스템에서 선택한 실행 계획에 따라 달라집니다. 예를 들어 쿼리에 답변하는 데 사용할 수 있는 인덱스가 두 개 있는 경우 'indexKey' 메타데이터의 값은 선택한 인덱스에 따라 달라집니다.
인덱스를 사용하지 않으면
{ $meta: "indexKey" }
표현식은 값을 반환하지 않으며 필드가 출력의 일부로 포함되지 않습니다.
예시
$meta: "textScore"
다음 문서로 articles
collection을 생성합니다.
db.articles.insertMany([ { "_id" : 1, "title" : "cakes and ale" }, { "_id" : 2, "title" : "more cakes" }, { "_id" : 3, "title" : "bread" }, { "_id" : 4, "title" : "some cakes" }, { "_id" : 5, "title" : "two cakes to go" }, { "_id" : 6, "title" : "pie" } ])
title
필드에 텍스트 인덱스를 생성합니다.
db.articles.createIndex( { title: "text"} )
다음 집계 작업은 텍스트 검색을 수행하고 $meta
연산자를 사용하여 텍스트 검색 점수를 기준으로 그룹화합니다.
db.articles.aggregate( [ { $match: { $text: { $search: "cake" } } }, { $group: { _id: { $meta: "textScore" }, count: { $sum: 1 } } } ] )
이 연산은 다음과 같은 결과를 반환합니다.
{ "_id" : 0.75, "count" : 1 } { "_id" : 0.6666666666666666, "count" : 1 } { "_id" : 1, "count" : 2 }
더 많은 예를 보려면 자체 관리형 집계 파이프라인의 $text를 참조하세요.
다음 쿼리는 cake
(이)라는 용어에 대한 텍스트 검색을 수행하고 프로젝션 문서에서 $meta
연산자를 사용하여 일치하는 각 문서에 할당된 점수를 추가합니다.
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
이 작업은 텍스트 점수와 함께 다음 문서를 반환합니다.
{ "_id" : 4, "title" : "some cakes", "score" : 1 } { "_id" : 1, "title" : "cakes and ale", "score" : 0.75 } { "_id" : 5, "title" : "two cakes to go", "score" : 0.6666666666666666 } { "_id" : 2, "title" : "more cakes", "score" : 1 }
"textScore"
투영 및 정렬에 대한 추가 예시는 관련성 점수 예시를 참조하세요.
$meta: "indexKey"
참고
{ $meta: "indexKey" }
표현식은 디버깅 목적으로만 사용되며 애플리케이션 로직에는 사용되지 않습니다. MongoDB는 쿼리 시스템에서 선택한 인덱스와 연관된 값을 반환합니다. 시스템은 후속 실행 시 다른 인덱스를 선택할 수 있습니다.
선택한 인덱스의 경우 반환되는 값은 데이터베이스가 인덱스의 값을 나타내기로 결정하는 방법에 따라 달라지며 버전에 따라 변경될 수 있습니다. 표시된 값은 필드의 실제 값이 아닐 수 있습니다.
다음 문서로 orders
collection을 생성합니다.
db.orders.insertMany([ { "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type": "apparel" }, { "item" : "jkl", "price" : Decimal128("20"), "quantity" : 1, "type": "electronics" }, { "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type": "apparel" } ])
type
및 item
필드에 다음 복합 인덱스를 생성합니다.
db.orders.createIndex( { type: 1, item: 1 } )
다음 집계 작업은 type
(이)가 apparel
(과)와 같은 모든 문서를 찾고 인덱스가 사용된 경우 일치하는 문서의 인덱스 키 값을 포함하기 위해 $meta
연산자를 사용합니다.
db.orders.aggregate( [ { $match: { type: "apparel" } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
다음 작업은 type
가 apparel
과 같은 모든 문서를 찾고 인덱스가 사용된 경우 일치하는 문서의 인덱스 키 값을 포함하기 위해 $meta
연산자를 사용합니다.
db.orders.find( { type: "apparel" }, { idxKey: { $meta: "indexKey" } } )
이 작업은 해당 인덱스 키와 일치하는 문서를 반환합니다.
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } }
인덱스를 사용하지 않으면 { $meta: "indexKey" }
가 아무 것도 반환하지 않습니다.
예를 들어, price
필드에 일치 조건을 지원하는 인덱스가 없다면 다음 작업에서는 인덱스를 사용하지 않습니다.
db.orders.aggregate( [ { $match: { price: { $gte: Decimal128("10") } } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
예를 들어, price
필드에 일치 조건을 지원하는 인덱스가 없다면 다음 작업에서는 인덱스를 사용하지 않습니다.
db.orders.find( { price: { $gte: Decimal128("10") } }, { idxKey: { $meta: "indexKey" } } )
이 작업은 idxKey
필드 없이 일치하는 문서를 반환합니다.
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type" : "apparel" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcdf"), "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type" : "electronics" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type" : "apparel" }
이 페이지의 C# 예제에서는 Atlas 샘플 데이터 세트의 sample_mflix
데이터베이스 사용합니다. 무료 MongoDB Atlas cluster 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB .NET/ C# 드라이버 문서에서 시작하기 를 참조하세요.
다음 Movie
클래스는 sample_mflix.movies
컬렉션의 문서를 모델링합니다.
public class Movie { public ObjectId Id { get; set; } public string Plot { get; set; } public List<string> Genres { get; set; } public int Runtime { get; set; } public List<string> Cast { get; set; } public string Title { get; set; } [ ] public DateTime LastUpdated { get; set; } public string Rated { get; set; } public int Year { get; set; } public ImdbData Imdb { get; set; } public string Type { get; set; } public int Index { get; set; } public string[] Comments { get; set; } public List<BsonDocument> Highlights { get; set; } public float Score { get; set; } [ ] public SearchScoreDetails ScoreDetails { get; set; } [ ] public SearchScoreDetails SearchScoreDetails { get; set; } [ ] public string PaginationToken { get; set; } [ ] public float[] PlotEmbedding { get; set; } }
참고
파스칼 케이스용 ConventionPack
이 페이지의 C# 클래스는 속성 이름에 파스칼식 대소문자를 사용하지만 MongoDB 컬렉션 의 필드 이름은 카멜식 대소문자를 사용합니다. 이러한 차이를 해소하기 위해 애플리케이션 시작될 때 다음 코드를 사용하여 ConventionPack
를 등록할 수 있습니다.
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
.NET/ C# 운전자 사용하여 텍스트 검색 점수를 포함하려면 프로젝션 빌더에서 MetaTextScore() 메서드를 호출합니다.
먼저 다음 코드를 실행 Title
필드 에 텍스트 인덱스 만듭니다.
var indexModel = new CreateIndexModel<Movie>( Builders<Movie>.IndexKeys.Text(m => m.Title)); movieCollection.Indexes.CreateOne(indexModel);
그런 다음 애플리케이션 에 다음 코드를 추가합니다. 이 코드는 "future"
라는 텀 에 대한 텍스트 검색 수행하고 MetaTextScore()
메서드를 사용하여 일치하는 각 문서 에 할당된 점수를 포함합니다. 그런 다음 코드는 텍스트 점수를 기준으로 결과를 내림차순으로 정렬하고 점수가 가장 높은 문서 반환합니다.
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .MetaTextScore(m => m.Score); var result = movieCollection.Find(filter) .Sort(Builders<Movie>.Sort.MetaTextScore("score")) .Project(projection) .FirstOrDefault();
이전 작업은 다음 문서 반환합니다.
{ "_id": { "$oid": "573a1398f29313caabceb500" }, "plot": "After visiting 2015, Marty McFly must repeat his visit to 1955 to prevent disastrous changes to 1985... without interfering with his first trip.", "title": "Back to the Future Part II", "score": 1.59375 }