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

setQuerySettings

이 페이지의 내용

  • 정의
  • 구문
  • 명령 필드
  • 예제
  • 자세히 알아보기
setQuerySettings

버전 8.0에 추가 되었습니다.

쿼리 설정을 사용하여 인덱스 힌트를 추가하고, 작업 거부 필터 를 정의하고, 기타 필드를 설정하다 수 있습니다. 설정은 전체 클러스터 의 쿼리 형태 에 적용 됩니다. 클러스터 는 종료 후에도 설정을 유지합니다.

예를 들어 쿼리 설정을 통해 클러스터에서 쿼리 형태의 모든 실행에 인덱스를 사용할 수 있습니다.

쿼리 옵티마이저는 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용하며, 이는 쿼리를 실행하기 위해 선택한 계획에 영향을 줍니다.

setQuerySettings find, distinctaggregate 명령에서 사용하는 쿼리 설정을 정의합니다.

MongoDB 8 부터 시작.0, 인덱스 필터 대신 쿼리 설정을 사용합니다. 인덱스 필터는 MongoDB 8 부터 더 이상 사용되지 않습니다.0.

쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있습니다. 또한 인덱스 필터는 영구적이지 않으며 모든 클러스터 노드에 대한 인덱스 필터를 쉽게 만들 수 없습니다.

참고

쿼리 설정을 제거하려면 removeQuerySettings 를 사용합니다. 쿼리 설정을 가져오려면 집계 파이프라인에서 $querySettings 단계를 사용합니다.

이 섹션에 표시된 두 가지 구문 사양 중 하나를 사용하여 쿼리 설정을 추가하거나 업데이트할 수 있습니다.

다음 구문에서는 다음을 제공합니다.

  • find, distinct 또는 aggregate 명령과 동일한 필드입니다. setQuerySettings 에 포함할 수 있는 필드에 대한 명령은 페이지의 구문 섹션을 참조하세요.

  • 쿼리 설정에 대한 데이터베이스를 지정하는 $db 필드입니다.

  • indexHints 및 기타 필드가 있는 settings 문서입니다.

db.adminCommand( {
setQuerySettings: {
<fields>, // Provide fields for
// find, distinct, or aggregate command
$db: <string> // Provide a database name
},
// Provide a settings document with indexHints and other fields
settings: {
indexHints: [ {
ns: { db: <string>, coll: <string> },
allowedIndexes: <array>
}, ... ],
queryFramework: <string>,
reject: <boolean>
}
} )

setQuerySettings 에 기존 쿼리 형태 해시 문자열을 제공하고 indexHints 및 기타 필드가 있는 업데이트된 settings 문서를 제공할 수 있습니다.

db.adminCommand( {
setQuerySettings: <string>, // Provide an existing query shape hash string
// Provide a settings document with indexHints and other fields
settings: {
indexHints: [ {
ns: { db: <string>, coll: <string> },
allowedIndexes: <array>
}, ... ],
queryFramework: <string>,
reject: <boolean>
}
} )

쿼리 형태 해시는 쿼리 형태를 고유하게 식별하는 문자열입니다. 쿼리 형태 해시의 예는 "F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C" 입니다.

쿼리 형태 해시 문자열을 얻으려면 다음 중 하나를 수행합니다.

해시 문자열을 사용하여 쿼리 설정을 지정하면 $querySettings 애그리게이션 단계 출력에 representativeQuery 필드가 표시되지 않습니다.

두 구문 변형 모두에서 indexHints 문서의 배열을 제공할 수 있습니다. indexHints 문서를 하나만 제공하는 경우 배열 괄호를 생략할 수 있습니다.

이 명령은 이러한 필드를 사용합니다.

필드
필드 유형(문서, 문자열, ...)
필요성
설명
setQuerySettings
문서 또는 문자열‎
필수 사항

