itsource

Mongoose 스키마 형식 변경

mycopycode 2023. 7. 1. 08:34
반응형

Mongoose 스키마 형식 변경

우리는 Mongoose를 사용하는 애플리케이션을 빠르게 개발하고 있으며 스키마가 자주 변경되고 있습니다.기존 문서의 스키마를 업데이트하는 올바른 방법을 찾을 수 없을 것 같습니다. 문서를 날려버리고 처음부터 완전히 다시 만들지 않고는 말입니다.

저는 http://mongoosejs.com/docs/api.html#schema_Schema-add, 을 우연히 발견했는데, 맞는 것 같습니다.MongoDB를 처음 사용하는 사람에게는 이를 실제로 구현하는 방법에 대한 문서가 거의 또는 전혀 없습니다.

사용 가능이라는 새 필드를 추가합니다.스키마 정의는 다음과 같습니다.

var sweepstakesSchema = new Schema({
    client_id: {
        type: Schema.Types.ObjectId,
        ref: 'Client',
        index: true
    },
    name: {
        type: String,
        default: 'Sweepstakes',
    },
    design: {
        images: {
            type: [],
            default: []
        },
        elements: {
            type: [],
            default: []
        }
    },
    enabled: {
        type: Boolean,
        default: false
    },
    schedule: {
        start: {
            type: Date, 
            default: Date.now
        },
        end: {
            type: Date,
            default: Date.now
        }
    },
    submissions: {
        type: Number,
        default: 0
    }
});

당신의 Mongoose 모델 이름을 고려하면 다음과 같습니다.sweepstakesModel이 코드는 추가됩니다.enabled부울 값이 있는 필드false컬렉션에 있는 모든 기존 문서:

db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
    function (doc) {
        doc.enabled = false;
        db.sweepstakesModel.save(doc);
    }
)

Mongoose에는 스키마 변경에 따라 기존 문서를 마이그레이션하는 것과 관련하여 기본 제공되는 것이 없습니다.필요에 따라 자신의 코드로 이 작업을 수행해야 합니다.새로운 경우와 같은 경우.enabled필드, 누락된 코드를 처리하도록 코드를 작성하는 것이 가장 깨끗할 것입니다.enabled설정된 것처럼 필드false기존 문서를 건드리지 않아도 됩니다.

스키마 자체가 변경되는 한, 당신은 단지 당신의Schema표시한 대로 정의하지만 새 필드처럼 변경됩니다.default값은 이후의 새 문서에만 영향을 미칩니다.

저도 이주와 같은 것을 찾고 있었지만 찾지 못했습니다.또는 기본값을 사용할 수 있습니다.키에 기본값이 있고 키가 없으면 기본값을 사용합니다.

Mongoose 기본값

기본값은 문서 골격이 구성될 때 적용됩니다.즉, 새 문서(새 MyModel)를 만들거나 기존 문서(MyModel.findById)를 찾을 경우 특정 키가 없는 경우 두 문서 모두 기본값이 됩니다.

저도 똑같은 문제를 겪었고, 다음과 같은 것을 발견했습니다.findOneAndUpdate()부르는 것보다save이전 문서를 먼저 모두 삭제할 필요 없이 스키마 파일을 업데이트할 수 있습니다.

요청이 있으면 코드 스니펫을 게시할 수 있습니다.

mongo 셸을 사용하여 특정 컬렉션의 기존 문서를 업데이트할 수 있습니다.

db.SweeptakesModel.update({}, {$set: {"enabled": false}}, {upsert:false, multi:true})

노드를 사용하여 앱을 구축할 때 기존 스키마에 추가해야 하는 유사한 요구 사항이 있었는데, 도움이 되는 이 (오래 전에 게시된) 쿼리만 발견했습니다.

기존 레코드를 업데이트하기 위해 스키마의 원래 설명에 있는 줄을 소개하고 다음 줄과 유사한 것을 한 번만 실행하여 추가한 스키마:

myModelObject.updateMany( { enabled : { $exists : false } }, { enabled : false } )

여기서 언급하고 싶은 기능은 'updateMany'입니다.

Vickar가 제안한 것 외에도, 여기 Mongoose 예제가 Javascript(Nodejs)에 작성되었습니다.

const mongoose = require('mongoose');
const SweeptakesModel = mongoose.model(Constants.SWEEPTAKES,sweepstakesSchema);
SweeptakesModel.find( { enabled : { $exists : false } }).then(
function(doc){
       doc.enabled = false;
       doc.save();
    }
)

언급URL : https://stackoverflow.com/questions/14287617/mongoose-changing-schema-format

반응형