使用Mongoose中间件删除钩子从阵列中删除级联

时间:2015-10-30 20:42:30

标签: node.js mongodb express mongoose

我正在使用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' });
        } 
      });
    });
  }
});

1 个答案:

答案 0 :(得分:2)

您可以使用$pull查找“friends”数组中包含“ID”的所有文档 - 或者 - 找到任何匹配的文档,然后逐个弹出“ID”。