Mongoose更改架构格式

时间:2013-01-11 22:19:28

标签: node.js mongodb mongoose

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

7 个答案:

答案 0 :(得分:12)

Mongoose没有内置关于迁移现有文档以符合架构更改的内容。您需要根据需要在自己的代码中执行此操作。在新的enabled字段的情况下,编写代码可能最干净,因此它会将缺少的enabled字段视为设置为false,因此您不必触摸现有的文档。

就架构更改本身而言,您只需更新已显示的Schema定义,但更改为具有default值的新字段只会影响未来的新文档。

答案 1 :(得分:11)

  db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
   function (doc) {
       doc.enabled = false;
       db.sweepstakesModel.save(doc);
    }
  )

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

答案 2 :(得分:1)

我也在寻找像迁移这样的东西,但是没有找到它。作为替代方案,您可以使用默认值。如果某个键具有默认值且该键不存在,则它将使用默认值。

Mongoose Defaults

  

构造文档框架时应用默认值。这意味着如果您创建一个新文档(新MyModel)或者如果您找到一个现有文档(MyModel.findById),则只要缺少某个键,两者都将具有默认值。

答案 3 :(得分:0)

我遇到了完全相同的问题,发现使用findOneAndUpdate()而不是调用save允许我们更新架构文件,而不必先删除所有旧文档。

如果需要,我可以发布代码段。

答案 4 :(得分:0)

除了Vickar的建议外,这里是用Javascript(Nodejs)编写的猫鼬示例:

const mongoose = require('mongoose');
const SweeptakesModel = mongoose.model(Constants.SWEEPTAKES,sweepstakesSchema);
SweeptakesModel.find( { enabled : { $exists : false } }).then(
function(doc){
       doc.enabled = false;
       doc.save();
    }
)

答案 5 :(得分:0)

您可以使用 mongo shell 更新特定集合中的现有文档

db.SweeptakesModel.update({}, {$set: {"enabled": false}}, {upsert:false, multi:true})

答案 6 :(得分:0)

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

我添加的模式是在模式的原始描述中引入这一行,然后运行类似于以下行的内容,仅执行一次,以更新现有记录:

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

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