2017-01-05 24 views
0

我正在构建一个web应用程序,我花了很长时间来处理相关文档之间的更新。MongoDB在帖子和评论之间自动更新

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

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的tasks属性并删除taskA的id。

有没有什么捷径和自动处理方法?感谢您抽出时间阅读它。让我知道如果我太模糊,我会添加更多细节。

+0

您的问题是因为您设计数据库的方式。您选择保留不同文档中的重复值。这将有助于更快地读取数据库,但写入时必须小心以保持数据库的一致性。如果集合之间存在许多关系,写操作在某些点上可能会很乏味,就像现在一样。 为了解决这个问题,你可以考虑重新设计你的数据库结构与集合之间的关系。 – Khang

+0

@Khang是啊,那就是我的感受。我知道我所做的事情有问题。那么,我现在应该怎么做。顺便说一下,据我所知,当我使用mysql时,有一个非常方便的方法来处理这个问题。例如,在帖子和评论之间建立关系,如果帖子被删除,则与帖子相关的所有评论也将被一起删除。我正在研究mongodb是否具有相同的功能,但我对此持怀疑态度。有没有人知道如何在MongoDB中做到这一点? – supergentle

回答

-1

我找到了一种方法,可以轻松完成此操作,而且代码行数更少。通过这样做,大约100条线减少到大约30条线。长话短说,我使用'update()'方法和各种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); 
    }); 
    }); 
}); 
}); 

希望这可以帮助一些人!

1

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

但我看到你正在使用Moongose的标签,所以使用post save hook可以做到这一点。您可以设置一个挂钩,每次更新任务时自动更新用户集合,反之亦然。


另一个选项是改变你的数据estructure,但是这取决于你的情况,也有一些事实考虑。我认为我们没有足够的信息来判断,但在MongoDB中有很多关于数据规范化的资源,例如官方的MongoDB manual

+0

我觉得我选择mongodb时没有仔细研究它的用法。我很确定mysql会是我的项目更好的选择......顺便说一句,谢谢你的回答。它帮助我理解了很多。 – supergentle