【问题标题】:Mongoose, removing an object from an array and updating other objectsMongoose,从数组中删除一个对象并更新其他对象
【发布时间】:2018-04-26 19:12:12
【问题描述】:

我是一名网络开发新手,我正在尝试构建一个简单的可编辑图片库。我有一个 Collections 架构和一个 Paintings 架构:

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
});

我目前正在尝试添加一条销毁路线,该路线将从一个收藏中删除一幅画。到目前为止我有这个:

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);
        }
    });
});

但是,我还需要索引高于已删除对象的对象的所有“索引”属性在对象被删除后减一。知道最好的方法是什么吗?

我试过了:

  1. 将销毁路由更改为更新路由,然后将集合中的绘画数组完全替换为更新版本,但这似乎不起作用——我认为是因为集合中的数组schema 实际上不是对象数组,而是 ObjectId 数组?

  2. 重定向(从销毁路线的末端)到更新路线,该路线循环通过 Paintings.find({parent: type}) 找到的绘画并增加它们的 id,但我从未真正测试过这一点,因为当我尝试从销毁路线重定向时,我总是会收到错误消息:“无法获取绘画/:类型/:索引/删除”,即使我已将该路线设为放置请求,而不是获取请求。

有什么想法吗?任何事情都会非常感激,我显然有点在黑暗中摸索。非常感谢!

【问题讨论】:

  • 为什么要修改其他画的索引属性,这似乎是个坏主意。您需要 index 属性做什么,也许还有另一种方法可以在不将其作为属性存储在文档中的情况下获得它。
  • 因为我无法让 Collection 架构用于删除和更新路由,所以我不得不使用 Painting.findOneAndUpdate({parent: type, index: index}) 之类的东西来更新一幅画,所以我需要一个索引参数来首先找到这幅画。在尝试重做这一点时,我不确定如何使用它在 Collection 绘画数组中的位置来编辑或删除绘画
  • 拥有一个索引参数非常有用,因为它允许我构建索引并围绕有序索引而不是 id 显示页面。我不需要唯一的 ID,因为每个画廊只对其创建者/所有者可见。

标签: node.js mongodb express mongoose mongoose-schema


【解决方案1】:

通过消除绘画模式的索引属性并完全消除绘画模式来解决此问题,以便所有绘画仅作为集合中的对象存在:

var collectionSchema = new mongoose.Schema({
name: String,
paintings: [
        {
            img: String,
            description: String,
            parent: String
        }
    ]
})

然后,我改变了我的删除路线,使它实际上是一个从集合的绘画数组中提取正确绘画的放置路线:

//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);
                }
            })
        }
    })
});

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2019-10-23
    • 2018-09-11
    • 1970-01-01
    • 2019-03-25
    • 2020-10-07
    相关资源
    最近更新 更多