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