如何在猫鼬的对象数组中查找和删除特定对象

时间:2018-11-12 15:23:43

标签: node.js mongodb mongoose

我有以下猫鼬用户模式:

postCreated:{
    type: Array,
    default: []
}

包含属于该用户的帖子对象数组。我计划执行以下操作:删除特定帖子时,我将该帖子的ID和创建的用户的用户名传递给后端,并希望它将从Post模式和postCreated中删除该帖子。属于的用户

server.del('/posts',(req,res,next)=>{
    const {id,username} = req.body;
    User.findOne({username}).then(user => {
        console.log(user.postCreated)
        user.postCreated.filter(post => {
            post._id !== id;
        });
        console.log(user.postCreated)
    });
    Posts.findOneAndRemove({_id: id}).then((post) => {
        if(!post){
            return next(new errors.NotFoundError('Post not found'));
        }
        res.send(post);
    })
    .catch((e) => {
        return next(new errors.BadRequestError(e.message));
    });
});

但是,该帖子仅从Post Model中删除,而没有从User Model的postCreated中删除,这意味着user.postCreated.filter不起作用。

由于杰克,我尝试了以下方法,但似乎无法解决问题:

    User.update(
        { username },
        { $pull: { postCreated: {_id: id} } },
        { multi: true }
    );

有什么办法可以解决这个问题?

我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

如果要按照自己的方式进行操作,则需要将postCreated数组自身存储回去,然后保存用户:

User.findOne({username}).then(user => {
    console.log(user.postCreated)
    user.postCreated = user.postCreated.filter(post => {
        post._id !== id;
    });
    console.log(user.postCreated);
    user.save();
});

但是如果以后需要用户对象,最好的方法是findOneAndUpdate。

答案 1 :(得分:1)

您可以使用猫鼬 $ pull

使用:https://docs.mongodb.com/manual/reference/operator/update/pull/

User.update(
    { username },
    { $pull: { postCreated: id } },
    { multi: true }
);

这应该可以解决您的查询。