是否可以使用`required:true`验证条款?

时间:2015-04-02 14:16:51

标签: node.js mongodb validation mongoose mongoose-plugins

我有以下架构:

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: truetype时必须为(one | two),如果类型为false,则必须为three。< / p>

我怎么能用猫鼬做到这一点?

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

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

3 个答案:

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