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

Node.js 如何使用mongoose保存多个文档?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我这里有两个型号user和blog。所以当用户写博客时,我的路由器会这样调用他们 Promise.all([ node.save(), user.save() ]).then(function (values) { //do something }).catch(functi

我这里有两个型号
user
blog
。所以当用户写博客时,我的路由器会这样调用他们

Promise.all([
                    node.save(),
                    user.save()
                ]).then(function (values) {                    
                    //do something
                }).catch(function (err) {
                    //print error
                })
您可能会立即注意到,
save()
无法保证。它们中的任何一个都可能失败,其余的都不会回滚。如何确保它们都已保存或回滚?有些人建议将
博客
收藏放在
用户
中,这样所有内容都在一个文档中,但这很难进行博客排名,不是吗?我也不确定在MongoDB中将所有东西放在一起是否真的是一个好的实践。如果文档很大,是否会导致性能问题(例如请求/秒)


谢谢。

你不能使用承诺。总之,你必须将你的承诺单独链接起来

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进行两阶段提交。如果你真的需要这个,也许你用错了工具

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


如果你真的需要一个两阶段的提交,你需要重新发明这个特殊的轮子。有一个食谱可以在家里做。或者你可以尝试一个猫鼬插件,声称这样做

问题是“为什么要使用
.save()
?”。它“某种程度上”会返回一个承诺,但实际上它会提前发射。因此,输出将加入
Promise.all()
,但实际的顺序将发生在
.save()
上。如果这些是“新的”,那么您可以使用
.create()
,这很好地遵守了承诺。如果它们是“更新”,那么您可能应该改用
.findOneAndUpdate()
。您好,我希望
节点
用户
都能正确保存。Promise可以告诉我是否有任何错误,这样我就可以向客户端返回适当的http代码。然后我发现即使我知道有错误,我也无法回滚那些保存的数据。我是MongoDB的新手,不知道为什么它是这样设计的:Oapprecate!现在我知道到底是怎么回事了这里一个:D