如何在猫鼬模式中设置默认值

时间:2020-09-23 05:47:00

标签: javascript node.js mongodb mongoose

例如,我有一个如下的架构。

const packSchema = new mongoose.Schema({
  company: [
     name: {type: String},
     realName: {type: String, default: ''}
  ]
})

所以我可以按以下方式保存JSON数据。

[{
  "name": "abc",
  "realName": "efg"
}]

但是,当数据没有realName时,我希望realName从自己的名字获取数据。
例如,我从ajax调用中请求此数组,

[{
  "name": "KA"
},
{
  "name": "MC"
}]

当我保存该对象时,在mongoDB中的结果如下。

[{
  "name": "KA",
  "realName": "KA"
},
{
  "name": "MC",
  "realName": "MC"
}]

我认为解决方案在架构中使用“设置”选项。

function duplicate(){
}

const packSchema = new mongoose.Schema({
  company: [
     name: {type: String},
     realName: {type: String, set: duplicate}
  ]
})

但是我不知道如何从他自己的数组元素中获取“名称”数据。

我应该使用“ for”循环吗?还是有其他解决方案?
谢谢您阅读。

2 个答案:

答案 0 :(得分:1)

函数内部的this将绑定到您正在创建的对象。结果,您将可以使用:

function duplicate(v){
  return v === undefined ? this.name : v;
}

以上,如果realName(即:v)的值未定义,那么您将返回this.name,即您所对象的name重新插入/创建。否则,如果已经设置了realName,它将使用该值。

答案 1 :(得分:0)

将公司转换为子模式,并使用预保存钩子更新真实姓名

const companySchema = mongoose.Schema({ 
    name: String, 
    realName: String 
})

companySchema.pre('save',function(next) {
    if(!this.realName)
        this.realName = this.name

    next();
})

const packSchema = mongoose.Schema({
    company: [companySchema]
})

const Pack = mongoose.model('Pack', packSchema);