Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$meta

이 페이지의 내용

  • 정의
  • 행동
  • 예시
$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" (MongoDB 7.0.5 및 6.0.13부터 사용 가능)

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

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

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

    참고

    $text 이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas 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" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" },
{ "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" },
{ "item" : "abc", "price" : NumberDecimal("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" : NumberDecimal("12"),
"quantity" : 2,
"type" : "apparel",
"idxKey" : { "type" : "apparel", "item" : "abc" }
}
{
"_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"),
"item" : "abc",
"price" : NumberDecimal("10"),
"quantity" : 5,
"type" : "apparel",
"idxKey" : { "type" : "apparel", "item" : "abc" }
}

인덱스를 사용하지 않으면 { $meta: "indexKey" }가 아무 것도 반환하지 않습니다.

예를 들어, price 필드에 일치 조건을 지원하는 인덱스가 없다면 다음 작업에서는 인덱스를 사용하지 않습니다.

db.orders.aggregate(
[
{ $match: { price: { $gte: NumberDecimal("10") } } },
{ $addFields: { idxKey: { $meta: "indexKey" } } }
]
)

예를 들어, price 필드에 일치 조건을 지원하는 인덱스가 없다면 다음 작업에서는 인덱스를 사용하지 않습니다.

db.orders.find(
{ price: { $gte: NumberDecimal("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"
}

돌아가기

$mergeObjects

이 페이지의 내용