문서 홈 → 애플리케이션 개발 → MongoDB 매뉴얼
MongoDB 4.4의 호환성 변경 사항
다음 4.4 변경 사항은 이전 버전의 MongoDB와의 호환성에 영향을 줄 수 있습니다.
제거된 명령
MongoDB는 다음 명령과 mongo
셸 헬퍼를 제거합니다.
제거된 명령 | 제거된 도우미 | 대안 |
---|---|---|
cloneCollection | db.cloneCollection() |
|
planCacheListPlans | PlanCache.getPlansByQuery() |
$planCacheStats 변경 사항 도 참조하세요. |
planCacheListQueryShapes | PlanCache.listQueryShapes() |
$planCacheStats 변경 사항 도 참조하세요. |
제거된 매개변수
MongoDB는 다음 서버 매개변수를 제거합니다.
제거된 매개 변수 | 설명 |
---|---|
failIndexKeyTooLong | MongoDB 4.4 은 failIndexKeyTooLong 매개 변수를 제거합니다. 이 매개변수는 4 에서 더 이상 사용되지 않습니다.2 를 featureCompatibilityVersion (fCV) 버전이 4 인 MongoDB로 변환합니다.2+ 더 이상 인덱스 키 제한을 부과하지 않습니다. |
도구 변경 사항
Community 및 Enterprise 에디션 모두에 대한 Windows MSI 설치 프로그램 에는 MongoDB 데이터베이스 도구 (mongoimport
, mongoexport
등)가 포함되어 있지 않습니다. Windows에 MongoDB 데이터베이스 도구를 다운로드하여 설치하려면 MongoDB 데이터베이스 도구 설치를 참조 하세요.
MongoDB 4 에 의존하는 경우.2 또는 이전 MSI 설치 프로그램을 사용하여 데이터베이스 도구를 MongoDB Server와 함께 설치하려면 이제 데이터베이스 도구를 별도로 다운로드해야 합니다.
복제본 세트
디렉토리 롤백
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/거짓 값 또는 이전에 지원되지 않는 문서 값 제외)이 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 } ] }
버전 4.2 이하에서는 기존 필드의 $elemMatch
프로젝션이 문서의 순서를 유지합니다.
{ "_id" : ObjectId("5edef91e76ddff7d92f118e1"), "games" : [ { "game" : "abc", "score" : 8 } ], "joined" : ISODate("2020-01-01T00:00:00Z"), "lastLogin" : ISODate("2020-05-01T00:00:00Z") }
$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
프로젝션이 포함 여부에 관계없이 중첩된 문서의 다른 필드도 프로젝션에 포함되었습니다.
경로 충돌 제한
경로 충돌: 내장된 문서 및 해당 필드
내장된 문서의 필드가 포함된 문서를 프로젝트할 수 없습니다.
예를 들어,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
찾기 및 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
제한
찾기 및 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 인 경우, 프로젝션 또는 $text
정렬에서 표현식을 사용하려면 연산의 쿼리 술어에 연산자를 db.collection.find()
{ $meta: "textScore" }
지정해야 합니다. 예를 들면 다음과 같습니다.
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
명령을 실행하면 MongoDB는 연결된 키에 포함된 값의 수에 관계없이 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 Type JavaScript 코드(BSON Type 15)를 더 이상 지원하지 않습니다. map
, reduce
및 finalize
함수는 BSON type string (BSON type 2) 또는 BSON type JavaScript (BSON type 13) 중 하나여야 합니다. map
, reduce
및 finalize
함수에서 액세스할 수 있는 상수 값을 전달하려면 scope
매개변수를 사용합니다.
2} 함수에 범위가 있는 JavaScript 코드를 사용하는 mapReduce
것은 버전 4.2.1부터 더 이상 사용되지 않습니다.
팁
다음도 참조하세요.
구조화된 로깅
MongoDB 4 부터 시작.4, mongod
/ mongos
인스턴스는 이제 모든 로그 메시지를 구조화된 JSON 형식으로 출력합니다. 여기에는 파일, syslog 및 stdout (표준 출력) 로그 대상 으로 전송된 로그 출력과 getLog
명령의 출력이 포함됩니다.
이전에는 로그 항목이 일반 텍스트로 출력되었습니다.
기존 로그 구문 분석 유틸리티가 있거나 로그 수집 서비스를 사용하는 경우 MongoDB 4 를 사용하여 새로운 구조화된 로깅 형식에 맞게 이러한 도구를 재구성해야 할 수 있습니다.4.
새 로그 구조를 사용한 로그 구문 분석의 예를 포함하여 새로운 구조화된 로깅 형식에 대한 자세한 검사는 로그 메시지 를 참조하세요.
rs
getLog 값 제거
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.locksPerKiloOp
flowControl.locksPerOp
반환합니다.$dateFromParts
표현식 연산자는 이제year
및isoWeekYear
필드에 대해1-9999
의 값 범위를 지원합니다. 이전 버전에서는 이러한 필드에 지원되는 값 범위가0-9999
이었습니다.listIndexes
및mongo
셸 헬퍼 메서드db.collection.getIndexes()
는 더 이상 인덱스 사양 문서에서 네임스페이스ns
필드를 반환하지 않습니다.MongoDB 4.4 은
--noIndexBuildRetry
명령줄 옵션과 해당storage.indexBuildRetry
옵션을 제거합니다.이제
mongos
는 쓰기 고려를 지원하지 않는 명령에 빈writeConcern
값(예:writeConcern: {}
을 전달하면 오류를 기록합니다. 이전 버전에서는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() -또는-db.collection.validate({ full: false }) |
다음에 대한 전체 유효성 검사 oplog
MongoDB 4 부터 시작.4, WiredTiger에 대한 oplog
에 대한 전체 유효성 검사는 더 철저한 검사를 건너뜁니다. validate.warnings
에는 동작에 대한 알림이 포함되어 있습니다.
MMAPv1 정리
dbStats
명령이 더 이상 사용되지 않는 MMAPv1numExtents
필드를 반환하지 않습니다.replSetGetStatus
명령은 더 이상 출력에 더 이상 사용되지 않는 MMAPv1 필드replSetGetStatus.initialSyncStatus.fetchedMissingDocs
를 반환하지 않습니다.fsync
명령은 더 이상 사용되지 않는 MMAPv1 필드async
를 옵션으로 허용하지 않습니다.
지원 중단
지리 공간
MongoDB 4.4 은 geoHaystack 인덱스 및 geoSearch
명령을 더 이상 사용하지 않습니다. 대신 또는 와 $geoNear
2함께 d $geoWithin
인덱스 를 사용합니다.
범위가 있는 BSON 유형 JavaScript 코드
MongoDB 4.4부터 시작됩니다:
$where
는 더 이상 사용되지 않는 범위가 있는 BSON types JavaScript 코드(BSON Type 15)를 지원하지 않습니다.$where
연산자는 BSON type 문자열(BSON type 2) 또는 BSON types JavaScript(BSON type 13)만 지원합니다.mapReduce
는 함수에 대해 사용되지 않는 BSON Type JavaScript 코드(BSON Type 15)를 더 이상 지원하지 않습니다.map
,reduce
및finalize
함수는 BSON type string (BSON type 2) 또는 BSON type 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 는 다음 샤딩 명령을 더 이상 사용하지 않습니다.
Lookside 테이블 오버플로 파일 크기 제한
MongoDB 4 부터 WiredTiger lookaside 테이블(LAS) 캐시 오버플로 파일이 더 이상 존재하지 않습니다.4. 따라서 MongoDB 4.4 는 (LAS) 캐시 오버플로 파일 제한에 대한 다음 옵션 및 매개 변수를 더 이상 사용하지 않습니다. 이러한 옵션과 매개 변수는 MongoDB 4 부터 적용되지 않습니다.4:
storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB
구성 파일 옵션--wiredTigerMaxCacheOverflowFileSizeGB
명령줄 옵션wiredTigerMaxCacheOverflowSizeGB
매개변수
4.4 기능 호환성
4 의 일부 기능.4 에는 4 만 필요한 것이 아닙니다.4 바이너리이지만 featureCompatibilityVersion (fCV)이 4 로 설정되어 있습니다.4. 이러한 기능에는 다음이 포함됩니다.