Mongoose更改架构格式

Nic*_*ons 24 mongoose mongodb node.js

我们正在快速开发一个使用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
    }
});
Run Code Online (Sandbox Code Playgroud)

Joh*_*yHK 14

Mongoose没有内置关于迁移现有文档以遵守模式更改的内容.您需要根据需要在自己的代码中执行此操作.在像新enabled字段这样的情况下,编写代码可能是最干净的,因此它将缺少的enabled字段视为已设置为处理,false因此您不必触及现有文档.

对于架构更改本身,您只需更新您Schema所显示的定义,但更改像带有default值的新字段只会影响未来的新文档.

  • 因此,在我使用默认值将 `x` 添加到架构后,保存以前没有字段 `x` 的文档不会用 `x` 更新文档吗?我不明白这种设计选择,这是在某处记录的吗?谢谢 (2认同)

Vic*_*kar 14

  db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
   function (doc) {
       doc.enabled = false;
       db.sweepstakesModel.save(doc);
    }
  )
Run Code Online (Sandbox Code Playgroud)

将您的猫鼬模型名称视为"sweepstakesModel",此代码会将"enabled"字段的布尔值"false "添加到集合中的所有预先存在的文档中.