首页 > 解决方案 > 删除 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

标签: node.jsmongodb

解决方案


要删除数组中的项目,您需要使用$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允许过滤掉您不感兴趣的测验。


推荐阅读