35

我们正在快速开发一个使用 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
    }
});
4

7 回答 7

22

考虑到您的 Mongoose 模型名称为sweepstakesModel,此代码会将enabled具有布尔值的字段添加false到您的集合中的所有预先存在的文档中:

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 shell 更新特定集合中的现有文档

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

在使用 Node 构建应用程序时,我有一个类似的要求,必须添加到现有模式中,并且只发现这个(很久以前发布的)查询有帮助。

我通过在架构的原始描述中引入该行然后运行类似于以下行的内容(仅一次)来更新现有记录,从而添加到该架构:

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

'updateMany' 是我想在这里提到的功能。

于 2021-06-17T02:39:56.680 回答
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 回答