Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

$meta (표현식 연산자)

$meta

문서와 관련된 메타데이터를 반환합니다(예: 텍스트 검색 시 "textScore").

$meta 표현식의 구문은 다음과 같습니다.

{ $meta: <metaDataKeyword> }

$meta 표현식은 다음 값을 <metaDataKeyword>로 지정할 수 있습니다.

Keyword
설명

"textScore"

일치하는 각 문서에 대한 해당 $text 쿼리와 연결된 점수를 반환합니다. 텍스트 점수는 문서가 검색어 또는 텀과 얼마나 일치하는지를 나타냅니다.

{ $meta: "textScore" }$text 쿼리와 함께 사용해야 합니다.

이전 버전에서는 $text 쿼리와 함께 사용되지 않으면 null 점수를 반환합니다.

"indexKey"

텍스트가 아닌 인덱스를 사용하면 문서의 인덱스 키를 반환합니다. { $meta: "indexKey" } 표현식은 디버깅 목적으로만 사용되고 애플리케이션 로직에는 사용되지 않으며 cursor.returnKey()보다 선호됩니다.

MongoDB Search는 다음과 같은 추가 $meta 키워드를 제공합니다.

자세한 내용은 MongoDB Search 문서를 참조하세요.

중요

다음 $meta 키워드는 Stable API V1에서 지원되지 않습니다.

  • "textScore"

  • "indexKey"

  • "score"

  • "searchScore"

  • "scoreDetails"

  • "searchHighlights"

  • "searchSequenceToken"

  • "searchScoreDetails"

  • "vectorSearchScore"

다음 기능도 있습니다.

  • searchScore $search 쿼리에서만 사용 가능.

  • vectorSearchScore $vectorSearch 쿼리에서만 사용 가능.

