【问题标题】:Mongoose - Redefining schema structureMongoose - 重新定义模式结构
【发布时间】:2016-06-19 13:52:27
【问题描述】:

我有以下代码:

var Schema = mongoose.Schema;

var personSchema = new Schema({
    firstname: String,
    lastname: String,
    address: String,
});

var Person = mongoose.model('humans', personSchema);

var john = Person({ //will turn into a new object.
    firstname: "john",
    lastname: "doe",
    address: "somewhere",

});

//save the user
john.save(function(err){
   if(err) throw err;
   console.log('person saved!'); 
});

现在,在我的数据库中,我有一个名为 human 的集合 名字:“约翰”, 姓氏:“doe”, 地址:“某处”, 正如你在上面看到的。我的问题是:有没有一种方法可以在 human 集合中创建 1 个具有您在上面看到的结构的文档,以及一个包含一些新字段的文档:

firstname: String,
lastname: String,
address: String,
car: String,
office: String

我尝试了几种方法来重新定义 personSchema 的结构 但它总是给我同样的错误,编译后无法覆盖模型。”

感谢您的宝贵时间。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    发生错误是因为您已经定义了架构,然后您又重新定义了架构。实例化一次架构,并生成全局对象以访问架构。

    更改您的 Person 架构,并添加新字段

    var personSchema = new Schema({
        firstname: String,
        lastname: String,
        address: String,
        car: String,
        office: String
    });
    

    填充后不包含添加字段的文档将具有此键但具有未定义的值。

    为了不忽略新属性,您可以取消模式限制

    var personSchema = new Schema({
            firstname: String,
            lastname: String,
            address: String,
            car: String,
            office: String
        }, {strict: false});
    

    你也可以使用混合类型来设置任何属性

    var personSchema = new Schema({
                firstname: String,
                lastname: String,
                additional: Mixed
            });
    

    并在附加字段中设置其他属性。

    【讨论】:

    • 我明白了,但是会有很多对象具有未定义的属性,这会占用一点空间。我认为有一种方法可以让一个文档具有某些属性,而另一个文档在同一个集合中具有不同的属性。
    • 没有未定义的属性未保存在数据库中。
    • 好的,但是稍后说我想在我的文档中添加动态属性,我无法告诉它的名称,因此不能提前声明它。我需要重新定义我的结构,但我不知道如何..
    • 在这种情况下,使用 , {strict: false} 作为模式构造函数的第二个参数,您可以动态添加任何属性到对象,例如 new Person({'anything', 'anythong'})
    • 你也可以使用混合类型,但是像 {"additional":Mixed} 改变你的架构并在附加字段中设置任何数据
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 2019-04-02
    • 2015-01-07
    • 2014-09-14
    相关资源
    最近更新 更多