Mongoose使数组为必填项

31

我有一个类似于下面这样的猫鼬模型:

var ProjectSchema = new Schema({
    name: { type: String, required: true },
    tags: [{ type: String, required: true }]
});

我希望项目至少有一个标签是必须的。但是,当我保存一个没有标签数组的新项目时,mongoose不会抛出错误:

我希望项目至少有一个标签是必须的。但是,当我保存一个没有标签数组的新项目时,mongoose不会抛出错误:

var project = new Project({'name': 'Some name'});
project.save(function(err, result) {
    // No error here...
});

我在这里漏掉了什么?我如何指定需要一个数组?

3个回答

57

Mongoose 5.x

最初的回答

tags: {
    type: [String],
    validate: v => Array.isArray(v) && v.length > 0,
}

Mongoose 4.x

一句话概括:

tags: {type: [String], required: true}

SchemaTypes


不错,刚试了一下。没想到它能这样工作。谢谢。 - benjiman
1
@benjiman 注意,这个程序可以愉快地接受tags中非字符串的输入(但是我的答案中的代码可以捕获这些输入),只要这些输入可以被Mongoose转换为字符串。 - robertklep
如果我将 null 赋值给 tags,它可以工作,但如果我省略该属性,则不会抛出错误。 - Marco24690
3
对我来说这并不起作用,我尝试使用以下资格证:{type: [String], required: true},但当我没有发送资格证键时,它没有抛出任何错误。 - Manoj Rana
2
@ManojRana 在这里你可以找到解决方案:http://jasonjl.me/blog/2014/10/23/adding-validation-for-embedded-objects-in-mongoose/ - darshan a n
9
这个答案已经不再适用于 mongoose 版本5,因为其行为已经发生了改变。请参考 https://github.com/Automattic/mongoose/issues/5139。 - joniba

11

据我所知,您需要将type设置为Array并添加自定义验证器以确保每个条目都是String

tags : {
  type     : Array,
  required : true,
  validate : {
    validator : function(array) {
      return array.every((v) => typeof v === 'string');
    }
  }
}

完美运行。谢谢 :-) - benjiman
@benjiman,我能否传递一个需要的函数:doSome() 并返回 true 或 false 值?如果可以,它对我不起作用。如果不行,如何添加自定义验证函数来确定值是否为必填项? - darshan a n
@darshanan,你应该能够传递一个函数,但请确保你传递的是函数本身(doSome)而不是函数的结果(doSome())。 - robertklep

1

好的,我尝试了一种新方法,对于mongoose ^5.11.15来说似乎工作得很好。我不确定它是否是一个干净代码方面的适当答案,但就功能而言,它可以使数字/字符串数组必填(即不接受空数组),所以它的实现如下:

size: [{
        type: Number,
        required: true
}],

替代

size: {
        type: [Number],
        required: true
},

与其将类型定义为数字/字符串数组,我将大小定义为数字数组,然后所需属性按照预期工作,它不接受空数组并引发错误以说明问题。虽然我不确定这是否是定义所需数组的最佳方式,但就功能而言,它完全正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接