다른 쿼리에서 searchScorevectorSearchScore를 사용하면 MongoDB는 경고를 로그합니다.

  • { $meta: "textScore" } 표현식은 $text와 함께 사용해야 합니다. 예시:

    • 집계에서 앞으로의 단계에서 { $meta: "textScore" } 표현식을 사용하려면 파이프라인에 $text 쿼리가 있는 $match 단계를 반드시 지정합니다. $match 단계에서 $text 쿼리를 지정하지 않으면 작업이 실패합니다.

    • 찾기에서 { $meta: "textScore" }를 사용하려면 쿼리 조건에 $text 연산자를 지정해야 합니다. 쿼리 조건에 $text 연산자를 지정하지 않으면 작업이 실패합니다.

    참고

    $text 자체 관리(비Atlas) 배포를 위한 텍스트 쿼리 기능을 제공합니다. MongoDB 에서 호스팅되는 데이터의 경우, MongoDB 향상된 전체 텍스트 쿼리 솔루션인 MongoDB Search.도 제공합니다.

  • 집계에서 { $meta: "textScore" } 표현식은 $project, $group $sort 등과 같은 집계 표현식을 허용하는 다양한 단계에 포함될 수 있습니다.

  • 찾기에서 { $meta: "textScore" } 표현식은 프로젝션sort()에 포함될 수 있습니다.

  • { $meta: "textScore" } 표현식은 텍스트 점수 메타데이터를 포함하는 프로젝션 문서에 포함될 수 있습니다.

  • $meta 표현식은 포함 또는 제외 프로젝션에 모두 포함될 수 있습니다.

  • 표현식을 문서에 이미 있는 필드 이름으로 설정하면 프로젝션된 메타데이터 값이 기존 값을 덮어씁니다.

  • 집계에서 텍스트 점수 값을 포함한 필드를 출력하는 단계를 따른 후, 후속 단계에서 쿼리 조건을 지정하거나 해당 필드에 대해 작업을 수행할 수 있습니다. 예를 들어 집계 파이프라인의 $text를 참조합니다.

  • 찾기에서는 텍스트 점수에 쿼리 조건을 지정할 수 없습니다. 대신 집계를 사용하세요.

  • { $meta: "textScore" } 표현식을 정렬 작업의 일부로 사용하여 텍스트 점수 메타데이터를 기준으로 정렬할 수 있습니다. 즉,

    • 집계에서는 $sort 단계입니다.

    • 찾기의 경우, sort() 메서드

  • "textScore" 메타데이터는 내림차순으로 정렬됩니다.

  • 정렬 작업에 사용하려면 { $meta: "textScore" } 표현식을 임의 필드 이름으로 설정합니다. 필드 이름은 쿼리 시스템에서 무시됩니다.

  • 집계에서는 textScore를 프로젝션하지 않고도 결과 문서를 { $meta: "textScore" }별로 정렬할 수 있습니다.

  • 찾기에서는 textScore를 프로젝션할 필요 없이 결과 문서를 { $meta: "textScore" } 별로 정렬할 수 있습니다.

  • 집계에서 프로젝션과 정렬 모두에 { $meta: "textScore" } 표현식을 포함하면 프로젝션과 정렬에서 표현식에 대해 서로 다른 필드 이름을 가질 수 있습니다. 정렬의 필드 이름은 쿼리 시스템에서 무시됩니다.

  • 찾기에서 프로젝션과 정렬 모두에 { $meta: "textScore" } 표현식을 포함하면 프로젝션과 정렬에서 표현식에 대해 서로 다른 필드 이름을 가질 수 있습니다. 정렬의 필드 이름은 쿼리 시스템에서 무시됩니다.

  • { $meta: "indexKey" } 표현식은 디버깅 목적으로만 사용되며 애플리케이션 로직용으로는 사용할 수 없습니다.

  • cursor.returnKey()보다 { $meta: "indexKey" } 표현식을 사용하는 것이 좋습니다.

  • 집계에서 { $meta: "indexKey" } 표현식은 $project, $group $sortByCount 등과 같은 집계 표현식을 허용하는 다양한 단계에 포함될 수 있지만 $sort은(는) 포함되지 않습니다. 그러나 집계 파이프라인을 사용하면 먼저 { $meta: "indexKey" } 표현식(예: $project, $addFields 등)을 프로젝트한 다음 후속 $sort 단계에서 해당 필드를 기준으로 정렬할 수 있습니다.

  • 찾기에서 { $meta: "indexKey" } 표현식은 프로젝션 문서의 일부로만 사용할 수 있습니다.

  • 반환되는 값은 데이터베이스가 인덱스의 값을 나타내기로 결정하는 방법에 따라 달라지며 버전에 따라 변경될 수 있습니다. 표시된 값은 필드의 실제 값이 아닐 수 있습니다.

  • 반환되는 값은 시스템에서 선택한 실행 계획에 따라 달라집니다. 예를 들어 쿼리에 답변하는 데 사용할 수 있는 인덱스가 두 개 있는 경우 'indexKey' 메타데이터의 값은 선택한 인덱스에 따라 달라집니다.

  • 인덱스를 사용하지 않으면 { $meta: "indexKey" } 표현식은 값을 반환하지 않으며 필드가 출력의 일부로 포함되지 않습니다.

다음 문서로 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" } 표현식은 디버깅 목적으로만 사용되며 애플리케이션 로직에는 사용되지 않습니다. 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" }
])

typeitem 필드에 다음 복합 인덱스를 생성합니다.

db.orders.createIndex( { type: 1, item: 1 } )

다음 집계 작업은 type(이)가 apparel(과)와 같은 모든 문서를 찾고 인덱스가 사용된 경우 일치하는 문서의 인덱스 키 값을 포함하기 위해 $meta 연산자를 사용합니다.

db.orders.aggregate(
[
{ $match: { type: "apparel" } },
{ $addFields: { idxKey: { $meta: "indexKey" } } }
]
)

다음 작업은 typeapparel과 같은 모든 문서를 찾고 인덱스가 사용된 경우 일치하는 문서의 인덱스 키 값을 포함하기 위해 $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; }
[BsonElement("lastupdated")]
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; }
[BsonElement("scoreDetails")]
public SearchScoreDetails ScoreDetails { get; set; }
[BsonElement("searchScoreDetails")]
public SearchScoreDetails SearchScoreDetails { get; set; }
[BsonElement("paginationToken")]
public string PaginationToken { get; set; }
[BsonElement("plot_embedding")]
public float[] PlotEmbedding { get; set; }
}

참고

Pascal Case를 위한 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
}

돌아가기

$maxN-array-element

이 페이지의 내용