我有两个引用集合,两个集合在一起。其中一个集合是用户,另一个集合是项目。
因此,用户可以将项目添加到项目集合中,然后称为主管的用户类型之一可以将员工添加到项目中,并将项目 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/