猫鼬,从数组中删除 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 之后减一被删除。知道什么是最好的方法吗?

我试过:

  1. 将销毁路线更改为更新路线,然后将 Collection 中的绘画数组完全替换为更新版本,但这似乎不起作用——我认为是因为 Collection 模式中的数组实际上不是 object 的数组,而是 ObjectIds 的数组?

  2. 重定向(从销毁路线的末端)到更新路线,该路线循环遍历 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);
                }
            })
        }
    })
});