使用Node.JS,Mongoose,MongoDB和Express删除对象时出现问题

问题描述

我有一个名为子类别的收藏,另一个名为类别的收藏 集合类别中有一个名为 subcategroies 的字段。 这是一个数组,其中包含子类别集合中的子类别的ID。

我有一个端点 DELETE / categories / categoryId / subcategoires / subcategoryId

subcategories.delete('/:categoryId/subcategories/:subcategoryId',async (req,res) => {
  try {
    const category = await Category.findById(req.params.categoryId);
    if(!category) return res.status(404).send("Cateory is not found");
    category.subCategories.remove( req.params.subcategoryId );
    const subCategory = await SubCategory.findByIdAndRemove(req.params.subcategoryId);
    if(!subCategory) return res.status(404).send("Subcategory is not found");
    res.status(202).send("Subcategory is deleted successfully");
  } catch (error) {
    res.send(error.message);
  }
}

所以我想从类别模型中的子类别数组中删除删除的子类别的ID。

category.subCategories.remove( req.params.subcategoryId );

我尝试了上面发现的这一行代码,但无法使用 Mongoose MongoDB Express 使用。

解决方法

在这里,在本地复制:

const mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/test2345",{
    useNewUrlParser: true
});
const db = mongoose.connection;
db.on("error",console.error.bind(console,"connection error:"));
db.once("open",async function() {


    await mongoose.connection.db.dropDatabase();
    // we're connected!

    console.log("Connected");

    const subcategoriesSchema = new mongoose.Schema({
        name: String
    });

    const categoriesSchema = new mongoose.Schema({
        name: String,subcategories: [{
            type: mongoose.Schema.Types.ObjectId,ref: 'Subcategory' //Edit: I'd put the schema. Silly me.
        }]
    });

    const Subcategory = mongoose.model("Subcategory",subcategoriesSchema);
    const Category = mongoose.model("Category",categoriesSchema);

    const cat1 = new Subcategory({
        name: "Pop"
    });
    const cat2 = new Subcategory({
        name: "Rock"
    });

    await cat1.save();
    await cat2.save();

    const ubercat = new Category({
        name: "Music",subcategories: [cat1._id,cat2._id]
    });
    await ubercat.save();

    async function removeSubcategory(categoryId,subcategoryId) {
        try {
            const category = await Category.findById(categoryId);
            if (!category) {
                console.log("No such category");
                return null
            }
            category.subcategories.remove(subcategoryId);
            category.save();
            console.log(subcategoryId);
            const subCategory = await Subcategory.findByIdAndRemove(subcategoryId);
            if (!subCategory) {
                console.log("No such subcategory");
                return null
            }
            console.log("Subcategory is deleted successfully");
        } catch (error) {
            console.log(error.message);
        }
    }

    await Subcategory.find(function(err,subcats) {
        if (err) return console.error(err);
        console.log(subcats);
    });

    await Category.find(function(err,cats) {
        if (err) return console.error(err);
        console.log(cats);
    });

    await removeSubcategory(ubercat._id,ubercat.subcategories[0]._id);
    console.log("After modification.");
    await Category.find(function(err,cats) {
        if (err) return console.error(err);
        console.log(cats);
    });

});

脚本中的问题是在category.subCategories.remove( req.params.subcategoryId );之后您丢失了category.save();,因此事务未提交给数据库。

添加save后的输出:

Connected
[ { _id: 5f439bf63224885dbc87e5cf,name: 'Pop',__v: 0 },{ _id: 5f439bf63224885dbc87e5d0,name: 'Rock',__v: 0 } ]
[ { subcategories: [ 5f439bf63224885dbc87e5cf,5f439bf63224885dbc87e5d0 ],_id: 5f439bf63224885dbc87e5d1,name: 'Music',__v: 0 } ]
5f439bf63224885dbc87e5cf
(node:23996) DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `useFindAndModify` option set to false are deprecated. See: https://mongoosejs.com/docs/deprecations.html#findandmodify
Subcategory is deleted successfully
After modification.
[ { subcategories: [ 5f439bf63224885dbc87e5d0 ],__v: 1 } ]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...