问题描述
我有一个名为子类别的收藏,另一个名为类别的收藏 集合类别中有一个名为 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 } ]