2016-04-18 56 views
0

我的情況是,我有N個地址和N個聯繫人信息供我的用戶使用,這些信息存儲在不同的收藏夾中。如何使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一次。所以任何地方的失敗都應該停止這個過程。

來自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本身相同的文檔中。

思考的食物,因爲你似乎沒有完全「上」這裏的概念。