node.js - 如何使用一个属性的值作为另一个属性的默认值?

我有一个 Mongoose 模式,我想使用一个属性的值作为另一个属性的默认值,例如:

schemaDef = { 
    myProperty: {type: String, required: true}
    ...
    otherProperty: {type: String, default: this.myProperty}
}

我认为这是可能的,但显然不是,有人可以确认并可能给我一个引用吗?

最佳答案

虽然没有内置方法,但您可以编写一些辅助函数来按照您的意愿行事。示例架构:

module.exports = function(){
    var schemaDef = {
        email : {type : String, required: true},
        secondaryEmail : {type : String, required: true, selfDefault: "email"},
        fullName : {type : String, required: true, selfDefault: {fields: ["firstName","middleName", "lastName"], space: true}},
        password: {type: String, required: true},
        firstName : {type : String, required: true},
        middleName : {type : String, required: true},
        lastName : {type : String, required: true}
    };
    var selfDefaults = initSelfDefaults(schemaDef);
    var UserSchema = new Schema(schemaDef);
    UserSchema.pre('validate', function(next) {
        setSelfDefaults(this, selfDefaults)
        next();
    });
    return mongoose.model("User", UserSchema);
};

您可以将以下辅助函数放在其他文件中,以要求并将它们用于所有模型/模式:

// gets and returns all selfDefaults from the scehmaDef obj. Throws error if selfDefault reference is invalid
function initSelfDefaults(schemaDef){
    var defaults = {};
    for(var key in schemaDef){
        if(schemaDef[key].selfDefault){
            if(schemaDef[key].selfDefault.fields){
                schemaDef[key].selfDefault.fields.forEach(function(field){
                    if (!schemaDef[field]){
                        throw new Error(field + " is an invalid selfDefault reference")
                    }
                })
            }
            else if(!schemaDef[schemaDef[key].selfDefault]){
                throw new Error(schemaDef[key].selfDefault + " is an invalid selfDefault reference")
            }
            defaults[key] = schemaDef[key].selfDefault;
            delete schemaDef[key].selfDefault;
        }
    };
    return defaults
}

// sets the selfDefaults for the fields of the document being created if the fields are empty
function setSelfDefaults(doc, defaults){
    for(var key in defaults){
        if(!doc[key]){
            if(defaults[key].fields){
                var fields = [];
                for(var i=0; i<defaults[key].fields.length; i++){
                    if(doc[defaults[key].fields[i]]){
                        fields.push(doc[defaults[key].fields[i]])
                    }
                }
                doc[key] = defaults[key].space? fields.join(" ") : fields.join("");  
            }
            else{
                doc[key] = doc[defaults[key]];
            }
        }
    }
    return;
}

它不适用于嵌套模式,但您可以调整代码以使其如此。

https://stackoverflow.com/questions/29347175/

相关文章:

mongodb - Mongorestore:ns 名称太长,最大大小为 128

javascript - MongoDB 聚合框架 - 按年份分组

mongodb - 一个集合中的许多文档与多个集合

mongodb - MongoDB中的有向无环图设计模式

node.js - 2服务器负载均衡 Node js应用设置中的Elasticsearch部署

python - 如何让 django celery 写入测试数据库以进行功能测试?

php - 如何安装 PHP 的 MongoDB 驱动程序 — "pecl install mong

python - Mongo 连接从未发布 - Django 和 Mongoengine 使用 ge

regex - MongoDB 中 $cond 中的“like”或 $regex 查询

javascript - 使用 Javascript/Node.js 在代码中执行 mongoimp