이 페이지에서는 이전 버전의 MongoDB 와의 호환성에 영향을 줄 수 있는 MongoDB 9.0 에 도입된 변경 사항에 대해 설명합니다.
지원 중단
더 이상 사용되지 않습니다. | 설명 |
|---|---|
| MongoDB 9.0부터 |
| MongoDB 9.0의 암호화됨 필드에 대한 하위 문자열 쿼리의 내부 제한을 재정의할 수 없습니다. |
집계
빈 필드 이름 $group
MongoDB 9.0부터는 축적자 표현식 빈 필드 이름이 있는 경우 $group 단계에서 오류를 반환합니다. 자세한 내용은 빈 필드 이름 $ 그룹 제한을 참조하세요.
allowPartialResults 집계 $queryStats 키에서
MongoDB 9.0부터 aggregate 명령의 $queryStats 키에 옵션이 명시적으로 설정하다 경우 allowPartialResults 옵션이 포함됩니다. 그러면 쿼리 통계로 allowPartialResults이 생략된 요청, 명시적으로 true 요청 또는 명시적으로 false 요청을 구분할 수 있습니다.
이 추가 사항은 allowPartialResults를 설정하다 aggregate 쿼리에 대한 key 및 keyHash 직렬화를 변경합니다. queryShapeHash는 변경되지 않습니다. keyHash에서 일치하는 다운스트림 소비자는 이러한 쿼리에 대해 다른 값을 관찰할 수 있습니다.
자세한 내용은 집계 명령 쿼리 형태 참조하세요.
쿼리 언어
배열을 탐색하는 점으로 구분된 경로에 대한 Null 비교
MongoDB 9.0부터 null이 아닌 값으로 해석되지 않는 점선 경로는 null로 평가됩니다. 새로운 동작은 경로의 필드 에 빈 배열, 스칼라 값 배열 또는 중첩된 배열 포함된 배열 있을 때 적용됩니다. 이전 버전에서는 이러한 경로가 null로 평가되지 않아 $exists와 일치하지 않는 결과가 생성되었습니다.
다음 문서가 포함된 collection을 가정해 보겠습니다.
{ _id: 1, a: [ 1 ] } { _id: 2, a: [ ] }
a.b 경로는 어느 문서 에서도 null이 아닌 값으로 해석되지 않습니다. MongoDB 9.0부터 { "a.b": null } 쿼리 두 문서와 일치합니다. 이전 버전에서는 쿼리 어느 문서 와도 일치하지 않습니다. { "a.b": { $ne: null } } 쿼리 반대 결과를 반환합니다: MongoDB 9.0에서는 쿼리 어느 문서 와도 일치하지 않으며, 이전 버전에서는 둘 다 일치했습니다.
MongoDB 중첩된 배열로 이동하지 않으므로 배열 인 요소는 나머지 경로를 확인하지 않습니다. 다음 문서가 포함된 컬렉션 가정해 보겠습니다.
{ _id: 3, a: [ [ { b: 3 } ] ] } { _id: 4, a: [ [ { b: 2 } ], { b: 3 } ] }
Each b value in _id: 3 and the b value of 2 in _id: 4 sit inside a nested array, so the path a.b does not reach them. Starting in MongoDB 9.0, the { "a.b": null } query matches both documents, and the { "a.b": { $ne: null } } query matches neither. In earlier versions, the { "a.b": null } query matched neither document. The nested array causes _id: 4 to match { "a.b": null } even though its second element resolves a.b to the non-null value 3.
새로운 동작은 $eq, $ne, $in, $nin, $gte 및 $lte 연산자를 사용하는 null과의 비교에 영향을 줍니다.$lookup 단계의 동등성 매칭은 동일한 시맨틱을 따릅니다.
업그레이드 영향
MongoDB 9.0로 업그레이드 전에 점선 경로를 null와 비교하는 쿼리 및 $lookup 단계를 검토 . 경로의 필드 에 빈 배열, 스칼라 값의 배열 또는 중첩된 배열 이 포함된 배열 있는 경우 이러한 쿼리는 업그레이드 후 다른 결과 세트를 반환합니다. 점선 경로가 존재하고 null이 아닌 문서를 찾기 위해 { $ne: null }를 사용하는 쿼리는 더 적은 수의 문서를 반환하고, { $eq: null }를 사용하는 쿼리는 더 많은 문서를 반환합니다.
일반 변경 사항
인덱싱된 필드가 멀티키가 되면 쿼리 실패
MongoDB 9.0부터, 해당 필드 참조하는 쿼리 실행 동안 인덱싱된 필드 멀티키 필드 되면 쿼리 QueryKilledError와 함께 실패할 수 있습니다. 인덱스된 필드 문서 삽입하거나 업데이트 필드 에 배열 값을 포함할 때 멀티키가 됩니다.
이 오류와 함께 쿼리 실패하면 삽입 또는 업데이트 작업이 완료된 후 쿼리 다시 실행합니다.
투표 후 Change Streams에서 읽기 기본 설정 적용
MongoDB 9.0에서 primary 또는 secondary의 readPreference로 열린 변경 스트림 복제본 세트 인 경우 getMore에서 재개 가능한 오류 InterruptedDueToReplStateChange(오류 코드 11602)를 반환합니다. 투표 노드의 역할 변경하여 더 이상 읽기 설정 (read preference) 충족하지 않도록 합니다. 이전 버전에서는 커서 동일한 노드 의 결과를 계속 반환했습니다.
호환 드라이버 및 mongos는 마지막 재개 토큰에서 자동으로 재개됩니다. 수동 getMore 루프 및 mongosh는 resumeAfter로 재개되어야 합니다. 자세한 내용은 변경 스트림 재개를 참조하세요.
지리 공간적 인덱스 키-추출 오류 코드
MongoDB 9.0부터, 2dsphere 인덱스 키 추출 실패는 명명된 오류 코드 510(GeoKeyExtractionFailed) 및511(GeoKeyExtractionFailedTimeseries)를 반환합니다. 이 코드는 일반 2dsphere 인덱스의 이전 어설션 코드 16755 및 16756와 time series 컬렉션의 183934 및 183493을 대체합니다. 애플리케이션 이전 코드와 일치하는 경우 510 및 511와 일치하도록 업데이트 .
데이터베이스 간 컬렉션 잠금 강화 renameCollection
MongoDB 9.0부터 복제본 세트 의 서로 다른 데이터베이스 간에 컬렉션 이름을 변경하면 renameCollection 명령은 소스 및 대상 컬렉션에 대한 배타 락 유지합니다. 락 전체 작업 동안 지속되며 DDL 작업과 두 컬렉션에 대한 쓰기를 차단합니다. 대부분의 읽기 작업은 잠금 없는 읽기를 사용하며 차단되지 않습니다.
이전 버전에서는 renameCollection가 이름 변경을 완료하기 전에 소스 컬렉션의 락 해제했습니다. 해당 창 동안 소스 컬렉션 에 대한 동시 쓰기 (write) 손실될 수 있습니다.
변경 사항은 복제본 세트에만 영향을 줍니다. 샤드 클러스터는 이름 변경 기간 동안 이미 두 컬렉션을 모두 락 .
서버 측 JavaScript 날짜 작업에서 UTC 사용
MongoDB 9.0부터 서버 측 JavaScript mongod 호스팅하다 구역 관계없이 로컬 Date 작업을 UTC로 평가하는 WebAssembly(WASM) 기반 엔진 에서 실행됩니다. 이전 버전에서는 이러한 작업에서 호스팅하다 구역 준수했습니다. 변경 사항은$function,$accumulator,$where 및 mapReduce에서 실행되는 JavaScript 영향을 미칩니다.
저장된 BSON 날짜 값은 변경되지 않으며, Date.prototype.getTime(), Date.prototype.toISOString() 및 getUTC*() 메서드와 같은 UTC 연산도 변경되지 않습니다. 이 차이는 현지 시간 작업에 영향을 줍니다.
Date.prototype.toString()Date.prototype.toTimeString()Date.prototype.getHours()및 기타 로컬 게터로컬
Date생성자 및 설정자비교기 없이 호출된
Array.prototype.sort()를 포함하여 날짜를 암시적으로 문자열로 변환하는 작업
TZ=America/New_York로 실행되는 mongod에서 다음 작업을 고려합니다.
db.events.insertOne( { name: "before-opening", occurredAt: ISODate("2024-01-15T13:30:00Z") } ) db.events.find( { $expr: { $function: { body: function(date) { return date.getHours() < 9; }, args: [ "$occurredAt" ], lang: "js" } } } )
이전 버전에서는 뉴욕에서 13:30 UTC가 08:30이므로 getHours()는 8을 반환하고 쿼리 문서 와 일치합니다. MongoDB 9.0부터 getHours()는 13을 반환하며 쿼리 일치하지 않습니다. 저장된 날짜가 유효하게 유지되므로 두 버전 모두에서 작업이 성공하므로 차이가 오류로 보고되지 않습니다. 혼합 바이너리 버전을 실행 배포는 동일한 JavaScript 에 대해 다른 결과를 반환할 수 있습니다.
업그레이드 영향
MongoDB 9.0로 업그레이드 전에 $function, $accumulator, $where 및 mapReduce 코드의 로컬 Date 사용량 JavaScript 검토 ,mongod에 의존하지 않습니다. } 호스팅하다 구역 시간대 .
명명된 구역 의 날짜를 평가하려면 JavaScript 대신 명시적 timezone 인수와 함께 집계 날짜 연산자 사용합니다. 다음 쿼리 모든 버전에서 동일한 결과를 반환합니다.
db.events.find( { $expr: { $lt: [ { $hour: { date: "$occurredAt", timezone: "America/New_York" } }, 9 ] } } )
결정론적 비교 또는 직렬화가 필요한 JavaScript 의 경우, 로컬 Date 메서드나 암시적 문자열 변환 대신 getTime(), toISOString() 또는 getUTC*() 메서드를 사용합니다. 정렬된 값에 날짜가 포함될 수 있는 경우 명시적 비교기를 Array.prototype.sort()에 전달합니다.
다음에서 서버 측 JavaScript 사용할 수 없습니다. ppc64le
MongoDB 9.0부터 서버 측 JavaScript ppc64le 아키텍처에서 사용할 수 없습니다. ppc64le의 mongod 및 mongos 바이너리에는 JavaScript 엔진 포함되어 있지 않습니다. 결과적으로 해당 아키텍처에서는 $function, $accumulator,$where 및 mapReduce 작업이 실패합니다. 이전 버전은 ppc64le에서 이러한 작업을 실행했습니다.
구성 파일 설정 또는 명령줄 옵션으로 ppc64le에서 서버 측 JavaScript 활성화 할 수 없습니다.
업그레이드 영향
ppc64le 배포서버 MongoDB 9.0로 업그레이드 전에,$function, $accumulator, $where 또는 mapReduce를 사용하는 애플리케이션을 식별합니다. 서버 측 JavaScript 필요하지 않은 집계 파이프라인 단계 및 연산자를 사용하도록 이러한 작업을 다시 작성하세요. 다른 아키텍처를 사용하는 배포서버 에서도 작업을 실행 수 있습니다.
보안
Queryable Encryption 접두사, 접미사 및 하위 문자열을 GA 마이그레이션으로 공개 미리 보기
MongoDB 9.0은 Queryable Encryption 활성화된 컬렉션의 암호화됨 문자열 필드에 접두사, 접미사 및 하위 문자열 쿼리의 GA를 표시합니다. 정식 출시 기능 MongoDB 8.2에서 릴리스된 Public Preview 버전과 호환되지 않으며, 이제 기능 정식 출시되었으므로 사용하지 않아야 합니다.
To use prefix, suffix, or substring queries with Queryable Encryption, MongoDB must be version 9.0 or later, with 9.0 compatible drivers. If you are still using the Public Preview, MongoDB must remain on version 8.2 or 8.3, with 8.2 or 8.3 compatible drivers.
MongoDB 9.0 드라이버는 MongoDB 8.2 또는 8.3 드라이버로 생성된 데이터를 해독할 수 있습니다. 업그레이드 옵션은 다음 섹션을 참조하세요.
새로 시작(권장)
가능하면 공개 미리 보기 기능으로 만든 컬렉션을 마이그레이션하는 대신 새 컬렉션을 만듭니다.
MongoDB 서버 와 드라이버를 9.0로 업그레이드합니다.
이전 컬렉션과 다른 이름으로 암호화된 새 컬렉션을 구성합니다.
새 데이터를 삽입하거나 로컬 사본이 있는 경우 기존 데이터의 암호화되지 않은 버전을 삽입합니다.
이전 컬렉션 삭제합니다.
기존 데이터 마이그레이션
새 데이터를 사용할 수 없거나 기존 데이터의 암호화되지 않은 버전이 없는 경우:
MongoDB 서버 와 드라이버를 9로 업그레이드합니다.0
9.0 호환 운전자 사용하여 암호화됨 컬렉션 쿼리 해독합니다.
출력을 로컬에 저장합니다.
암호화된 새 컬렉션을 구성하고 데이터를 수집합니다.
경고
mongoexport및mongodump작업은 컬렉션 을 해독하지 않습니다. 해독된 데이터를 출력하려면 운전자 에서 컬렉션 쿼리 해야 합니다.MongoDB 9.0 호환 드라이버는 MongoDB 8.2용으로 암호화됨 데이터의 암호화됨 필드를 쿼리 할 수 없습니다. 공개 미리 보기 쿼리 유형. 데이터를 해독하려면 암호화되지 않은 필드 쿼리 하거나 전체 컬렉션 쿼리 .
이전 버전과 호환되지 않는 기능
다음 섹션에서는 배포서버 에서 이전 버전과 호환되지 않는 기능을 제거하기 위한 정보를 제공합니다. MongoDB 9.0 에서 이전 버전으로 다운그레이드하는 경우 다음 섹션을 검토 다운그레이드 후 배포서버 성공적으로 실행되는지 확인합니다.
뷰의 표현식
MongoDB 9.0에서$convert 객체 를 binData로 변환할 수 있습니다. 자세한 내용은 객체를 binData로 변환을 참조하세요.
이 변환을 사용하는 뷰를 만드는 경우 이전 버전으로 다운그레이드한 후 해당 뷰에 대한 쿼리에서 오류가 반환됩니다.
9.0에서 다운그레이드하기 전에 이 변환을 사용하는 모든 보기를 업데이트 하거나 삭제하세요.