节点js mongoose从文档数组中删除一个id

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

因此,用户可以将项目添加到项目集合中,然后用户types中的一个称为主pipe可以将人员添加到项目中,并将项目ID保存到参考项目集合中员工文档的用户集合中。

所以实际上,当pipe理员从用户集合中删除一个主pipe时,实际上我需要做的是删除由主pipe用户ID创build的所有项目,这些项目等于从用户集合中删除的addedBy文档。

所以我的问题是,当我做这个过程中,我需要删除所有的项目ID等于用户集合projectId。 这是一个数组,我试图做很多次,但我找不到解决scheme。 我将提供所有的源代码。 我为这个项目创build的。

用户集合

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的callback没有在Projects.remove({ userId: req.params.id }).then(function (err, project) {的第二个参数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 (见第一个例子)。

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