Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb/mongoose,更改两个文档时如何确保数据一致_Mongodb_Mongoose_Consistency - Fatal编程技术网

mongodb/mongoose,更改两个文档时如何确保数据一致

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);

假设我有一个mongoDB数据库,我在其中创建了一个属于用户的文档,其中文档和用户都存储在数据库中

让我们进一步假设user对象包含对文档的引用

创建一个新文档可能看起来像这样

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一起使用。有趣的是,您的链接现在重定向到