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

标签 node.js mongodb mongoose

我有两个引用集合,两个集合在一起。其中一个集合是用户,另一个集合是项目。

因此,用户可以将项目添加到项目集合中,然后称为主管的用户类型之一可以将员工添加到项目中,并将项目 ID 保存到用户集合中,该用户集合引用项目集合中的员工文档。

所以实际上我需要做的是当管理员从用户集合中删除主管时,它会删除由主管用户的 id 创建的所有项目,这些项目等于从用户集合中删除的 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"
            });
        });
    });
});

最佳答案

认为问题是

(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) { 中没有第二个参数。同样,你没有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是一个ObjectID数组,所以需要使用$in (见第一个例子)。

旁白:projects 是一个比 projectId 更好的名字。后者是不明确的,因为用户有多个 project 而不是 projectId

关于node.js - node js mongoose从文档数组中的id中删除a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45256996/

相关文章:

node.js - 从Redis获取key同时过期

javascript - 如何从谷歌电子表格中删除行?

node.js - Mongoose:获取最新记录,然后按另一个字段对它们进行排序

mongodb - 如何通过MongooseJS操作/删除MongoDB中的子文档?

MongoDB 查找与聚合性能

node.js - 在 Google Cloud App Engine 中安装开发依赖项

javascript - 使用feathersjs创建后无法从对象中删除_id字段

mongodb - Mongoose/MongoDB 副本集使用辅助读取

MongoDB 抛出错误 Module not found : 'module'

javascript - 在 nodejs 困惑中返回 next()