mongoose 스키마 마이그레이션을 올바르게 처리하는 방법은 무엇입니까?
저는 MongoDB & Mongoose에 완전히 익숙하지 않아서 스키마가 변경될 때 마이그레이션을 처리하는 방법에 대한 답을 찾을 수 없는 것 같습니다.
테이블 구조와 변경해야 하는 기본 데이터를 변경하는 마이그레이션 SQL 스크립트를 실행하는 데 익숙합니다.여기에는 일반적으로 DB 다운타임이 포함됩니다.
MongoDB/Mongoose 내에서 일반적으로 어떻게 처리됩니까?제가 알아야 할 차가 있나요?
MongoDB는 이 문제를 해결하고 관계형 데이터베이스에서 마이그레이션이 어떻게 작동하는지 합리적으로 이해함으로써 이 문제를 조금 더 단순화합니다.저는 이것을 분해하기 위해 두 가지 방법으로 왔습니다.MongoDB에서 데이터 마이그레이션을 처리할 때 고려해야 할 사항은 다음과 같습니다(RDB에서 흔히 볼 수 있는 사항은 아닙니다).
- 개발자가 프로젝트 저장소에서 최신 버전을 병합할 때 로컬 테스트 환경이 손상되지 않도록 보장
- 인증을 사용할 경우 사용자 로그인 또는 로그아웃 여부에 관계없이 실시간 버전에서 모든 데이터가 올바르게 업데이트됩니다. (물론 업그레이드 시 모든 사용자가 자동으로 로그아웃되는 경우, 사용자가 로그인할 때만 걱정하면 됩니다.)
변경으로 인해 모든 사용자가 로그아웃되거나 애플리케이션 다운타임이 예상되는 경우에는 마이그레이션 스크립트를 사용하여 로컬 또는 라이브 MongoDB에 연결하고 올바른 데이터를 업그레이드하는 것이 가장 간단한 방법입니다.사용자 이름이 단일 문자열에서 주어진 이름과 성을 가진 개체로 변경되는 예(물론 매우 기본적이며 모든 개발자를 위해 실행하려면 스크립트에 넣어야 함):
CLI 사용:
mongod
use myDatabase
db.myUsers.find().forEach( function(user){
var curName = user.name.split(' '); //need some more checks..
user.name = {given: curName[0], family: curName[1]};
db.myUsers.save( user );
})
실행 중인 응용 프로그램 버전에 따라 응용 프로그램에서 스키마를 위아래로 마이그레이션하려고 합니다.따라서 사용자가 업그레이드/다운그레이드된 버전을 처음 사용할 때만 업그레이드하기 때문에 실제 서버에 대한 부담이 적고 다운타임이 필요하지 않습니다.
Expressjs for Nodejs에서 미들웨어를 사용하는 경우:
- 루트 앱 스크립트에서 다음을 통해 앱 변수 설정
app.set('schemaVersion', 1)
나중에 사용자 스키마 버전과 비교하는 데 사용됩니다. - 이제 모든 사용자 스키마에 schemaVersion 속성이 있는지 확인하여 해당 특정 사용자에 대해서만 애플리케이션 스키마 버전과 현재 MongoDB 스키마 간의 변경 사항을 감지할 수 있습니다.
다음으로 구성 및 사용자 버전을 감지할 수 있는 간단한 미들웨어를 만들어야 합니다.
app.use( function( req, res, next ){ //If were not on an authenticated route if( ! req.user ){ next(); return; } //retrieving the user info will be server dependent if( req.user.schemaVersion === app.get('schemaVersion')){ next(); return; } //handle upgrade if user version is less than app version //handle downgrade if user version is greater than app version //save the user version to your session / auth token / MongoDB where necessary })
업그레이드/다운그레이드를 위해 사용자 모델을 수락하고 MongoDB의 특정 사용자에 대한 마이그레이션 변경을 실행하는 업그레이드/다운그레이드 내보내기 기능이 있는 마이그레이션 디렉토리 아래에 간단한 js 파일을 만들 것입니다.마지막으로 사용자 버전이 MongoDB에서 업데이트되었는지 확인하여 사용자가 다른 버전으로 다시 이동하지 않는 한 변경 사항을 다시 실행하지 않도록 합니다.
SQL 유형 마이그레이션이나 Rails와 같은 마이그레이션에 익숙하다면 제 cli 도구 migrate-mongoose가 적합하다는 것을 알게 될 것입니다.
이를 통해 마이그레이션을 작성할 수 있습니다.up
a 리고a.down
마이그레이션의 성공 및 실패를 기반으로 상태를 관리하고 작동합니다.
또한 ES 2015 구문을 사용하는 경우 ES6도 지원합니다.
당신은 당신의 몽구스 모델에 접근할 수 있습니다.this
모델 및 스키마를 쉽게 변경할 수 있는 개체입니다.
마이그레이션에는 두 가지 유형이 있습니다.
오프라인:유지 관리를 위해 서비스를 중단한 다음 전체 컬렉션을 반복하고 필요한 변경을 수행해야 합니다.
온라인: 유지 관리를 위해 서비스를 중단할 필요가 없습니다.문서를 읽을 때 해당 버전을 확인하고 이전 버전과 새 버전 간의 각 버전에 대해 버전별 마이그레이션 루틴을 실행합니다.그런 다음 결과물을 적재합니다.
모든 서비스가 오프라인 마이그레이션을 지원할 수 있는 것은 아닙니다. 온라인 방식을 권장합니다.
언급URL : https://stackoverflow.com/questions/18295357/how-to-properly-handle-mongoose-schema-migrations
'programing' 카테고리의 다른 글
한 열의 여러 결과 행을 하나로 연결하고 다른 열로 그룹화 (0) | 2023.05.01 |
---|---|
Postgre에서 타임스탬프 간의 차이(초) 찾기SQL (0) | 2023.05.01 |
새 행에 대해서만 기본 NOW()가 있는 타임스탬프 열 (0) | 2023.05.01 |
"#!/usr/bin/envash"와 "#!/usr/bin/bash"의 차이점은 무엇입니까? (0) | 2023.05.01 |
Mongoose 모델에서 스키마 특성 가져오기 (0) | 2023.05.01 |