我正在使用Mongodb和mongoose构建一个Node.js表达RESTfull API。
这是我的架构:
var UserSchema = new mongo.Schema({
username: { type: String },
password: { type: String, min: 8 },
display_name: { type: String, min: 1 },
friends: { type: [String] }
});
UserSchema.post('remove', function(next){
console.log({ friends: this._id }); // to test if this gets reached (it does)
UserSchema.remove({ friends: this._id });
});
这是删除用户的功能:
.delete(function(req, res) {
User.findById(req.params.user_id, function(err, user) {
if (err) {
res.status(500);
res.send(err);
} else {
if (user != null) {
user.remove();
res.json({ message: 'User successfully deleted' });
} else {
res.status(403);
res.json({ message: 'Could not find user.' });
res.send();
}
}
});
});
我需要做的是,当用户被删除时,他或她的_id(字符串)也应该从所有其他用户中移除'朋友阵。因此,模式中的删除挂钩。
现在用户被删除并且钩子被触发,但是用户_id没有从friends数组中删除(用Postman测试):
[
{
"_id": "563155447e982194d02a4890",
"username": "admin",
"__v": 25,
"password": "adminpass",
"display_name": "admin",
"friends": [
"5633d1c02a8cd82f5c7c55d4"
]
},
{
"_id": "5633d1c02a8cd82f5c7c55d4",
"display_name": "Johnybruh",
"password": "donttouchjohnsstuff",
"username": "John stuff n things",
"__v": 0,
"friends": []
}
]
对此:
[
{
"_id": "563155447e982194d02a4890",
"username": "admin",
"__v": 25,
"password": "adminpass",
"display_name": "admin",
"friends": [
"5633d1c02a8cd82f5c7c55d4"
]
}
]
为了试图找出它我已经查看了Mongoosejs Documentation,但是mongoose doc示例并没有涵盖删除钩子。另外this stackoverflow qestion但这个问题似乎是关于从其他模式中删除。
我认为我错误地删除了钩子,但我似乎无法找到问题。
提前致谢!
编辑:
我无法获得cmlndz的第一个建议,所以我最终获取了包含待删除用户的数组的所有文档' id并逐一从它们中拉出来:
删除功能现在包含了一些魔术代码:
// retrieve all documents that have this users' id in their friends lists
User.find({ friends: user._id }, function(err, friends) {
if (err) {
res.json({ warning: 'References not removed' });
} else {
// pull each reference to the deleted user one-by-one
friends.forEach(function(friend){
friend.friends.pull(user._id);
friend.save(function(err) {
if (err) {
res.json({ warning: 'Not all references removed' });
}
});
});
}
});