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某个关键字,二者都将具有默认值。