MongoDB 4.4의 호환성 변경 사항
다음의 4.4 변경 사항은 MongoDB 이전 버전과 호환성에 영향을 줄 수 있습니다.
제거된 명령
MongoDB는 다음 명령과 mongo
셸 헬퍼를 제거합니다.
제거된 명령 | 제거된 도우미 | 대안 |
---|---|---|
cloneCollection | db.cloneCollection() |
|
planCacheListPlans | PlanCache.getPlansByQuery() |
See also $planCacheStats Changes. |
planCacheListQueryShapes | PlanCache.listQueryShapes() |
See also $planCacheStats Changes. |
제거된 매개변수
MongoDB는 다음 서버 매개변수를 제거합니다.
제거된 매개 변수 | 설명 |
---|---|
failIndexKeyTooLong | MongoDB 4.4는 failIndexKeyTooLong 매개 변수를 제거합니다. 이 매개변수는 4 에서 더 이상 사용되지 않습니다.2 를 featureCompatibilityVersion (fCV) 버전이 4 인 MongoDB로 변환합니다.2+ 더 이상 인덱스 키 크기 제한을 부과하지 않습니다. |
도구 변경 사항
커뮤니티 및 엔터프라이즈 에디션의 Windows MSI 설치 관리자에는 MongoDB Database Tools (mongoimport
, mongoexport
등)가 포함되어 있지 않습니다. Windows용 MongoDB Database Tools를 다운로드하고 설치하려면 MongoDB Database Tools 설치하기를 참조하세요.
MongoDB 4.2 또는 이전 MSI 설치 관리자를 사용하여 Database Tools를 MongoDB 서버와 함께 설치했다면 이제 Database Tools를 별도로 다운로드해야 합니다.
복제본 세트
롤백 디렉토리
Mongo 4.4부터 컬렉션의 롤백 디렉터리 이름은 컬렉션 네임스페이스가 아닌 컬렉션의 UUID를 따라 지정됩니다.
<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson
자세한 내용은 데이터 롤백을 참조하세요.
replSetGetStatus
출력 필드 변경 사항
replSetGetStatus
명령과 해당 mongo
쉘 도우미인 rs.status()
는 출력에서 더 이상 사용되지 않는 다음 필드를 제거합니다.
제거된 필드 | 대안 |
---|---|
replSetGetStatus.syncingTo | 대신 syncSourceHost 를 사용하세요. |
members[n].syncingTo | 대신 members[n].syncSourceHost 를 사용하세요. |
복제본 구성 문서 변경 사항
MongoDB 4.4는 복제본 세트 구성 문서에 term
필드를 추가합니다. 복제본 세트 멤버는 term
및 version
을 사용하여 '최신' 복제본 구성에 관한 합의를 도출합니다. featureCompatibilityVersion(fCV) 설정: "4.4" 는 암시적으로 replSetReconfig
를 수행하여 구성 문서에 term
필드를 추가하고 새 구성이 대다수의 복제본 세트 멤버에게 전파될 때까지 차단합니다. 마찬가지로 fCV : "4.2"
로 다운그레이드하면 term
필드를 제거하기 위한 재구성이 암시적으로 수행됩니다.
작업에 대한 초기 동기화 제한
복제본 세트 멤버에서 실행하려면 다음 작업 시 멤버가 PRIMARY
또는 SECONDARY
상태에 포함되어 있어야 합니다.
멤버가 STARTUP2
와 같은 다른 상태에 있으면 작업 오류가 발생합니다.
사용자 지정 값이 더 이상 사용되지 않음 getLastErrorDefaults
버전 4.4부터 MongoDB는 기본값인 { w: 1, wtimeout: 0 }
이외의 settings.getLastErrorDefaults
값 지정을 더 이상 사용하지 않습니다. MongoDB 4.4는 사용자가 지정한 쓰기 고려 값을 적용하지만 향후 MongoDB 버전에서는 기본값 이외의 값을 적용하지 않을 수 있습니다. 대신 setDefaultRWConcern
명령을 사용하여 복제본 세트 또는 샤드 클러스터에 대한 기본 읽기 또는 쓰기 고려 구성을 설정합니다.
프로젝션 호환성 변경 사항
필드를 새 값으로 설정
MongoDB 4.4부터 find 및 findAndModify()
프로젝션은 집계 표현식과 집계 구문을 허용할 수 있습니다.
리터럴 및 집계 변수 사용을 포함한 집계 표현식 및 구문을 사용하면 프로젝션 필드 값에 리터럴(숫자 또는 부울 제외) 지정이 가능합니다. 그러면 필드가 새 값으로 프로젝션 됩니다.
예를 들어 status
필드가 포함된 문서가 있는 컬렉션 인벤토리를 고려합니다.
db.inventory.insertOne( { _id: 1, item: "postcard", status: "A", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] })
MongoDB 4.4부터 다음 연산은 status
및 instock
필드를 현재 값 대신 새 값으로 투영합니다.
db.inventory.find( { status: "A" }, { status: "Active", instock: ["blue", "crimson"] } )
즉, 이 작업은 다음 문서를 반환합니다.
{ "_id" : 1, "status" : "Active", "instock" : [ "blue", "crimson" ] }
이전 버전에서는 모든 사양 값(0/false 값 또는 이전에 지원되지 않는 문서 값 제외)이 true
로 처리되어 현재 값에 필드가 포함되었음을 나타냅니다. 즉, 이전 버전에서는 이전 작업이 status
및 instock
필드가 포함된 문서를 현재 값과 함께 반환합니다.
{ "_id" : 1, "status" : "A", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }
$elemMatch
프로젝션 필드 순서
문서의 필드 순서에 관계없이 기존 필드의 $elemMatch
프로젝션은 다른 기존 필드 포함 뒤에 해당 필드를 반환합니다.
예를 들어 players
다음 문서가 있는 컬렉션을 생각해 보겠습니다.
db.players.insertOne( { name: "player1", games: [ { game: "abc", score: 8 }, { game: "xyz", score: 5 } ], joined: new Date("2020-01-01"), lastLogin: new Date("2020-05-01") } )
다음 프로젝션은 문서에서 해당 필드가 joined
및 lastLogin
필드 앞에 나열되어 있더라도 투영에 포함된 다른 기존 필드 다음에 games
필드를 반환합니다.
db.players.find( {}, { games: { $elemMatch: { score: { $gt: 5 } } }, joined: 1, lastLogin: 1 } )
즉, 이 작업은 다음 문서를 반환합니다.
{ "_id" : ObjectId("5edef64a1c099fff6b033977"), "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z"), "games" : [ { "game" : "abc", "score" : 8 } ] }
$slice
임베디드 배열
중첩 문서에서 배열의 $slice
프로젝션이 포함된 프로젝션의 일부인 경우 중첩 문서의 다른 필드를 더 이상 반환하지 않습니다.
예를 들어,inventory
size
필드가 포함된 문서가 있는 collection을 고려해 보십시오.
{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }
다음 작업은 colors
배열의 지정된 슬라이스만으로 _id
필드(기본값), qty
필드 및 details
필드를 프로젝션합니다.
db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )
즉, 이 작업은 다음 문서를 반환합니다.
{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }
$slice
프로젝션이 제외 프로젝션의 일부인 경우 작업은 중첩된 문서의 다른 필드를 계속 반환합니다. 즉, 다음의 프로젝션은 제외 프로젝션입니다. 프로젝션은 _id
필드 및 지정된 슬라이스 외부에 있는 colors
배열의 요소를 제외하고 다른 모든 필드를 반환합니다.
db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }
$slice
프로젝션 자체는 제외로 간주됩니다.
이전 버전에서는 $slice
프로젝션이 포함인지 제외인지에 관계없이 중첩된 문서의 다른 필드도 프로젝션에 포함되었습니다.
경로 콜리전 제한(Path Collision Restrictions)
경로 충돌: 내장된 문서 및 해당 필드
내장된 문서의 필드와 함께 내장된 문서를 프로젝션할 수 없습니다.
예를 들어,inventory
size
필드가 포함된 문서가 있는 collection을 고려해 보십시오.
{ ..., size: { h: 10, w: 15.25, uom: "cm" }, ... }
다음 작업은 size
문서와 size.uom
필드를 모두 프로젝트하려고 하기 때문에 실패하며 Path collision
오류를 반환합니다.
db.inventory.find( {}, { size: 1, "size.uom": 1 } )
이전 버전에서는 내장된 문서와 해당 필드 사이의 마지막 프로젝션이 프로젝션을 결정합니다.
내장된 문서의 프로젝션이 해당 필드의 모든 프로젝션 다음에 오는 경우 MongoDB는 내장된 문서를 프로젝트합니다. 예를 들어 프로젝션 문서
{ "size.uom": 1, size: 1 }
은 프로젝션 문서{ size: 1 }
과 동일한 결과를 생성합니다.내장된 문서의 프로젝션이 해당 필드의 프로젝션보다 먼저 오면 MongoDB는 지정된 필드를 프로젝트합니다. 예를 들어 프로젝션 문서
{ "size.uom": 1, size: 1, "size.h": 1 }
은 프로젝션 문서{ "size.uom": 1, "size.h": 1 }
과 동일한 결과를 생성합니다.
경로 충돌: $slice
배열 및 포함된 필드의
find 및 findAndModify()
프로젝션은 배열의 $slice
및 배열에 포함된 필드를 모두 포함할 수 없습니다.
예를 들어 배열 필드 instock
이 포함된 collection inventory
을 생각해 보겠습니다.
{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }
Path
collision
오류와 함께 다음 작업이 실패합니다.
db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )
이전 버전에서 프로젝션은 두 프로젝션을 모두 적용하고 instock
배열의 첫 번째 요소($slice: 1
)를 반환하지만 프로젝션된 요소에서 warehouse
필드를 억제합니다. MongoDB 4.4부터는 동일한 결과를 얻으려면 $project
로 구성된 db.collection.aggregate()
메서드를 사용하십시오.
$
-접두사 필드 경로 제한
찾기 및 findAndModify()
프로젝션은 DBRef 필드를 제외하고 $
로 시작하는 필드를 프로젝션할 수 없습니다.
예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( {}, { "$instock.warehouse": 0, "$item": 0, "detail.$price": 1 } )
$
위치 연산자 배치 제한
$
프로젝션 연산자는 필드 경로 끝에만 나타날 수 있습니다(예: "field.$"
또는 "fieldA.fieldB.$"
).
예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( { }, { "instock.$.qty": 1 } )
이 문제를 해결하려면 $
투영 연산자 뒤에 오는 필드 경로의 구성요소를 제거합니다.
$
위치 $slice
연산자 및 제한
find 및 findAndModify()
프로젝션은 $
프로젝션 표현식의 일부로 $slice
프로젝션 표현식을 포함할 수 없습니다.
예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
이전 버전에서 MongoDB는 쿼리 조건과 일치하는 instock
배열의 첫 번째 요소 (instock.$
)를 반환합니다. 즉, 위치 프로젝션 "instock.$"
이(가) 우선하고 $slice:1
은(는) 작동하지 않습니다. "instock.$": {
$slice: 1 }
은(는) 다른 문서 필드를 제외하지 않습니다.
빈 필드 이름 프로젝션 제한
찾기 및 findAndModify()
프로젝션에는 빈 필드 이름의 프로젝션이 포함될 수 없습니다.
예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( { }, { "": 0 } )
이전 버전에서 MongoDB는 빈 필드의 포함/제외를 존재하지 않는 필드의 프로젝션과 동일하게 처리합니다.
텍스트 검색 메타데이터 {$meta: " TextScore "} 쿼리 요구 사항
MongoDB 4.4부터 프로젝션 또는 정렬에서 { $meta: "textScore" }
표현식을 사용하려면 db.collection.find()
작업의 쿼리 조건자에 $text
연산자를 지정해야 합니다. 예를 들면 다음과 같습니다.
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } ); db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } );
쿼리 조건자에 $text
연산자를 지정하지 않으면 작업이 실패합니다. 예를 들어, 다음 작업은 MongoDB 4 부터 유효하지 않습니다.4:
db.articles.find( { }, { score: { $meta: "textScore" } } ) db.articles.find( { }, { score: { $meta: "textScore" } } ).sort( { score: { $meta: "textScore" } } );
$sort
변경 사항
MongoDB 4.4부터 sort()
메서드는 이제 $sort
집계 단계와 동일한 정렬 알고리즘을 사용합니다. 이번 변경으로 인해 중복 값이 포함된 필드에 대해 sort()
를 수행하는 쿼리는 해당 값에 대해 일관되지 않은 정렬 순서를 초래할 가능성이 훨씬 더 높습니다.
중복 값에 sort()
를 사용할 때 정렬 일관성을 보장하려면 정렬에 고유한 값만 포함하는 추가 필드를 포함하세요.
이 작업은 정렬에 _id
필드를 추가하면 쉽게 수행할 수 있습니다.
자세한 내용은 Sort Consistency(정렬 일관성)을(를) 참조하세요.
맵 리듀스 변경 사항
단일 값을 포함하는 키 줄이기
MongoDB 4.4부터 mapReduce
명령을 실행하면 연결된 키에 포함된 값의 수에 관계없이 reduce
함수를 호출합니다.
이전 버전에서 MongoDB는 단일 값이 있는 키에 대해 reduce
함수를 호출하지 않습니다.
자세한 내용은 사용법을 참조하세요.
맵 리듀스 출력 변경
MongoDB 4.4부터 mapReduce
는 출력에서 counts
필드를 제거합니다.
이전 버전에서는 명령 출력에 counts
필드가 포함되었습니다. 예를 들면 다음과 같습니다.
"counts" : { "input" : 4, "emit" : 4, "reduce" : 1, "output" : 2 },
맵 함수의 방출 제한
MongoDB 4.4부터 map
함수는 더 이상 각 emit()
출력의 크기를 MongoDB의 최대 BSON 문서 크기의 절반으로 제한하지 않습니다.
이전 버전에서는 단일 방출이 MongoDB의 최대 BSON 문서 크기의 절반만 저장할 수 있었습니다.
범위가 있는 BSON 유형 JavaScript 코드에 대한 지원 제거
mapReduce
는 더 이상 해당 함수에 대해 사용되지 않는 BSON 유형 JavaScript 코드(BSON 유형 15)를 지원하지 않습니다. map
, reduce
, finalize
함수는 BSON types 문자열(BSON Type 2) 또는 BSON types JavaScript(BSON Type 13) 중 하나여야 합니다. map
, reduce
, finalize
함수에서 액세스할 수 있는 상수 값을 전달하려면 scope
매개 변수를 사용합니다.
2} 함수에 범위가 있는 JavaScript 코드를 사용하는 mapReduce
것은 버전 4.2.1부터 더 이상 사용되지 않습니다.
구조화된 로깅
MongoDB 4.4부터 mongod
/ mongos
인스턴스는 모든 로그 메시지를 구조화된 JSON 형식으로 출력합니다. 여기에는 파일, 시스템 로그 및 스탯아웃(표준 출력) 로그 대상으로 전송된 로그 출력과 getLog
명령의 출력이 포함됩니다.
이전에는 로그 항목이 일반 텍스트로 출력되었습니다.
기존 로그 구문 분석 유틸리티가 있거나 로그 수집 서비스를 사용하는 경우, MongoDB 4.4의 새로운 구조화된 로깅 형식에 맞게 이러한 도구를 다시 구성해야 할 수 있습니다.
새 로그 구조를 사용한 로그 구문 분석의 예시 등 새롭게 구조화된 로깅 형식을 자세히 알아보려면 로그 메시지를 참조하세요.
getLog 값제거 rs
MongoDB 4.4부터 메시지 유형 분류가 더 이상 사용되지 않으므로 getLog
명령은 더 이상 rs
값을 허용하지 않습니다. 대신 로그 메시지는 이제 복제 메시지의 경우 REPL을 포함하여 해당 구성 요소로 항상 식별됩니다.
구성 요소 필드를 필터링하는 로그 구문 분석 예시는 구성 요소별 필터링을 참조하세요.
타임스탬프 형식
구조화된 JSON 로깅으로 전환됨에 따라 ctime
타임스탬프 형식이 더 이상 지원되지 않습니다. 다음 구성 옵션은 더 이상 ctime
을 유효한 매개변수로 허용하지 않습니다.
대신 iso8601-local
(기본값) 또는 iso8601-utc
타임스탬프 형식을 사용합니다.
maxLogSizeKB 매개 변수
구조화된 JSON 로깅으로 전환하면 이제 maxLogSizeKB
서버 파라미터는 지정된 제한을 초과하는 로그 항목의 모든 개별 속성을 잘라냅니다. 이전에는 이 매개변수가 전체 로그 항목을 잘라냈습니다.
또한:
이제
maxLogSizeKB
는0
값을 허용하며, 이 값은 잘라내기를 완전히 비활성화합니다.maxLogSizeKB
더 이상 음수 값을 허용하지 않습니다.
자세한 내용은 로그 메시지 잘라내기를 참조하십시오.
일반 변경 사항
MongoDB 4.4는 gperftools CPU 프로파일러에 대한 지원을 제거합니다. 이 변경의 일부로
hostManager
는 더 이상 클러스터에 대한cpuProfiler
권한 조치를 제공하지 않습니다.이제
ldapConnectionPoolMaximumConnectionsPerHost
매개 변수의 기본값은2
입니다. 이전 버전에서는 기본값이 설정되지 않았습니다.serverStatus
는flowControl.locksPerOp
대신flowControl.locksPerKiloOp
를 반환합니다.$dateFromParts
표현식 연산자는 이제year
및isoWeekYear
필드의1-9999
값 범위를 지원합니다. 이전 버전에서 이러한 필드를 지원하는 값 범위는0-9999
였습니다.listIndexes
및mongo
셸 헬퍼 메서드db.collection.getIndexes()
는 더 이상 인덱스 스펙 문서에서 네임스페이스ns
필드를 반환하지 않습니다.MongoDB 4.4는
--noIndexBuildRetry
명령줄 옵션과 해당storage.indexBuildRetry
옵션을 제거합니다.이제 쓰기 고려를 지원하지 않는 명령에 빈
writeConcern
값(예:writeConcern: {}
)을 전달하면mongos
가 오류를 기록합니다. 이전 버전에서는mongos
명령의 빈writeConcern
값을 무시합니다.compact
명령의force
옵션은 더 이상 불리언이 아닙니다.force: true
및force: false
는 더 이상 사용되지 않으며 오류가 발생합니다.
db.collection.validate() 파라미터 변경
mongo
메소드 db.collection.validate()
는 더 이상 부울 매개 변수만 허용하지 않습니다.
즉, 메서드는 더 이상 db.collection.validate({full: <boolean>})
의 약어로 db.collection.validate(<boolean>)
을 허용하지 않습니다.
그 대신 | 다음을 사용하세요. |
---|---|
db.collection.validate(true) | db.collection.validate({ full: true }) |
db.collection.validate(false) | db.collection.validate() -or-db.collection.validate({ full: false }) |
다음에 대한 전체 유효성 검사 oplog
MongoDB 4.4부터 WiredTiger용 oplog
에 대한 전체 유효성 검사는 더욱 철저한 검사를 생략합니다. validate.warnings
에는 동작에 대한 알림이 포함되어 있습니다.
MapV1 정리
dbStats
명령은 더는 사용하지 않는 MMAPv1 필드numExtents
를 출력에 반환하지 않습니다.replSetGetStatus
명령은 더는 사용하지 않는 MMAPv1 필드replSetGetStatus.initialSyncStatus.fetchedMissingDocs
를 출력에 반환하지 않습니다.fsync
명령은 더 이상 사용되지 않는 MMAPv1 필드async
를 옵션으로 허용하지 않습니다.
지원 중단
지리 공간
MongoDB 4.4는 geoHaystack 인덱스 및 geoSearch
명령을 더 이상 사용하지 않습니다. 대신 $geoNear
또는 $geoWithin
과 함께 2d 인덱스를 사용합니다.
범위가 포함된 BSON 유형 JavaScript 코드
MongoDB 4.4부터 시작됩니다:
$where
는 더 이상 사용되지 않는 BSON 유형 범위의 JavaScript 코드(BSON 유형 15)를 지원하지 않습니다.$where
연산자는 BSON 유형 스트링(BSON 유형 2) 또는 BSON 유형 JavaScript(BSON 유형 13)만 지원합니다.mapReduce
는 더 이상 해당 함수에 대해 사용되지 않는 BSON 유형 JavaScript 코드(BSON 유형 15)를 지원하지 않습니다.map
,reduce
,finalize
함수는 BSON types 문자열(BSON Type 2) 또는 BSON types JavaScript(BSON Type 13) 중 하나여야 합니다.map
,reduce
,finalize
함수에서 액세스할 수 있는 상수 값을 전달하려면scope
매개 변수를 사용합니다.2} 함수에 범위가 있는 JavaScript 코드를 사용하는
mapReduce
것은 버전 4.2.1부터 더 이상 사용되지 않습니다.
$where
및 mapReduce
함수에 대한 범위가 있는 BSON 유형 JavaScript의 사용은 MongoDB 4.2.1 이후 더 이상 지원되지 않습니다.
샤딩
MongoDB 4.4는 다음 샤딩 명령을 더 이상 사용하지 않습니다.
Lookaside 테이블 오버플로 파일 크기 제한
MongoDB 4.4부터 WiredTiger LAS(lookaside 테이블) 캐시 오버플로 파일이 더 이상 존재하지 않습니다. 따라서 MongoDB 4.4에서는 (LAS) 캐시 오버플로 파일 제한에 대한 다음 옵션 및 매개 변수가 더 이상 사용되지 않으며, 이러한 옵션 및 매개 변수는 MongoDB 4.4부터 적용되지 않습니다:
storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB
구성 파일 옵션--wiredTigerMaxCacheOverflowFileSizeGB
명령줄 옵션wiredTigerMaxCacheOverflowSizeGB
매개 변수
4.4 기능 호환성
4.4의 일부 기능을 사용하려면 4.4 바이너리뿐만 아니라 기능 호환성 버전(fCV)을 4.4로 설정해야 합니다. 이러한 기능에는 다음이 포함됩니다.