猫鼬,从数组中删除 object 并更新其他 object
Mongoose, removing an object from an array and updating other objects
我是一名网络开发新手,我正在尝试构建一个简单的可编辑图片库。我有一个 Collections 模式和一个绘画模式:
var collectionSchema = new mongoose.Schema({
name: String,
paintings: [
{
type: Schema.Types.ObjectId,
ref: "Painting"
}
]
})
&&
var paintingSchema = new mongoose.Schema({
img: String,
description: String,
index: Number,
parent: String
});
我目前正在尝试添加一条销毁路线,该路线将从一幅画中删除一幅画 collection。到目前为止我有这个:
app.delete("paintings/:type/:index", function(req,res){
var type = req.params.type;
var index = req.params.index;
Painting.findOneAndRemove({parent:type,index:index},function(err,removedPainting){
if(err){
console.log(err);
} else{
res.redirect("/paintings/"+type);
}
});
});
但是,我还需要 object 的所有 "index" 属性,其索引高于已删除的 object 的索引,以便在 object 之后减一被删除。知道什么是最好的方法吗?
我试过:
将销毁路线更改为更新路线,然后将 Collection 中的绘画数组完全替换为更新版本,但这似乎不起作用——我认为是因为 Collection 模式中的数组实际上不是 object 的数组,而是 ObjectIds 的数组?
重定向(从销毁路线的末端)到更新路线,该路线循环遍历 Paintings.find({parent: type}) 找到的绘画并增加它们的 ID ,但我从来没有真正测试过这个,因为当我试图从销毁路由重定向时,我总是会收到错误:"cannot GET paintings/:type/:index/delete" 即使我已经将路由设为放置请求,而不是获取请求。
有什么想法吗?任何事情都将不胜感激,我显然在这里的黑暗中摸索着。非常感谢!
通过消除 Painting 模式的索引属性并完全消除 Painting 模式来解决此问题,以便所有绘画仅作为 Collections 中的一个对象存在:
var collectionSchema = new mongoose.Schema({
name: String,
paintings: [
{
img: String,
description: String,
parent: String
}
]
})
然后,我更改了我的删除路由,使其实际上是一条从 Collection 的绘画数组中提取正确绘画的放置路由:
//DESTROY
app.put("paintings/:type/:index/delete", middleware.isLoggedIn, function(req,res){
var type = req.params.type;
var index = req.params.index;
Collection.findOne({name:type},function(err,collection){
if(err){
console.log(err);
} else{
var idOfRemove = collection.paintings[index]._id;
Collection.findOneAndUpdate({name:type},{$pull:{ paintings:{ _id: idOfRemove}}}, function(err,removedPainting){
if(err){
console.log(err);
} else{
res.redirect("/paintings/"+type);
}
})
}
})
});
我是一名网络开发新手,我正在尝试构建一个简单的可编辑图片库。我有一个 Collections 模式和一个绘画模式:
var collectionSchema = new mongoose.Schema({
name: String,
paintings: [
{
type: Schema.Types.ObjectId,
ref: "Painting"
}
]
})
&&
var paintingSchema = new mongoose.Schema({
img: String,
description: String,
index: Number,
parent: String
});
我目前正在尝试添加一条销毁路线,该路线将从一幅画中删除一幅画 collection。到目前为止我有这个:
app.delete("paintings/:type/:index", function(req,res){
var type = req.params.type;
var index = req.params.index;
Painting.findOneAndRemove({parent:type,index:index},function(err,removedPainting){
if(err){
console.log(err);
} else{
res.redirect("/paintings/"+type);
}
});
});
但是,我还需要 object 的所有 "index" 属性,其索引高于已删除的 object 的索引,以便在 object 之后减一被删除。知道什么是最好的方法吗?
我试过:
将销毁路线更改为更新路线,然后将 Collection 中的绘画数组完全替换为更新版本,但这似乎不起作用——我认为是因为 Collection 模式中的数组实际上不是 object 的数组,而是 ObjectIds 的数组?
重定向(从销毁路线的末端)到更新路线,该路线循环遍历 Paintings.find({parent: type}) 找到的绘画并增加它们的 ID ,但我从来没有真正测试过这个,因为当我试图从销毁路由重定向时,我总是会收到错误:"cannot GET paintings/:type/:index/delete" 即使我已经将路由设为放置请求,而不是获取请求。
有什么想法吗?任何事情都将不胜感激,我显然在这里的黑暗中摸索着。非常感谢!
通过消除 Painting 模式的索引属性并完全消除 Painting 模式来解决此问题,以便所有绘画仅作为 Collections 中的一个对象存在:
var collectionSchema = new mongoose.Schema({
name: String,
paintings: [
{
img: String,
description: String,
parent: String
}
]
})
然后,我更改了我的删除路由,使其实际上是一条从 Collection 的绘画数组中提取正确绘画的放置路由:
//DESTROY
app.put("paintings/:type/:index/delete", middleware.isLoggedIn, function(req,res){
var type = req.params.type;
var index = req.params.index;
Collection.findOne({name:type},function(err,collection){
if(err){
console.log(err);
} else{
var idOfRemove = collection.paintings[index]._id;
Collection.findOneAndUpdate({name:type},{$pull:{ paintings:{ _id: idOfRemove}}}, function(err,removedPainting){
if(err){
console.log(err);
} else{
res.redirect("/paintings/"+type);
}
})
}
})
});