使用Node.js Mongoose从文档数组中按ID删除一个a。

4

我有两个参考集合,这两个集合共同使用。其中一个集合是用户,另一个集合是项目。

因此,用户可以将项目添加到项目集合中,然后称为监督员的用户类型可以向项目添加工作人员,并且项目ID保存到用户集合中,该集合引用了项目集合上的工作人员文档。

因此,实际上,当管理员从用户集合中删除监督员时,它会删除由监督员用户ID创建的所有项目,这些项目等于从用户集合中删除的addedBy文档。

所以我的问题是,当我执行此过程时,我需要删除与用户集合projectId相等的所有项目ID。它是一个数组,我尝试过多次,但是我找不到解决方案。我将提供为此项目创建的所有源代码。

用户集合

const userSchema = new Schema({


firstName: {
        type: String
    },
    lastName: {
        type: String
    },
    email: {
        type: String
    },
    username: {
        type: String
    },
    password: {
        type: String
    },
    usertype: {
        type: Schema.ObjectId,
        ref: 'usertypes'
    },
    projectId: [{
        type: Schema.ObjectId,
        ref: 'projects'
    }]
});

项目集合
const proSchema = new Schema({
projectName: {


    type: String
    },
    description: {
        type: String
    },
    addedBy: {
        type: Schema.ObjectId,
        ref: 'users'
    },
    staff: [{
        type: Schema.ObjectId,
        ref: 'users'
    }]
});

以下是我尝试使用的查询语句,用于执行我上述提到的过程。

Users
.findByIdAndRemove({
    _id: req.params.id
})
.then(function(){
    Projects
    .remove({
        userId: req.params.id
    })
    .then(function(err, project){
        if(err) throw err;
        console.log(project.id)
        Users
        .update({}, { 
            $pull: {
                projectId: project.id
            }
        }, function(){
            res.json({
                success: true,
                message: "Deleted"
            });
        });
    });
});
2个回答

4

我认为问题如下:

(1) Model.findByIdAndRemove 只需传入 ID(不需要条件),即使用 Users.findByIdAndRemove(req.params.id) 而不是 Users.findByIdAndRemove({ _id: req.params.id })

(2) Model.remove 的回调函数中没有第二个参数,应该把 Projects.remove({ userId: req.params.id }).then(function (err, project) { 改为 Projects.remove({ userId: req.params.id }, function(err) {。此外,在你的 ProjectSchema 中没有 userId 字段。

我的建议是:

// delete user
Users.findByIdAndRemove(req.params.id, function (err, user) {
    console.log('deleting user', user);
    if (err)
        throw err;
    // delete user's projects
    Projects.remove({ addedBy: user._id }, function (err) {
        console.log('deleting projects');
        if (err)
            throw err;
        // delete project references
        Users.update({}, { $pull: { projectId: { $in: user.projectId }}}, function (err) {
            console.log('deleting project references');
            if (err)
                throw err;
            res.json({ success: true, message: "Deleted" });
        });
    });
});

(3) user.projectId是一个ObjectIDs数组,所以你需要使用$in(参见第一个示例)。

另外:projectsprojectId更好的名称。后者含义不明确,因为用户有多个projects而不是projectId


你能帮我回答这个问题吗?https://stackoverflow.com/questions/56597540/nested-id-object-not-getting-deleted-in-mongoose/56598007?noredirect=1#comment99772564_56598007 - NoobCoder

0
User.findByIdAndUpdate(req.params.idRec, 
{ $pull: { comments: { _id: comm._id } } }, 
 function (err, doc) {
                    if (!err) {
                        res.status(200).send()
                    } else {
                        res.render('error', { error: err })
                    }
                })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接