문서 메뉴

문서 홈애플리케이션 개발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)

$planCacheStats 변경 사항 도 참조하세요.
planCacheListQueryShapes
PlanCache.listQueryShapes()
  • 집계 파이프라인 단계 $planCacheStats 를 사용하거나

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

$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 명령과 해당 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)에 있는 경우 작업 오류가 발생합니다.

버전 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/거짓 값 또는 이전에 지원되지 않는 문서 값 제외)이 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 } ]
}

버전 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 프로젝션이 프로젝션이 포함 프로젝션의 일부인 경우 중첩된 문서의 다른 필드를 더 이상 반환하지 않습니다.

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

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

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

찾기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는 빈 필드의 포함/제외를 존재하지 않는 필드의 프로젝션과 동일하게 처리합니다.

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

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

mapReduce 는 함수에 대해 사용되지 않는 BSON Type JavaScript 코드(BSON Type 15)를 더 이상 지원하지 않습니다. map, reducefinalize 함수는 BSON type string (BSON type 2) 또는 BSON type JavaScript (BSON type 13) 중 하나여야 합니다. map, reducefinalize 함수에서 액세스할 수 있는 상수 값을 전달하려면 scope 매개변수를 사용합니다.

2} 함수에 범위가 있는 JavaScript 코드를 사용하는 mapReduce 것은 버전 4.2.1부터 더 이상 사용되지 않습니다.

다음도 참조하세요.

MongoDB 4 부터 시작.4, mongod / mongos 인스턴스는 이제 모든 로그 메시지를 구조화된 JSON 형식으로 출력합니다. 여기에는 파일, syslogstdout (표준 출력) 로그 대상 으로 전송된 로그 출력과 getLog 명령의 출력이 포함됩니다.

이전에는 로그 항목이 일반 텍스트로 출력되었습니다.

기존 로그 구문 분석 유틸리티가 있거나 로그 수집 서비스를 사용하는 경우 MongoDB 4 를 사용하여 새로운 구조화된 로깅 형식에 맞게 이러한 도구를 재구성해야 할 수 있습니다.4.

새 로그 구조를 사용한 로그 구문 분석의 예를 포함하여 새로운 구조화된 로깅 형식에 대한 자세한 검사는 로그 메시지 를 참조하세요.

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

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

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

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

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

또한:

  • 이제 maxLogSizeKB 는 잘림을 완전히 비활성화하는 0 값을 허용합니다.

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

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

  • MongoDB 4.4 은(는) gperftools CPU 프로파일러에 대한 지원을 제거합니다. 이 변경의 일환으로 hostManager 는 더 이상 클러스터에 대해 cpuProfiler 권한 작업을 제공하지 않습니다.

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

  • serverStatus 는 을 flowControl.locksPerKiloOp flowControl.locksPerOp반환합니다.

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

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

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

  • 이제 mongos 는 쓰기 고려를 지원하지 않는 명령에 빈 writeConcern 값(예: writeConcern: {} 을 전달하면 오류를 기록합니다. 이전 버전에서는 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() -또는-
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 2함께 d $geoWithin 인덱스 를 사용합니다.

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, reducefinalize 함수는 BSON type string (BSON type 2) 또는 BSON type JavaScript (BSON type 13) 중 하나여야 합니다. map, reducefinalize 함수에서 액세스할 수 있는 상수 값을 전달하려면 scope 매개변수를 사용합니다.

    2} 함수에 범위가 있는 JavaScript 코드를 사용하는 mapReduce 것은 버전 4.2.1부터 더 이상 사용되지 않습니다.

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

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

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

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

  • --wiredTigerMaxCacheOverflowFileSizeGB 명령줄 옵션

  • wiredTigerMaxCacheOverflowSizeGB 매개변수

4 의 일부 기능.4 에는 4 만 필요한 것이 아닙니다.4 바이너리이지만 featureCompatibilityVersion (fCV)이 4 로 설정되어 있습니다.4. 이러한 기능에는 다음이 포함됩니다.

← MongoDB 4.4 릴리스 노트