You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

POST接口创建预约重复提交触发MongoDB重复键错误求助

预约创建重复提交报错问题解决

问题现象

首次提交可成功创建预约,但重复提交相同数据时返回500错误,错误信息如下:

{
    "success": false,
    "message": "E11000 duplicate key error collection: MCityVet.appointments index: patientId_1 dup key: { patientId: null }",
    "statusCode": 500
}

只有删除数据库中现有预约记录后才能再次创建,重复提交仍会触发相同错误,尝试使用uuid也无法解决。

相关代码

预约模型

import mongoose from 'mongoose';

const appointmentSchema = new mongoose.Schema({
    schedule: {
        type: String,
    },
    technicianName: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
    },
    firstName: {
        type: String,
    },
    lastName: {
        type: String,
    },
    phone: {
        type: String,
    },
    patient: {
        typeOfAnimal: {
            type: String,
        },
        numberOfHeads: {
            type: Number,
        },
        age: {
            type: Number,
        },
        services: [{
            type: String,
        }],
        address: {
            type: String,
        },
        landmark: {
            type: String,
        },
    },
});

const Appointment = mongoose.model('Appointment', appointmentSchema);
export default Appointment;

创建预约控制器

// Create Appointment
export const createAppointment = async (req, res, next) => {
  try {
    const { schedule, technicianName, firstName, lastName, phone, patient } = req.body;

    // Create a new appointment instance
    const newAppointment = new Appointment({
      schedule,
      technicianName,
      firstName,
      lastName,
      phone,
      patient,
    });

    // Save the appointment to the database
    const savedAppointment = await newAppointment.save();

    res.status(201).json(savedAppointment);
  } catch (error) {
    next(error);
  }
};

测试用JSON数据

{
  "schedule": "2023-11-15",
  "technicianName": "653f74dee45212eac760a17d",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "123-456-7890",
  "patient": {
    "typeOfAnimal": "Cat",
    "numberOfHeads": 2,
    "age": 2,
    "services": ["Grooming"],
    "address": "1234 Elm",
    "landmark": "Near park"
  }
}

问题原因

错误提示中的patientId_1索引并未在当前模型中定义,说明数据库中存在遗留的唯一索引:大概率是之前的模型版本包含patientId字段并设置了唯一约束,后续删除字段时未同步删除对应的索引。MongoDB会将所有缺失该字段的文档视为null值,当第二个文档插入时,null值重复触发唯一索引冲突。

解决步骤

  1. 查看并删除遗留索引
    打开MongoDB Shell或可视化工具(如Compass),执行以下命令:
    // 查看appointments集合的所有索引
    db.appointments.getIndexes()
    // 删除patientId_1索引
    db.appointments.dropIndex("patientId_1")
    
  2. 验证索引删除
    再次执行db.appointments.getIndexes(),确认patientId_1索引已被移除。
  3. 重新测试接口
    此时重复提交数据不会再触发重复键错误。

额外建议

  • 后续修改模型字段时,需同步检查数据库索引是否需要清理,避免遗留索引引发异常。
  • 若需对字段设置唯一约束,应在模型中显式定义(如unique: true),不要依赖手动创建的索引,便于版本同步维护。

内容的提问来源于stack exchange,提问作者Jays

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:14:57