버전 8.0에서 변경되었습니다.
쿼리 형태 는 유사한 쿼리를 함께 그룹 하는 사양 설정하다 입니다. 사양에는 필터, 정렬, 프로젝션, 집계 파이프라인 단계, 네임스페이스 등이 포함될 수 있습니다. 사양이 유사한 쿼리는 쿼리 형태 가 동일합니다.
참고
MongoDB 8.0 부터 기존 쿼리 형태 의 이름이 계획 캐시 쿼리 형태 로 변경되고 queryHash 필드 의 이름이 planCacheShapeHash 변경됩니다. 계획 캐시 쿼리 형태를 구분하는 명령의 구성 요소는 계획 캐시 쿼리 형태 정의를 참조하세요. MongoDB 8.0 은(는) 이 페이지에 표시된 대로 새 쿼리 형태 와 기존 계획 캐시 쿼리 형태 를 사용합니다.
MongoDB 8.0 및 이전 버전에서 기존 계획 캐시 쿼리 형태 는 다음을 지원합니다.
MongoDB 8.0 부터 새로운 쿼리 형태 가 지원됩니다.
setQuerySettings를 사용하여 추가할 수 있는 쿼리 설정입니다. (이 페이지의 뒷부분에 나와 있듯이 쿼리 설정은 쿼리 형태 에 대한 인덱스와 실행 설정을 지정합니다.)계획 캐시 쿼리 형태 에서도 지원되는 필드 및 작업입니다. 예:
filter,sort및projection.기존 계획 캐시 쿼리 형태 형태보다 범위 쿼리 형태를 지원 하는
find,aggregation및distinct명령의 전체 구조입니다.작업 거부 필터 를 사용하여 지정된 쿼리 형태 를 가진
find,aggregation및distinct명령을 차단 합니다.전체 집계 파이프라인.
MongoDB 8.0 부터는 $querySettings 파이프라인 단계를 사용하여 각 쿼리 형태 에 지정된 쿼리 설정을 반환할 수 있습니다.
예시
다음 섹션에서는 다음 예시 pizzaOrders 컬렉션 에 대한 쿼리 형태가 포함된 예제를 보여줍니다.
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" ) } ] )
쿼리 형태 일치
다음 예시 쿼리 형태 는 기본값 test 데이터베이스 의 pizzaOrders 컬렉션 에 대한 find 명령의 사양을 보여줍니다.
find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test"
예시 필터하다 는 주문 날짜가 지정된 날짜보다 큰 문서로 문서를 제한합니다. 이 예시 에서는 주문한 총 피자 수를 오름차순으로 정렬합니다.
MongoDB 8.0 queryShapeHash 및 planCacheShapeHash 16진수 문자열을 보려면 explain 명령을 사용할 수 있습니다.
다음 explain 예제에는 동일한 쿼리 형태 를 가진 쿼리가 포함되어 있습니다.
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-05-10T05:15:35Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-02-05T07:07:16Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-03-08T08:12:25Z" ) } } ). sort( { totalNumber: 1 } )
쿼리 형태가 동일하기 때문에 explain 출력은 각 예제에 대해 동일한 queryShapeHash 와 각 예제에 대해 동일한 planCacheShapeHash 를 갖습니다. 예를 예시 다음과 같습니다.
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1' planCacheShapeHash: '48E51110'
다양한 쿼리 형태
쿼리 의 사양이 다른 경우 쿼리 의 형태도 달라집니다. 예를 예시 쿼리 에 다른 필터하다, 정렬, 프로젝션, 네임스페이스 또는 집계 파이프라인 단계 가 있는 경우입니다.
이전 섹션의 예시 에서는 totalNumber 필드 예시 기준으로 정렬합니다. 쿼리 정렬을 totalNumber 에서 다른 필드 로 변경하면 쿼리의 쿼리 쿼리 형태 가 달라집니다.
예를 예시 피자 price 를 기준으로 정렬하면 쿼리 형태 가 변경됩니다.
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ). sort( { price: 1 } )
쿼리 형태 가 이전 섹션의 형태와 다르기 때문에 explain 출력은 이전 예시 와 다른 queryShapeHash 및 다른 planCacheShapeHash 을 갖습니다. 예를 예시 다음과 같습니다.
queryShapeHash: 'AC1ECADBE8F1EB0F417A30741AB4813BE7E0BFEF523B0870CA11FCBC87F1A8B2' planCacheShapeHash: '31A52130'
행동
MongoDB 8.0 부터 컬렉션에 대한 인덱스 필터 대신 쿼리 형태에 대한 쿼리 설정을 추가합니다. 인덱스 필터는 MongoDB 8.0 부터 더 이상 사용되지 않습니다. 쿼리 설정에는 인덱스 필터보다 더 많은 기능이 있으며 인덱스 필터는 클러스터 종료 후에 지속되지 않습니다.
쿼리 설정을 사용하면 클러스터 내 쿼리 형태 의 모든 실행에 인덱스 를 사용할 수 있습니다. 또한 작업으로 인해 과도한 클러스터 워크로드 가 발생하지 않도록 작업 거부 필터하다 를 사용하여 쿼리 형태 와 관련된 모든 작업을 거부할 수 있습니다.
쿼리 옵티마이저 쿼리 계획 중에 쿼리 설정을 추가 입력으로 사용합니다. 쿼리 설정은 쿼리 형태 가 일치하는 쿼리 를 실행 하기 위해 선택한 계획에 영향을 줍니다.
쿼리 형태 해시 안정성
MongoDB derives the queryShapeHash from the query shape itself, not from the deployment that runs the query. In current supported versions, the same query shape is expected to produce the same queryShapeHash:
배포서버 의 모든 노드 에서 .
복제본 세트 및 샤딩된 클러스터
클러스터, MongoDB 버전 전체 또는 마이그레이션 후에도 해시를 재사용하기 전에 해시가 여전히 일치하는지 확인하세요.
배포서버 의 모든 노드 에 있는 쿼리 형태 에 동일한 쿼리 설정을 적용 할 수 있습니다. 복제본 세트 에서 샤딩된 클러스터 로 또는 다른 클러스터 로 마이그레이션 후 쿼리 형태 해시로 지정한 쿼리 설정을 사용하기 전에 해시가 대상 배포서버 에서 여전히 일치하는지 확인합니다.
시작하기
쿼리 형태 에 대한 쿼리 설정을 추가하려면
setQuerySettings를 사용합니다.쿼리 설정을 삭제 하려면
removeQuerySettings를 사용합니다.쿼리 설정을 조회 하려면 집계 파이프라인 에서
$querySettings단계를 사용합니다.쿼리 형태 를 차단 하려면 작업 거부 필터하다 를 사용합니다.