邮件和评论之间的MongoDB自动更新反之亦然

时间:2017-01-05 20:30:31

标签: javascript node.js mongodb mongoose

我正在构建一个Web应用程序,我花了很长时间来处理相关文档之间的更新。

例如,我有'任务'文档和'用户'文献。完成任务后,将为其分配多个用户。因此,

taskA.assigned = ["1321231fsdfsdf"(userA's _id), "12312313asdasdasd"(userB's _id)]
userA.tasks = [..., "1231321"(taskA's _id),...]
userB.tasks = [..., "12313211"(taskB's _id),...]

当谈到创建任务时,我可以很好地处理它。但是,当我要编辑任务时,它变得太棘手了。如果用户B从taskA中删除,我必须删除userB的id并转到userB的任务属性并删除taskA的id。

有没有快捷方式和自动方式来处理它?感谢您抽出时间阅读本文。如果我太模糊,请告诉我,我会添加更多细节。

2 个答案:

答案 0 :(得分:1)

在像MySQL这样的关系型数据库中,使用外键和级联更新可以自动完成,但在MongoDB中是不可能的。

但是我在标签中看到你正在使用Moongose,所以使用post save hook可以解决问题。您可以设置一个钩子,每次更新任务时自动更新用户集合,或者反之亦然。

其他选择是改变您的数据结构,但这取决于您的情况,有一些事实需要考虑。我认为我们没有足够的信息来判断,但有很多资源在MongoDB中谈论数据规范化,你可以查看官方MongoDB manual

答案 1 :(得分:-1)

我找到了一种方法,可以轻松地执行此操作并减少代码行数。通过这样做,大约100行减少到大约30行。

长话短说,我使用了'更新()'方法和各种mongo运算符,例如$ in,$ push或$ pull。

以下是使用更新方法优化的最终代码。

var edit = req.body;
edit.assignedTo = edit.assignedTo.split(',');
var old = req.task;
var idQueries = edit.assignedTo.map(function (x) {
 return mongoose.Types.ObjectId(x);
});
User.update({tasks: old._id}, {$pull: {tasks: old._id}}, {multi: true}, function () {
 // Update to remove original task's id from users assigned to it. 
 User.update({_id: {$in: idQueries}}, {$push: {tasks: old._id}}, {multi: true}, function () {
  // Update to add edited tasks'id to new users assigned to it.
  old.lastAction = 'edited';
  old.edited = true;
  old.editedAt = Date.now();
  old.titke = edit.title;
  old.desc = edit.desc;
  old.dueBy = edit.dueBy;
  old.assignedTo = edit.assignedTo;
  old.save(function (err, task) {
   if (err) return next(err);
   User.populate(task, 'assignedTo', function (err, task) {
    res.json(task);
   });
  });
 });
});

希望对某些人有所帮助!