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

标签 node.js mongodb express mongoose mongoose-schema

我是一名网络开发新手,我正在尝试构建一个简单的可编辑图片库。我有一个收藏模式和一个绘画模式:

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,但我从未真正测试过这个,因为当我尝试从 destroy 路由重定向时,我总是会收到错误消息:“cannot GET paintings/:type/:index/delete”,即使我已将路由设为 put 请求,而不是 get 请求。

有什么想法吗?任何事情都将不胜感激,我显然在这里的黑暗中摸索着。非常感谢!

最佳答案

通过消除 Painting 模式的索引属性并完全消除 Painting 模式来修复此问题,以便所有绘画仅作为 Collections 中的一个对象存在:

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

然后,我更改了我的 delete 路由,使其实际上是一个 put 路由,它从 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);
                }
            })
        }
    })
});

关于node.js - Mongoose ,从数组中删除一个对象并更新其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275593/

相关文章:

javascript - 连续Post请求 Node JS

javascript - 如何使用 Underscore.js 作为 Express v3 的 View 引擎

Node.js 多中间件导出模式

javascript - NodeJS + Mongo - 如何与 DOM 交互以从数据库获取数据?

javascript - 如何在基于 angular-fullstack 的应用程序中包含库文件 (css/js)

javascript - Mongoose :如何替换子文档数组?

node.js - MongoDB 错误 : failed to connect to [localhost:27017]

文件读取后 JavaScript 函数返回为空

javascript - CasperJS 不能要求下划线

mongodb - 在 mongodb-go-driver 中,如何将 BSON 编码/解码到结构中