如何从猫鼬的嵌套对象数组中删除项目

时间:2020-07-20 17:42:07

标签: node.js mongoose

这是我的“用户”数据库的外观


{
    "_id" : ObjectId("5f1408d3c0e8c130503daafd"),
    "username" : "Akhil Jagga",
    "data" : [ 
        {
            "_id" : ObjectId("5f15cde9329fc9300c7f3843"),
            "nameOfList" : "home",
            "items" : [ 
                {
                    "_id" : ObjectId("5f15cde9329fc9300c7f3844"),
                    "nameOfItem" : "this is the list item"
                }
            ]
        }, 
        {
            "_id" : ObjectId("5f15cebd9a97051d80c6c6ad"),
            "nameOfList" : "personal",
            "items" : [ 
                {
                    "_id" : ObjectId("5f15cebd9a97051d80c6c6ae"),
                    "nameOfItem" : "this is the list item"
                }, 
                {
                    "_id" : ObjectId("5f15cfd0d73dc330dc8e7fd1"),
                    "nameOfItem" : "lol"
                }
            ]
        }
    ],
    "__v" : 48
}

我想使用nodejs中的猫鼬从“项目”数组中删除特定对象,例如ObjectId(“ 5f15cebd9a97051d80c6c6ae”)。

我尝试编写以下代码,但它不起作用:

app.post("/delete", redirectLogin, function(req, res) {
    const checkedItemId = req.body.checkbox;
    const checkedItemName = req.body.hiddenInput;
    const listName = req.body.listName;
    console.log("item id: " + checkedItemId);
    
    User.findOneAndUpdate(
        {
            username: req.session.userId
        }, 
        {
            $pull: {
                data: {
                    items: {
                        _id: checkedItemId
                    }
                }
            }
        },
        function(err, foundList) {
            console.log(foundList);
            res.redirect("/");
        });
});
  • 如果我将项目名称写在 id从包含该项目的数据数组中删除整个列表 名称和ID。

谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

尝试一下,

const username = req.session.userId;
const listName = req.body.listName;
const checkedItemId = req.body.checkbox;

User.update({ "username": username}, { "$pull": { `data.${listName}.items`: { "_id": checkedItemId } }}, { safe: true, multi:true }, function(err, obj) {
//do rest
});