문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ /

MongoDB 4.4의 호환성 변경 사항

이 페이지의 내용

  • 제거된 명령
  • 제거된 매개변수
  • 도구 변경 사항
  • 복제본 세트
  • 프로젝션 호환성 변경 사항
  • $sort 변경 사항
  • 맵 리듀스 변경 사항
  • 구조화된 로깅
  • 일반 변경 사항
  • 4.4 기능 호환성

다음의 4.4 변경 사항은 MongoDB 이전 버전과 호환성에 영향을 줄 수 있습니다.

MongoDB는 다음 명령과 mongo 셸 헬퍼를 제거합니다.

제거된 명령
제거된 도우미
대안
cloneCollection
db.cloneCollection()
  • mongoexportmongoimport 사용하거나

  • 집계 파이프라인 $out 또는 $merge 단계를 사용하거나

  • 드라이버를 사용하여 스크립트를 작성합니다.

planCacheListPlans
PlanCache.getPlansByQuery()
  • 집계 파이프라인 단계 $planCacheStats를 사용합니다.

  • mongo 셸 헬퍼 메서드 PlanCache.list()를 사용합니다. (버전 4.4부터 사용 가능)

planCacheListQueryShapes
PlanCache.listQueryShapes()
  • 집계 파이프라인 단계 $planCacheStats를 사용합니다.

  • mongo 셸 헬퍼 메서드 PlanCache.list()를 사용합니다. (버전 4.4부터 사용 가능)

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 명령과 해당 mongo 쉘 도우미인 rs.status()는 출력에서 더 이상 사용되지 않는 다음 필드를 제거합니다.

제거된 필드
대안
replSetGetStatus.syncingTo
대신 syncSourceHost를 사용하세요.
members[n].syncingTo
대신 members[n].syncSourceHost를 사용하세요.

MongoDB 4.4는 복제본 세트 구성 문서term 필드를 추가합니다. 복제본 세트 멤버는 termversion을 사용하여 '최신' 복제본 구성에 관한 합의를 도출합니다. featureCompatibilityVersion(fCV) 설정: "4.4" 는 암시적으로 replSetReconfig를 수행하여 구성 문서에 term 필드를 추가하고 새 구성이 대다수의 복제본 세트 멤버에게 전파될 때까지 차단합니다. 마찬가지로 fCV : "4.2"로 다운그레이드하면 term 필드를 제거하기 위한 재구성이 암시적으로 수행됩니다.

복제본 세트 멤버에서 실행하려면 다음 작업 시 멤버가 PRIMARY 또는 SECONDARY 상태에 포함되어 있어야 합니다.

멤버가 STARTUP2와 같은 다른 상태에 있으면 작업 오류가 발생합니다.

버전 4.4부터 MongoDB는 기본값인 { w: 1, wtimeout: 0 } 이외의 settings.getLastErrorDefaults 값 지정을 더 이상 사용하지 않습니다. MongoDB 4.4는 사용자가 지정한 쓰기 고려 값을 적용하지만 향후 MongoDB 버전에서는 기본값 이외의 값을 적용하지 않을 수 있습니다. 대신 setDefaultRWConcern 명령을 사용하여 복제본 세트 또는 샤드 클러스터에 대한 기본 읽기 또는 쓰기 고려 구성을 설정합니다.

MongoDB 4.4부터 findfindAndModify() 프로젝션은 집계 표현식과 집계 구문을 허용할 수 있습니다.

리터럴 및 집계 변수 사용을 포함한 집계 표현식 및 구문을 사용하면 프로젝션 필드 값에 리터럴(숫자 또는 부울 제외) 지정이 가능합니다. 그러면 필드가 새 값으로 프로젝션 됩니다.

예를 들어 status 필드가 포함된 문서가 있는 컬렉션 인벤토리를 고려합니다.

db.inventory.insertOne( { _id: 1, item: "postcard", status: "A", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] })

MongoDB 4.4부터 다음 연산은 statusinstock 필드를 현재 값 대신 새 값으로 투영합니다.

db.inventory.find(
{ status: "A" },
{ status: "Active", instock: ["blue", "crimson"] }
)

즉, 이 작업은 다음 문서를 반환합니다.

{ "_id" : 1, "status" : "Active", "instock" : [ "blue", "crimson" ] }

이전 버전에서는 모든 사양 값(0/false 값 또는 이전에 지원되지 않는 문서 값 제외)이 true로 처리되어 현재 값에 필드가 포함되었음을 나타냅니다. 즉, 이전 버전에서는 이전 작업이 statusinstock 필드가 포함된 문서를 현재 값과 함께 반환합니다.

{ "_id" : 1, "status" : "A", "instock" : [ { "warehouse" : "B", "qty" : 15 }, { "warehouse" : "C", "qty" : 35 } ] }

문서의 필드 순서에 관계없이 기존 필드의 $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")
} )

다음 프로젝션은 문서에서 해당 필드가 joinedlastLogin 필드 앞에 나열되어 있더라도 투영에 포함된 다른 기존 필드 다음에 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 프로젝션이 포함된 프로젝션의 일부인 경우 중첩 문서의 다른 필드를 더 이상 반환하지 않습니다.

예를 들어,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 }과 동일한 결과를 생성합니다.

findfindAndModify() 프로젝션은 배열의 $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 } )

이 문제를 해결하려면 $ 투영 연산자 뒤에 오는 필드 경로의 구성요소를 제거합니다.

