Node.js MongoDB-无法从同一会话中删除多条记录

Node.js MongoDB-无法从同一会话中删除多条记录,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我试图在同一个会话中从不同的数据库(练习日志,学生)中删除两条记录,问题是练习日志记录已成功找到并显示在console.log(deletePracticeLog)中,但无法从数据库中删除。有人知道我做错了什么吗?我很困惑 const deleteStudentById = async (req, res, next) => { const sid = req.params.sid; let deleteStudent; let deletePracticeLog; try { de

我试图在同一个会话中从不同的数据库(练习日志,学生)中删除两条记录,问题是练习日志记录已成功找到并显示在console.log(deletePracticeLog)中,但无法从数据库中删除。有人知道我做错了什么吗?我很困惑

const deleteStudentById = async (req, res, next) => {
const sid = req.params.sid;
let deleteStudent;
let deletePracticeLog;

try {
  deleteStudent = await Students.findById(sid).populate("teacher");

} catch (err) {
const error = new HttpError("Delete failed, please try again.", 500);
return next(error);
}

try {
deletePracticeLog = await PracticeLog.find({ student: sid }).exec();
console.log(deletePracticeLog); // **<-this correctly show the record needed to be deleted, it's a object within an array**
} catch (err) {
const error = new HttpError("Cannot delete, please try again.", 500);
return next(error);
}

if (!deleteStudent) {
const error = new HttpError("Could not find student for this id.", 404);
return next(error);
}

try {
const sess = await mongoose.startSession();
sess.startTransaction();
await deleteStudent.remove({ session: sess }); //delete the student from student database
deleteStudent.teacher.students.pull(deleteStudent); //delete the student id from teacher        database
await deleteStudent.teacher.save({ session: sess });
await deletePracticeLog.remove({ session: sess }); // **<-this line caused error, when this line is removed, other code run successfully and other record are deleted.**
await sess.commitTransaction();
} catch (err) {
const error = new HttpError("Cannot delete student with provided id.", 500);
return next(error);
}

res.status(200).json({ message: "Deleted student." });
};
const deleteStudentById=async(req,res,next)=>{
const sid=req.params.sid;
让我们的学生;
让我们练习一下;
试一试{
deleteStudent=等待Students.findById(sid).populate(“教师”);
}捕捉(错误){
const error=new-HttpError(“删除失败,请重试。”,500);
返回下一个(错误);
}
试一试{
deletePracticeLog=wait PracticeLog.find({student:sid}).exec();

console.log(deletePracticeLog);//**当您使用
wait
时,您不需要
exec()

从中删除exec()

改为

deletePracticeLog = await PracticeLog.find({ student: sid })
因为您使用exec(),所以请使用此代码删除数据

await deletePracticeLog[0].remove({ session: sess })
如果
PracticeLog.find({student:sid})
的结果是一个数组,并且您想要删除所有数组,那么您必须像这样使用
deletemy

PracticeLog.deleteMany({ student: sid }).session(sess)

它对我很有效

当您使用
wait
时,您不需要
exec()

从中删除exec()

改为

deletePracticeLog = await PracticeLog.find({ student: sid })
因为您使用exec(),所以请使用此代码删除数据

await deletePracticeLog[0].remove({ session: sess })
如果
PracticeLog.find({student:sid})
的结果是一个数组,并且您想要删除所有数组,那么您必须像这样使用
deletemy

PracticeLog.deleteMany({ student: sid }).session(sess)

这对我很有效

这是猫鼬模式:

const mongoose = require("mongoose");

const studentsSchema = new mongoose.Schema({
  name: { type: String, require: true },
  email: { type: String, require: true },
  contact: { type: String, require: true },
  teacher: { type: mongoose.Types.ObjectId, require: true, ref: "teachers" },
  practiceLogs: [
    { type: mongoose.Types.ObjectId, require: true, ref: "practice_logs" },
  ],
});

module.exports = mongoose.model("students", studentsSchema);

const practiceLogSchema = new mongoose.Schema({
  repertoire: { type: String, require: true },
  student: { type: mongoose.Types.ObjectId, require: true, ref: "students" },
  teacher: { type: mongoose.Types.ObjectId, require: true, ref: "teachers" },
});

module.exports = mongoose.model("practice_logs", practiceLogSchema);
这是猫鼬。connect()


以下是猫鼬模式:

const mongoose = require("mongoose");

const studentsSchema = new mongoose.Schema({
  name: { type: String, require: true },
  email: { type: String, require: true },
  contact: { type: String, require: true },
  teacher: { type: mongoose.Types.ObjectId, require: true, ref: "teachers" },
  practiceLogs: [
    { type: mongoose.Types.ObjectId, require: true, ref: "practice_logs" },
  ],
});

module.exports = mongoose.model("students", studentsSchema);

const practiceLogSchema = new mongoose.Schema({
  repertoire: { type: String, require: true },
  student: { type: mongoose.Types.ObjectId, require: true, ref: "students" },
  teacher: { type: mongoose.Types.ObjectId, require: true, ref: "teachers" },
});

module.exports = mongoose.model("practice_logs", practiceLogSchema);
这是猫鼬。connect()


错误消息是什么?向此路径发送请求时,错误发生在最后一次捕获(“无法删除提供id的学生”)@mohammadyaserahmadi如果您得到自己的答案,请向上投票,错误消息是什么?向此路径发送请求时,错误发生在最后一次捕获(“无法删除提供id的学生。”@Mohammadyaserahmadi如果您得到自己的答案,请投票,tank you我以前尝试过这个,它对我的代码不起作用,只有我删除这一行,这个路径才起作用,但我无法删除练习日志…我运行了您的代码,删除了exec()你的代码是正确的,请给我看mongoose.connect(),我想看看我在下面发布的代码我更新了我的答案,请检查问题是否解决了?我以前尝试过这个,它对我的代码不起作用,只有我删除这一行,这个路径才起作用,但我无法删除练习日志…我运行了你的代码,删除了exec()你的代码是正确的,请给我看mongoose.connect(),我想看看我在下面发布的代码更新了我的答案,请检查问题是否解决了?