我有以下架构:
var Schema = new mongoose.Schema({});
Schema.add({
type: {
type: String
, enum: ['one', 'two', 'three']
}
});
Schema.add({
title: {
type: String
//, required: true ned set by some conditional
}
});
正如您可以从预先定义的架构定义中获得两个字段type
和title
。第二个(title
)仅在required: true
为type
时必须为(one | two)
,如果类型为false
,则必须为three
。< / p>
我怎么能用猫鼬做到这一点?
编辑:感谢您的回答。我在这里问了一个相关的问题:
如果不需要,我可以删除字段吗?让我们说three
类型,但也提供title
字段。为了防止在这种情况下存储不必要的title
如何删除它?
答案 0 :(得分:2)
您可以在mongoose中为required
验证器分配一个功能。
Schema.add({
title: String,
required: function(value) {
return ['one', 'two'].indexOf(this.type) >= 0;
}
});
documentation没有说明你可以使用函数作为参数,但是如果点击show code
,你会明白为什么这是可能的。
答案 1 :(得分:1)
使用validate选项替代已接受的答案:
Schema.add({
title: String,
validate: [function(value) {
// `this` is the mongoose document
return ['one', 'two'].indexOf(this.type) >= 0;
}, '{PATH} is required if type is either "one" or "two"']
});
更新:我应该注意到验证器仅在未定义字段且仅需要唯一例外的情况下运行。所以,这不是一个好的选择。
答案 2 :(得分:0)
您可以尝试以下方法之一:
Schema.add({
title: {
type: String
//, required: true ned set by some conditional
}
});
Schema.title.required = true;
或
var sky = 'gray'
var titleRequired = sky === 'blue' ? true : false
Schema.add({
title: {
type: String,
required: titleRequired
}
});