node js mongoose从文档数组中的id中删除a

时间:2017-07-22 16:49:36

标签: node.js mongodb mongoose

我将两个集合的参考集合在一起。其中一个集合是用户,另一个集合是项目。

因此,用户可以将项目添加到项目集合中,然后其中一个名为supervisor的用户类型可以将人员添加到项目中,项目ID保存到用户集合中,该用户集合引用项目集合上的员工文档。

实际上,当管理员从用户集合中删除主管时,我需要这样做,它会删除由主管用户的id创建的所有项目,这些项目等于从users集合中删除的addedBy文档。

所以我的问题是当我做这个过程时我需要删除所有项目id等于用户集合projectId。这是一个阵列,我尝试多次这样做,但我找不到解决方案。我将提供所有源代码。我为这个项目创建的。

用户集合

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 个答案:

答案 0 :(得分:3)

认为问题是

(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) {中没有第二个参数。同样,您的userId中没有ProjectSchema字段。

我愿意

// 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是一个ObjectID数组,因此您需要使用$in(参见第一个示例)。

除此之外:projects是比projectId更好的名称。后者含糊不清,因为用户有多个projects而非projectId s。

答案 1 :(得分: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 })
                    }
                })