mongodb/mongoose,更改两个文档时如何确保数据一致
假设我有一个mongoDB数据库,我在其中创建了一个属于用户的文档,其中文档和用户都存储在数据库中 让我们进一步假设user对象包含对文档的引用 创建一个新文档可能看起来像这样mongodb/mongoose,更改两个文档时如何确保数据一致,mongodb,mongoose,consistency,Mongodb,Mongoose,Consistency,假设我有一个mongoDB数据库,我在其中创建了一个属于用户的文档,其中文档和用户都存储在数据库中 让我们进一步假设user对象包含对文档的引用 创建一个新文档可能看起来像这样 exports.create=函数(req、res、next){ //制作新文档 var newDoc=新文档({ 标题:req.body.title, 内容:req.body.content, }); User.findById(请求用户id,函数(err,User){ 如果(错误) 返回res.send(400);
exports.create=函数(req、res、next){
//制作新文档
var newDoc=新文档({
标题:req.body.title,
内容:req.body.content,
});
User.findById(请求用户id,函数(err,User){
如果(错误)
返回res.send(400);
user.documents.push(newDocument.\u id);
user.save(函数(err){
如果(错误)
返回res.json(400,err);
newDoc.save(函数(错误){
如果(错误)
return res.json(400,err);//看起来您的用户文档关系是一对多。当前添加新文档的操作需要写入两个集合
MongoDB不提供任何事务(将来可能会提供),所以如果文档保存失败,您唯一的选择是从users documents数组中删除文档id。但它将需要另一次写入,这也可能会失败
为了更加原子化并在一次写入中完成所有操作,您可以将userId字段添加到文档集合中,并从用户集合中删除decuments数组
还可以在文档集合中创建一个关于userId的索引。现在,您的文档引用了用户,创建新文档只需要一次写入。如果写入失败,则数据库中不会有任何更改,并且保持一致性。在思考我的问题时,我遇到了这个……与MongoDB讨论了两阶段提交。
这不是我会接受的答案,但我认为它是相关的。您似乎在寻找事务和回滚,而这是不存在的。如果您确实必须维护单独的集合,那么至少先尝试“保存”引用的文档。然后用引用更新“主”文档。任何“回滚”将必须手动完成。因此原子性的折衷是在查找用户的所有文档时必须执行查询。您在查找用户文档时仍然必须执行查询,因为您只有它们的_id。索引用户id字段使查询速度极快。您也可以将文档直接嵌入到用户中,但很可能是Documents增长超过16MB limit.Ah。我提供的示例代码与我的真实代码相比有点简化。在我的应用程序中,现在用户和文档相互引用。此外,您现在还可以将virtuals与mongoose一起使用。有趣的是,您的链接现在重定向到