다음 중 하나를 제공할 수 있습니다.

  • find, distinct 또는 aggregate 명령의 필드와 동일한 필드 및 원래 명령과 연결된 데이터베이스가 있는 $db 필드입니다.

  • 쿼리 형태를 고유하게 식별하는 기존 쿼리 형태 해시 문자열입니다. 쿼리 형태 해시의 예는 "F42757F1AEB68B4C5A6DE6182B29B01947C829C926BCC01226BDA4DDE799766C"` 입니다.

indexHints.ns
문서
옵션

인덱스 힌트를 위한 네임스페이스입니다. 선택적 인덱스 힌트가 지정된 경우에만 필요합니다.

db
문자열
필수 사항
인덱스 힌트에 대한 데이터베이스의 이름입니다.
coll
문자열
필수 사항
인덱스 힌트에 대한 컬렉션의 이름입니다.
indexHints.allowedIndexes
배열
옵션

인덱스 힌트에 대한 인덱스 배열입니다. 인덱스 힌트는 다음 중 하나일 수 있습니다.

  • 인덱스 이름

  • 인덱스 키 패턴

  • $natural hint

자세한 내용은 인덱스hint() 를 참조하세요.

queryFramework
문자열
옵션

쿼리 프레임워크 문자열을 다음과 같이 설정할 수 있습니다.

reject
부울
옵션

true인 경우:

  • 쿼리 형태가 일치하는 새 쿼리는 거부되며 쿼리 응답 상태에서 쿼리가 거부되었습니다.

  • 현재 진행 중인 쿼리는 거부되지 않습니다.

기본값은 false입니다.

쿼리 형태를 활성화하려면 쿼리 형태에 대해 setQuerySettings 를 다시 실행하고 rejectfalse 로 설정합니다. rejecttrue 로 설정한 다음 setQuerySettings 을 사용하여 false 로 다시 설정하면 다음과 같습니다.

  • settings 문서가 비어 있지 않은 경우 setQuerySettings 는 쿼리 형태를 활성화합니다.

  • settings 문서에 reject: false 만 포함된 경우 setQuerySettings 는 오류를 반환합니다. 대신 removeQuerySettings 명령을 사용하여 설정을 제거한 다음 setQuerySettings 를 사용하여 쿼리 설정을 추가합니다.

다음 예제에서는 컬렉션을 만들고 다양한 명령에 대한 쿼리 설정을 추가합니다. 이 예제에서는 클러스터에서 실행되는 쿼리 형태의 모든 실행에 하나의 인덱스를 사용합니다.

1

실행:

// Create pizzaOrders collection
db.pizzaOrders.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 19,
totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) },
{ _id: 1, type: "pepperoni", size: "medium", price: 20,
totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) },
{ _id: 2, type: "pepperoni", size: "large", price: 21,
totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) },
{ _id: 3, type: "cheese", size: "small", price: 12,
totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) },
{ _id: 4, type: "cheese", size: "medium", price: 13,
totalNumber: 50, orderDate: ISODate( "2024-01-12T21:23:13.331Z" ) },
{ _id: 5, type: "cheese", size: "large", price: 14,
totalNumber: 10, orderDate: ISODate( "2024-01-12T05:08:13Z" ) },
{ _id: 6, type: "vegan", size: "small", price: 17,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:08:13Z" ) },
{ _id: 7, type: "vegan", size: "medium", price: 18,
totalNumber: 10, orderDate: ISODate( "2023-01-13T05:10:13Z" ) }
] )
// Create ascending index on orderDate field
db.pizzaOrders.createIndex( { orderDate: 1 } )
// Create ascending index on totalNumber field
db.pizzaOrders.createIndex( { totalNumber: 1 } )

인덱스의 기본 이름은 orderDate_1totalNumber_1 입니다.

2

다음 예에서는 find 명령에 대한 쿼리 설정을 추가합니다. 이 예제에서는 find 명령에 대한 setQuerySettings 필드를 제공하고 allowedIndexesorderDate_1 인덱스를 포함합니다.

db.adminCommand( {
setQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "orderDate_1" ]
},
queryFramework: "classic"
}
} )
3

explain 명령을 실행합니다.

db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate(
"2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 } )

다음과 같은 잘린 출력은 쿼리 설정이 설정된 것을 보여줍니다.

queryPlanner: {
winningPlan: {
stage: 'SINGLE_SHARD',
shards: [
{
explainVersion: '1',
...
namespace: 'test.pizzaOrders',
indexFilterSet: false,
parsedQuery: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
querySettings: {
indexHints: {
ns: { db: 'test', coll: 'pizzaOrders' },
allowedIndexes: [ 'orderDate_1' ]
},
queryFramework: 'classic'
},
...
}
...
]
}
}
4

다음 예제에서는 쿼리를 실행합니다.

db.pizzaOrders.find(
{ orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).sort( { totalNumber: 1 }
)

쿼리 옵티마이저는 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용하며, 이는 쿼리를 실행하기 위해 선택한 계획에 영향을 줍니다.

쿼리 출력:

[
{
_id: 0,
type: 'pepperoni',
size: 'small',
price: 19,
totalNumber: 10,
orderDate: ISODate('2023-03-13T08:14:30.000Z')
},
{
_id: 5,
type: 'cheese',
size: 'large',
price: 14,
totalNumber: 10,
orderDate: ISODate('2024-01-12T05:08:13.000Z')
},
{
_id: 3,
type: 'cheese',
size: 'small',
price: 12,
totalNumber: 15,
orderDate: ISODate('2023-03-13T11:21:39.736Z')
},
{
_id: 1,
type: 'pepperoni',
size: 'medium',
price: 20,
totalNumber: 20,
orderDate: ISODate('2023-03-13T09:13:24.000Z')
},
{
_id: 2,
type: 'pepperoni',
size: 'large',
price: 21,
totalNumber: 30,
orderDate: ISODate('2023-03-17T09:22:12.000Z')
},
{
_id: 4,
type: 'cheese',
size: 'medium',
price: 13,
totalNumber: 50,
orderDate: ISODate('2024-01-12T21:23:13.331Z')
}
]
5

다음 예제에서는 집계 파이프라인의 $querySettings 단계를 사용하여 쿼리 설정을 가져옵니다.

db.aggregate( [
{ $querySettings: {} }
] )

queryShapeHash 필드를 포함하는 잘린 출력:

[
{
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1',
settings: {
indexHints: [
{
ns: { db: 'test', coll: 'pizzaOrders' },
allowedIndexes: [ 'orderDate_1' ]
}
],
queryFramework: 'classic'
},
representativeQuery: {
find: 'pizzaOrders',
filter: { orderDate: { '$gt': ISODate('2023-01-20T00:00:00.000Z') } },
sort: { totalNumber: 1 },
'$db': 'test'
}
}
]
6

다음 예에서는 distinct 명령에 대한 쿼리 설정을 추가합니다.

db.adminCommand( {
setQuerySettings: {
distinct: "pizzaOrders",
key: "totalNumber",
query: { type: "pepperoni"} ,
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "orderDate_1" ]
},
queryFramework: "classic"
}
} )
7

다음 예에서는 aggregate 명령에 대한 쿼리 설정을 추가합니다.

db.adminCommand( {
setQuerySettings: {
aggregate: "pizzaOrders",
pipeline: [
{ $match: { size: "medium" } },
{ $group: {
_id: "$type",
totalMediumPizzaOrdersGroupedByType: { $sum: "$totalNumber" }
} }
],
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "totalNumber_1" ]
},
queryFramework: "classic"
}
} )

돌아가기

setDefaultRWConcern