node.js - 删除 Mongodb 对象中的数组对象
问题描述
我正在尝试从我的前端传递一个删除请求,以从我的 mongodb 集合中删除一个数组对象。通过我的尝试,网络日志显示在我的后端调用了正确的 deleteQuestion 函数作为消息“问题已成功删除”。正在返回 200 代码。
但是,我的数据库中的任何内容实际上都没有被删除。请参阅以下处理请求的函数。我还检查了在标头中发送了正确的 id,因此希望后端会使用这个正确的 id 来查找并仅从测验中的数组中删除问题。
export const deleteQuestion = async (req, res) => {
const { id } = req.params;
if (!mongoose.Types.ObjectId.isValid(id)) return res.status(404).send(`No post with id: ${id}`);
await Quiz.findByIdAndRemove(id);
res.json({ message: "Question deleted successfully." });
}
MongoDB 架构
import mongoose from 'mongoose';
const QuizSchema = mongoose.Schema({
quizName: String,
quizTheme: String,
shortDescription: String,
longDescription: String,
question: [{
question1: String,
question2: String,
question3: String,
question4: String,
answer: String
}]
})
const Quiz = mongoose.model("Quiz", QuizSchema, "quiz")
export default Quiz
解决方案
要删除数组中的项目,您需要使用$pull
更新运算符。你可以在这里阅读它https://docs.mongodb.com/manual/reference/operator/update/pull/
在您的特定情况下,它可以如下所示。
await Quiz.updateOne({}, { $pull: { question: { _id: id}}});
它应该可以工作,但我建议你使用
await Quiz.updateOne({ _id: quizId }, { $pull: { question: { _id: id}}});
因为id
如果您使用某种自定义逻辑来创建问题 ID,那么在整个集合中可能不是唯一的,在这种情况下,您可以在每个测验中删除此类问题。提供quizId
允许过滤掉您不感兴趣的测验。
推荐阅读
- wordpress - WP_User_Query 中断并忽略它下面的所有代码
- security - 隐藏从后端获取的用户数据
- neo4j - 在 neo4j 中获取可选数据的最快方法
- youtube - 如何通过 v3 API 检测 youtube 视频是否包含付费推广
- javascript - Javascript加入不适用于创建的数组
- python - Python,使用相对路径导入的模拟
- reactjs - React 中的上传列表状态管理
- visual-studio - 由于致命错误,无法在 Github 上克隆存储库
- python - Tkinter 在尝试从子进程读取标准输出时冻结
- php - laravel 7 根据所选值动态显示输入