MongoDB数组对象Schema仅校验首个元素问题求助
MongoDB数组Schema校验问题解决办法
问题根源
你当前的Schema中,colors_available数组的items字段用了方括号包裹规则(比如items: [{...}]),这种写法只会让Mongoose校验数组的第一个元素,后续元素会跳过校验。直接移除方括号后功能失效,是因为没有正确定义单个元素的Schema规则。
正确的Schema写法
以下两种写法都能实现数组所有元素的校验:
写法1:基础类型数组简洁版
如果数组元素是基础类型(比如字符串),可以直接用数组包裹类型:
const mongoose = require('mongoose'); const ProductSchema = new mongoose.Schema({ // 其他业务字段示例 name: { type: String, required: true }, price: { type: Number, required: true }, colors_available: { type: [String], // 直接定义字符串数组 required: true, // 自定义校验确保每个元素是非空字符串 validate: { validator: (colors) => colors.every(color => color.trim() !== ''), message: '每个颜色必须是非空字符串' } } }); module.exports = mongoose.model('Product', ProductSchema);
写法2:自定义元素规则完整版
如果需要更复杂的元素校验(比如嵌套对象),用items字段定义单个元素的Schema:
const mongoose = require('mongoose'); const ProductSchema = new mongoose.Schema({ name: { type: String, required: true }, price: { type: Number, required: true }, colors_available: { type: Array, items: { // 去掉方括号,直接定义单个元素的规则 type: String, required: true, trim: true, minlength: 1 // 确保字符串长度至少为1 }, required: true, // 可选:校验数组不能为空 validate: { validator: (colors) => colors.length > 0, message: '颜色数组不能为空' } } }); module.exports = mongoose.model('Product', ProductSchema);
验证测试
发送如下POST请求体时,会触发校验错误(符合预期):
{ "name": "Test Shirt", "price": 29.99, "colors_available": ["red", "", 123] }
此时Mongoose会提示空字符串和数字不符合String类型及非空要求,而不是只校验第一个元素。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

