如何在MongoDB与Vue.js中实现字段联合唯一校验?
解决方案
问题原因
你当前为firstName、lastName字段分别设置了单独的唯一约束,只要任意一个字段和已有数据重复就会触发校验报错,不符合「两个字段组合才唯一」的需求。
1. 修改后端Mongoose Schema
移除两个字段单独的unique配置,新增复合唯一索引:
const uuid = require("uuid"); const mongoose = require("mongoose"); const Schema = mongoose.Schema; let informationSchema = new Schema ({ _id: {type: String, default: uuid.v1}, firstName: { type: String, required:true, trim: true }, lastName: { type: String, required:true, trim: true } }); // 新增复合唯一索引,只有firstName和lastName同时重复才会触发唯一校验 informationSchema.index({ firstName: 1, lastName: 1 }, { unique: true }); module.exports = mongoose.model('informations', informationSchema)
2. 修复前端代码错误
你当前前端提交请求时传递的this.student未定义,实际存储表单数据的是this.name,需要修改提交逻辑:
handleSubmitForm() { let apiURL = 'http://localhost:3000/name'; axios.post(apiURL, this.name).then(res => { console.log(res) }).catch(error => { console.log(error) // 可在此处增加错误提示逻辑,比如姓名组合已存在的toast提示 }); }
3. 可选:后端错误兼容
后端接口处理插入请求时,可捕获MongoDB重复键错误(错误码为11000),返回友好提示给前端,Express框架示例如下:
app.post('/name', async (req, res) => { try { const info = await Information.create(req.body); res.json(info); } catch (err) { // 捕获重复键错误 if (err.code === 11000) { return res.status(400).json({ msg: '该姓名组合已存在,请勿重复提交' }); } res.status(500).json(err); } })
校验逻辑生效注意事项
修改Schema后,原集合中已经存在的单字段唯一索引不会自动删除,需要手动处理:
- 开发环境可直接删除
informations集合,重启服务后Mongoose会自动创建新的复合索引 - 生产环境可进入MongoDB Shell执行
db.informations.dropIndex("firstName_1")和db.informations.dropIndex("lastName_1")删除旧索引
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

