2016-04-18 4 views
0

私のケースは、私は別のコレクションに格納されている私のユーザーのためのNのアドレスとNの連絡先情報があります。mongoose synchronousを使ってN-1の挿入/更新を行う方法は?

これを同じコレクションに保存する必要がありますか?そうでない場合は、下のコードをどのように動作させることができますか?

MongooseクエリがAsynであることに注意してください。そのため、最初のアドレスがモデルにプッシュされていなくてもユーザーを保存できます。

createUser: function(req, res) { 
     var _user = new Models.User(req.body); 

     for (var item in _postData.address) { 
      var _address = new Models.Address(_postData.address[item]); 
      _address.save(function(err) { 
       if (err) { res.send({status: 500, message: 'Error while saving address'}); return; } 
       _user.address.push(_address); 
      }); 
     } 

     for (var item in _postData.contacts) { 
      var _contact = new Models.Contact(_postData.contacts[item]); 
      _contact.save(function(err) { 
       if (err) { res.send({status: 500, message: 'Error while saving contact'}); return; } 
       _user.contacts.push(_contact);    
      }); 
     } 

     _user.save(function(err) { 
      if (err) { res.send({status: 500, message: 'Error while saving user'}) return; }; 
      res.send(_user); 
     }); 
    }, 

答えて

0

あなた_postDataから来ている、しかし、あなたはおそらくreqからソースまたは明示的にそれを渡したいところわかりません。

ここで重要な点は、ここでコールバックを尊重する必要があることと、resを1度だけと使用できることです。だからどこでも失敗すると、実際にプロセスが停止するはずです。

asyncライブラリーのasync.parallelメソッドを使用すると、より多くのフロー制御のためにasync.waterfallと一緒にここで最高の制御が得られます。 Model.create()を使用すると、あなたはむしろ.save()でループするよりも、一つのリクエスト内のすべてのオブジェクトを作成することができます:

createUser: function(req,res) { 
    async.waterfall(
    [ 
     // Ouput from here "waterfalls" into the next function 
     function(callback) { 
     // This creates one output object with two keys 
     // of "array" data for the created items 
     async.parallel(
      { 
      "address": function(callback) { 
       Models.Address.create(_postData.address,callback); 
      }, 
      "contact": function(callback) { 
       Models.Contact.create(_postData.contact,callback); 
      } 
      }, 
      callback 
     ); 
     }, 
     // Takes combined output to produce a user 
     function(data,callback) { 
      var _user = new Model.User(req.body); 
      _user.address = data.address; 
      _user.contact = data.contact; 
      _user.save(callback); 
     } 
    ], 
    function(err,user) { 
     // Any errors came directly here, as does all success 
     if (err) { 
     res.send(500,err); 
     } else { 
     res.send(user); 
     } 
    } 
); 
} 

個人的にあなたの参照のためだけに「ブラインド作成」のデータであるため、私はここでさらに問題を参照してくださいのに。 .findOneAndUpdate()から、既存の可能なデータを「検索または作成」し、そのオブジェクト(存在する可能性がある)を返して配列として参照として保持する方がよいでしょう。

ただし、リレーショナルデータベースではなくオブジェクトストアを使用するという概念に合わせて調整することもできます。この場合、このデータが実際に現在のUser以外で使用されていない場合は、他のコレクションを参照するのではなく、データを「埋め込む」方がよいでしょう。

「埋め込み」データの場合は、他のオブジェクトのすべてのデータもUserと同じドキュメントに保存されるため、いずれにしても更新は1つだけです。

ここのコンセプトに完全に "上向き"に見えないので、思考のための食べ物。