2016-04-19 10 views
1

私はここに2台のモデルuserblogを持っています。だから、ユーザーがブログを書くとき、私のルーターはこういうものを呼び出します。mongooseを使って複数の文書を保存するには?

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

すぐに気づくかもしれませんが、save()の保証はありません。どちらも失敗する可能性があり、残りのロールバックはできません。どのようにそれらの両方が保存されているかロールバックされていることを確認できますか?いくつかの人々は、blogsコレクションをusersの中に入れることを提案しています。すべてが1つの文書に収められていますが、それはブログランキングをするのが難しいですね。私はMongoDBにすべてのものをまとめることが本当に良いのかどうかも分かりません。ドキュメントが大きい場合は、パフォーマンスの問題(リクエスト/秒)が発生しますか?

ありがとうございました。

+0

質問は* "なぜあなたは' .save() 'を使用していますか?" *。それは約束を返しますが、実際には事前に発射されます。したがって、出力は 'Promise.all()'に参加しますが、実際のシーケンスは '.save()'で発生します。これらが "新規"の場合は、代わりに '.create()'を使うことができます。それらが "更新"の場合は、とにかく代わりに '.findOneAndUpdate()'を使うべきでしょう。 –

+0

こんにちは、 'node'と' user'の両方を正しく保存します。プロミスはエラーがある場合は教えてくれるので、適切なhttpコードをクライアントに返すことができます。それでエラーがあることがわかっても、私はそれらの保存されたデータをロールバックできません。私はMongoDBの新機能で、なぜこのように設計されたのか分かりません: – zhuchun

答えて

2

Promise.allを使用することはできません。プロミスを個別にチェーンする必要があります。

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

また、Promise.allのように、配列内のすべてのエンティティを取得するために少しでも作業をする必要があります。しかし、本当にそれが必要ですか?ユーザーおよびノー​​ドエンティティには既にアクセスできます。ほとんどの人は、単に2つの相モンゴを使用してコミットすると気にしないでください

async.series({ 

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

:これを行うには

古典的な方法は、非同期とシリーズを使用することでしょう。これが本当に必要な場合は、間違ったツールを使用している可能性があります。保存ノードに障害が発生した場合

ユーザーがは保存されません。ユーザーを保存せずにノードを保存できない場合は、操作の順序を逆にします。どちらかのために両方を更新しなければならない場合、おそらく私のデータモデルを再考するだろう。

2フェーズコミットが本当に必要な場合は、その特定のホイールを再作成する必要があります。 documentationでそれを行うためのレシピがあります。または、それを行うと主張するマングースプラグインの1つを試すことができます。

+0

ありがとう!今私はちょうどここにあるものを知っています:D – zhuchun