Mongoose,从数组中删除一个对象并更新其他对象

Posted

技术标签:

【中文标题】Mongoose,从数组中删除一个对象并更新其他对象【英文标题】:Mongoose, removing an object from an array and updating other objects 【发布时间】: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);
        
    );
);

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

我试过了:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于Mongoose,从数组中删除一个对象并更新其他对象的主要内容,如果未能解决你的问题,请参考以下文章

从Mongoose的数组中删除一个对象[重复]

Mongoose更新嵌套数组

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

从 Mongoose/MongoDB 中的数组中删除对象

Mongoose - 如何从数组元素中删除对象[重复]

如何用mongoose更新这个文档中的数组中的对象中的数组里的值?