Javascript Node.js从关联元素中删除元素
我添加了一个功能,用户可以将食谱固定到他们的个人资料中。但是,删除配方时,配方不会从用户的pinnedRecipes中删除,即使它没有出现在用户的显示页面上(ID保留在数据库中用户的pinnedRecipes中) 以下是配方和用户的羽状分类之间的关联:Javascript Node.js从关联元素中删除元素,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我添加了一个功能,用户可以将食谱固定到他们的个人资料中。但是,删除配方时,配方不会从用户的pinnedRecipes中删除,即使它没有出现在用户的显示页面上(ID保留在数据库中用户的pinnedRecipes中) 以下是配方和用户的羽状分类之间的关联: var userSchema = new mongoose.Schema({ username: String, password: String, admin: {type:Boolean, default: false
var userSchema = new mongoose.Schema({
username: String,
password: String,
admin: {type:Boolean, default: false},
bio: {type:String, default: "Cet utilisateur n'a pas encore rempli cette section."},
profileImage: {type:String, default: "http://www.wilwia.com/images/default-user.png"},
pinnedRecipes:[
{
type: mongoose.Schema.Types.ObjectId,
ref: "Recipe"
}
]
});
var recipeSchema = new mongoose.Schema({
title: String,
source: String,
image: String,
preplength: String,
cooklength: String,
portions: Number,
description: String,
ingredients: String,
instructions: String,
createdAt: { type: Date, default: Date.now },
author: {
id: {
type: mongoose.Schema.Types.ObjectId,
ref: "User"
},
username: String,
},
comments: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Comment"
}
],
category: {type:String, enum: ['appetizer', 'salad', 'soup', 'meat', 'pasta', 'breakfast', 'dessert']}
});
//DESTROY ROUTE
router.delete("/:id", middleware.checkRecipeOwnership, function(req, res){
Recipe.findById(req.params.id, function(err, foundRecipe){
if(err){
res.redirect("back");
} else {
//delete associated comments
if(foundRecipe.comments.length > 0){
Comment.remove({
_id: {
$in: foundRecipe.comments
}
}, function(err){
if(err){
console.log(err);
}
});
//delete from every user's pinned recipes
User.find({pinnedRecipes: "ObjectId(" + foundRecipe._id + ")"}, function(err, foundUsers){
if(err){
console.log(err);
} else {
console.log(foundUsers);
foundUsers.forEach(function(user){
user.pinnedRecipes.remove(foundRecipe);
user.save();
});
}
});
//remove the campground
foundRecipe.remove(function(err, recipe){
if(err){
console.log(err);
res.redirect("/recipes");
} else {
res.redirect("/recipes");
}
});
}
}
});
});
以下是我尝试过的,但没有成功(除了从pinnedRecipes中删除配方外,一切都有效):
此外,以下是如何固定食谱:
// PIN ROUTE
router.get("/pin/:id", middleware.isLoggedIn, function(req, res){
Recipe.findById(req.params.id, function(err, foundRecipe){
if(err){
req.flash("error", "Une erreur s'est produite.");
res.redirect("/recipes/" + foundRecipe._id);
} else {
User.findById(req.user._id, function(err, user){
if(err){
req.flash("error", "Une erreur s'est produite.");
res.redirect("/recipes/" + foundRecipe._id);
} else {
user.pinnedRecipes.push(foundRecipe);
user.save();
res.redirect("/recipes/" + foundRecipe._id);
req.flash("success", "Pinned recipe");
}
});
}
});
});
// UNPIN ROUTE
router.delete("/pin/:id", middleware.isLoggedIn, function(req, res){
Recipe.findById(req.params.id, function(err, foundRecipe){
if(err){
req.flash("error", "Une erreur s'est produite.");
res.redirect("/recipes/" + foundRecipe._id);
} else {
User.findById(req.user._id, function(err, user){
if(err){
req.flash("error", "Une erreur s'est produite.");
res.redirect("/recipes/" + foundRecipe._id);
} else {
user.pinnedRecipes.remove(foundRecipe);
user.save();
res.redirect("/recipes/" + foundRecipe._id);
req.flash("success", "Pinned recipe");
}
});
}
});
});
非常感谢 我发现您的代码存在两个问题:
- 您正在执行2个异步操作,而没有真正等待它们的响应。始终确保它们全部完成。因此,执行一个并等待其回调执行,然后执行另一个并等待其回调执行,然后执行下一个,以此类推
- 更重要的是:我不相信
会删除引用。您需要删除它[滚动到删除子文档部分]user.pinnedRecipes.remove(foundRecipe)
myDoc.remove()
时才会调用它,而不是在调用MyModel.remove()
时
我相信这将简化您的代码:
RecipeSchema.pre('remove', function (next) {
var recipe = this;
// remove recipe comments
Comment.remove({ _id: { $in: recipe.comments }}, function (err) {
if (err) {
return next(err);
}
// THEN remove users' recipe references
User.update({ pinnedRecipes: { $in: [recipe._id] }}, { $pull: recipe._id }, { multi: true }, function (err) {
if (err) {
return next(err);
}
next();
});
});
});
router.delete("/:id", middleware.checkRecipeOwnership, function (req, res) {
// notice we didn't do Recipe.remove(req.params.id, cb)
// b/c Recipe is the model and that would not trigger the hook
Recipe.findById(req.params.id, function (err, recipe) {
if (err) {
return res.redirect("back");
}
// this will trigger the hook b/c recipe is a document
recipe.remove(function (err) {
if (err) {
console.log(err);
}
res.redirect("/recipes");
});
});
});
谢谢Mikey,在下面的一行(在钩子中):User.update({pinnedRecipes:{$in:[recipe.\u id]},{$pull:recipe.\u id},{multi:true},function(err){,我得到了一个“语法错误,意外的标记:{”。我如何修复这个问题?另外,它不应该是{$in:recipe.\u id.pinnedRecipes}?非常感谢!缺少花括号
{pinnedRecipes:{$in:[recipe.\u id]}
。我不这么认为。您希望在其数组pinnedRecipes
中找到所有拥有recipe.\u id
的用户,然后将其从数组中删除。