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没有内置任何有关迁移现有文档以符合模式更改的内容。 您需要在自己的代码中根据需要执行此操作。 在新的enabled
字段的情况下,编写代码可能是最干净的,因此它会将缺less的enabled
字段视为设置为false
因此您不必触摸现有的文档。
就模式本身而言,只需更新Schema
定义就可以了,但是像新字段一样的default
值只会影响到新的文档。
db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach( function (doc) { doc.enabled = false; db.sweepstakesModel.save(doc); } )
考虑到你的mongoose模型的名字为“sweepstakesModel”,这段代码会把布尔值为“false ”的“enabled”字段添加到你的集合中所有已有的文档中。
我也在寻找像迁移这样的东西,但没有find它。 作为替代,你可以使用默认值。 如果一个密钥有一个默认的密钥不存在,它将使用默认值。
mongoose默认
构build文档框架时应用默认值。 这意味着如果您创build一个新文档(新的MyModel)或者如果您find一个现有的文档(MyModel.findById),那么只要缺less某个关键字,二者都将具有默认值。