findfindAndModify() 프로젝션은 $ 프로젝션 표현식의 일부로 $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는 빈 필드의 포함/제외를 존재하지 않는 필드의 프로젝션과 동일하게 처리합니다.

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" } } );

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 문서 크기의 절반만 저장할 수 있었습니다.

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의 새로운 구조화된 로깅 형식에 맞게 이러한 도구를 다시 구성해야 할 수 있습니다.

새 로그 구조를 사용한 로그 구문 분석의 예시 등 새롭게 구조화된 로깅 형식을 자세히 알아보려면 로그 메시지를 참조하세요.

MongoDB 4.4부터 메시지 유형 분류가 더 이상 사용되지 않으므로 getLog 명령은 더 이상 rs 값을 허용하지 않습니다. 대신 로그 메시지는 이제 복제 메시지의 경우 REPL을 포함하여 해당 구성 요소로 항상 식별됩니다.

구성 요소 필드를 필터링하는 로그 구문 분석 예시는 구성 요소별 필터링을 참조하세요.

구조화된 JSON 로깅으로 전환됨에 따라 ctime 타임스탬프 형식이 더 이상 지원되지 않습니다. 다음 구성 옵션은 더 이상 ctime을 유효한 매개변수로 허용하지 않습니다.

대신 iso8601-local(기본값) 또는 iso8601-utc 타임스탬프 형식을 사용합니다.

구조화된 JSON 로깅으로 전환하면 이제 maxLogSizeKB 서버 파라미터는 지정된 제한을 초과하는 로그 항목의 모든 개별 속성을 잘라냅니다. 이전에는 이 매개변수가 전체 로그 항목을 잘라냈습니다.

또한:

  • 이제 maxLogSizeKB0 값을 허용하며, 이 값은 잘라내기를 완전히 비활성화합니다.

  • maxLogSizeKB 더 이상 음수 값을 허용하지 않습니다.

자세한 내용은 로그 메시지 잘라내기를 참조하십시오.

  • MongoDB 4.4는 gperftools CPU 프로파일러에 대한 지원을 제거합니다. 이 변경의 일부로 hostManager는 더 이상 클러스터에 대한 cpuProfiler 권한 조치를 제공하지 않습니다.

  • 이제 ldapConnectionPoolMaximumConnectionsPerHost 매개 변수의 기본값은 2입니다. 이전 버전에서는 기본값이 설정되지 않았습니다.

  • serverStatusflowControl.locksPerOp 대신 flowControl.locksPerKiloOp를 반환합니다.

  • $dateFromParts 표현식 연산자는 이제 yearisoWeekYear 필드의1-9999 값 범위를 지원합니다. 이전 버전에서 이러한 필드를 지원하는 값 범위는 0-9999였습니다.

  • listIndexesmongo 셸 헬퍼 메서드 db.collection.getIndexes()는 더 이상 인덱스 스펙 문서에서 네임스페이스 ns 필드를 반환하지 않습니다.

  • MongoDB 4.4는 --noIndexBuildRetry 명령줄 옵션과 해당 storage.indexBuildRetry 옵션을 제거합니다.

  • 이제 쓰기 고려를 지원하지 않는 명령에 빈 writeConcern 값(예: writeConcern: {})을 전달하면 mongos가 오류를 기록합니다. 이전 버전에서는 mongos 명령의 빈 writeConcern 값을 무시합니다.

  • compact 명령의 force 옵션은 더 이상 불리언이 아닙니다. force: trueforce: false는 더 이상 사용되지 않으며 오류가 발생합니다.

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 })

MongoDB 4.4부터 WiredTiger용 oplog에 대한 전체 유효성 검사는 더욱 철저한 검사를 생략합니다. validate.warnings에는 동작에 대한 알림이 포함되어 있습니다.

  • dbStats 명령은 더는 사용하지 않는 MMAPv1 필드 numExtents를 출력에 반환하지 않습니다.

  • replSetGetStatus 명령은 더는 사용하지 않는 MMAPv1 필드 replSetGetStatus.initialSyncStatus.fetchedMissingDocs를 출력에 반환하지 않습니다.

  • fsync 명령은 더 이상 사용되지 않는 MMAPv1 필드 async를 옵션으로 허용하지 않습니다.

MongoDB 4.4는 geoHaystack 인덱스 및 geoSearch 명령을 더 이상 사용하지 않습니다. 대신 $geoNear 또는 $geoWithin과 함께 2d 인덱스를 사용합니다.

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부터 더 이상 사용되지 않습니다.

$wheremapReduce 함수에 대한 범위가 있는 BSON 유형 JavaScript의 사용은 MongoDB 4.2.1 이후 더 이상 지원되지 않습니다.

MongoDB 4.4는 다음 샤딩 명령을 더 이상 사용하지 않습니다.

MongoDB 4.4부터 WiredTiger LAS(lookaside 테이블) 캐시 오버플로 파일이 더 이상 존재하지 않습니다. 따라서 MongoDB 4.4에서는 (LAS) 캐시 오버플로 파일 제한에 대한 다음 옵션 및 매개 변수가 더 이상 사용되지 않으며, 이러한 옵션 및 매개 변수는 MongoDB 4.4부터 적용되지 않습니다:

  • storage.wiredTiger.engineConfig.maxCacheOverflowFileSizeGB 구성 파일 옵션

  • --wiredTigerMaxCacheOverflowFileSizeGB 명령줄 옵션

  • wiredTigerMaxCacheOverflowSizeGB 매개 변수

4.4의 일부 기능을 사용하려면 4.4 바이너리뿐만 아니라 기능 호환성 버전(fCV)을 4.4로 설정해야 합니다. 이러한 기능에는 다음이 포함됩니다.

돌아가기

4.4

다음

업그레 이드