35

私たちはMongooseを使用するアプリケーションを急速に開発しており、スキーマは頻繁に変更されています。既存のドキュメントのスキーマを更新する適切な方法を理解するには、ドキュメントを吹き飛ばして最初から完全に再作成する必要があります。

http://mongoosejs.com/docs/api.html#schema_Schema-addに出くわしましたが、これは正しいようです。これを実際に実装する方法についてのドキュメントはほとんどまたはまったくないため、MongoDBを初めて使用する人にとっては非常に困難です。

enabledという新しいフィールドを追加したいだけです。私のスキーマ定義は次のとおりです。

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

7 に答える 7

22

マングースのモデル名をと見なすと、このコードは、コレクション内の既存のすべてのドキュメントにブール値のフィールドをsweepstakesModel追加します。enabledfalse

db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
    function (doc) {
        doc.enabled = false;
        db.sweepstakesModel.save(doc);
    }
)
于 2016-05-16T10:36:07.417 に答える
21

スキーマの変更に準拠するために既存のドキュメントを移行することに関して、Mongooseには何も組み込まれていません。必要に応じて、独自のコードでそれを行う必要があります。新しいenabledフィールドのような場合は、コードを記述して、欠落しているenabledフィールドを設定されているかのfalseように処理し、既存のドキュメントに触れる必要がないようにするのがおそらく最もクリーンです。

スキーマ自体が変更される限り、表示したとおりにSchema定義を更新するだけですが、値を持つ新しいフィールドなどの変更は、default今後の新しいドキュメントにのみ影響します。

于 2013-01-11T23:23:38.800 に答える
4

移行のようなものも探していましたが、見つかりませんでした。別の方法として、デフォルトを使用できます。キーにデフォルトがあり、キーが存在しない場合は、デフォルトが使用されます。

マングースのデフォルト

ドキュメントスケルトンが作成されるときに、デフォルト値が適用されます。これは、新しいドキュメント(new MyModel)を作成する場合、または既存のドキュメント(MyModel.findById)を見つけた場合、特定のキーが欠落している場合、両方にデフォルトが設定されることを意味します。

于 2015-12-02T14:54:56.833 に答える
3

私はまったく同じ問題を抱えていましたが、findOneAndUpdate()呼び出すのではなく使用するとsave、最初にすべての古いドキュメントを削除しなくても、スキーマファイルを更新できることがわかりました。

リクエストがあれば、コードスニペットを投稿できます。

于 2018-05-29T14:03:53.913 に答える
1

mongoシェルを使用して、特定のコレクション内の既存のドキュメントを更新できます

db.SweeptakesModel.update({}, {$set: {"enabled": false}}, {upsert:false, multi:true})
于 2021-04-27T23:57:01.593 に答える
0

Vickarが提案していたことに加えて、ここではJavascript(Nodejs)で書かれたMongooseの例:

const mongoose = require('mongoose');
const SweeptakesModel = mongoose.model(Constants.SWEEPTAKES,sweepstakesSchema);
SweeptakesModel.find( { enabled : { $exists : false } }).then(
function(doc){
       doc.enabled = false;
       doc.save();
    }
)
于 2020-02-27T10:13:56.697 に答える
0

Nodeを使用してアプリを構築するときに、既存のスキーマに追加する必要があるという同様の要件がありましたが、この(ずっと前に投稿された)クエリだけが役に立ちました。

スキーマの元の説明にこの行を導入し、次の行のようなものを1回だけ実行して、既存のレコードを更新することにより、追加したスキーマ:

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

「updateMany」は、ここで言及したい関数です。

于 2021-06-17T02:39:56.680 に答える