如何使用mongoose保存多个文档?

时间:2016-04-19 03:37:57

标签: node.js mongodb mongoose

我这里有2个模型userblog。因此,当用户编写博客时,我的路由器会像这样调用它们。

Promise.all([
                    node.save(),
                    user.save()
                ]).then(function (values) {                    
                    //do something
                }).catch(function (err) {
                    //print error
                })

正如您可能立即注意到的那样,save()无法保证。其中任何一个都可能失败,其余的都没有回滚。如何确保它们都被保存或回滚?有些人建议将blogs集合放在users内,以便所有内容都在一个文档中,但是很难做博客排名,不是吗?我也不确定将所有内容整合到MongoDB中是否真的是一种很好的做法。如果文件很大,是否会导致性能问题(比如请求/秒)?

感谢。

1 个答案:

答案 0 :(得分:2)

你不能使用Promise.all,你必须单独链接你的承诺。

node.save().then(user.save).then(function(){//do something else});

你还需要更加努力地工作,以获得像Promise.all一样的数组中的所有实体。但你真的需要吗?您已经可以访问用户和节点实体。

执行此操作的经典方法是使用async和series:

async.series({

     node: node.save,
     user:user.save
}, function(err, res){
        // res is now equal to: {node:node, user:user}
   });

大多数人根本不会使用Mongo进行两阶段提交。如果你真的需要这个,也许你使用的是错误的工具。

如果 节点 保存失败,则不会保存 用户 。如果在未保存用户的情况下无法保存节点,请颠倒操作的顺序。如果两者都必须更新,我可能会重新考虑我的数据模型。

如果你真的需要两阶段提交,你需要重新发明那个特定的轮子。在documentation中有一个配方。或者你可以试试其中一个声称要做的猫鼬插件。