hon*_*let 4 consistency mongoose mongodb
假设我有一个 mongoDB 数据库,我在其中创建了一个属于用户的文档,其中文档和用户都存储在数据库中。
让我们进一步说用户对象包含对文档的引用。
创建一个新文档可能看起来像这样。
exports.create = function (req, res, next) {
//make a new document
var newDoc = new Document({
title: req.body.title,
content: req.body.content,
});
User.findById(req.user._id, function (err, user) {
if (err)
return res.send(400);
user.documents.push(newDocument._id);
user.save(function(err){
if (err)
return res.json(400, err);
newDoc.save(function(err) {
if (err)
return res.json(400, err); //<--- What if you have an error here??
return res.json(200, {document:'successfully created'});
});
});
});
};
Run Code Online (Sandbox Code Playgroud)
如果您在最后一个 if(err) 出现错误,您将向用户添加对新文档的引用,但不会创建该文档。
当然,这是一个非常简单的案例。大量相互引用的文档可能会变得更加复杂。在 Mongo/Mongoose 中处理这个最干净的方法是什么?
看起来您的用户文档关系是一对多的。您当前添加新文档的操作需要写入两个集合。
MongoDB 不提供任何事务(也许将来会提供),因此如果文档保存失败,您唯一的选择是从用户文档数组中删除文档 ID。但这将需要另一次写入,这也可能会失败。
为了更加原子化并一次性完成所有工作,您可以将 userId 字段添加到 Document 集合中并从 User 集合中删除 decuments 数组。
还要在 Document 集合中的 userId 上创建一个索引。现在您的文档引用用户并创建新文档只需要一次写入。如果此写入失败,则您的数据库中不会发生任何变化,并且会保持一致性。
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |