0

我有以下架构:

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
    }
});

正如您可以从预置模式定义中看到的那样,我有两个字段typetitle. 第二个 ( title) 必须是required: trueonly if typeis(one | two)并且必须是falseif type is three

我怎么能用猫鼬做呢?

编辑:感谢您的回答。我还有一个相关的问题要在这里问:

如果不需要,我可以删除字段吗?假设类型 ifthree但也提供了title字段。为了防止存储不必要title的在这种情况下如何删除它?

4

3 回答 3

2

required您可以为mongoose 中的验证器分配一个函数。

Schema.add({
  title: String,
  required: function(value) {
    return ['one', 'two'].indexOf(this.type) >= 0;
  }
});

文档没有明确说明您可以使用函数作为参数,但是如果您单击,show code您将看到为什么这是可能的。

于 2015-04-02T14:58:23.693 回答
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"']
});

更新:我应该注意到验证器仅在未定义字段且唯一需要的例外情况下运行。所以,这不是一个好的选择。

于 2015-04-02T17:33:16.753 回答
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
    }
});
于 2015-04-02T14:45:43.603 回答