如何使用mongoose同步进行N-1插入/更新?

时间:2016-04-18 18:53:59

标签: node.js mongodb express mongoose

我的情况是,我的用户有N个地址和N个联系信息,这些信息存储在不同的收藏中。

我应该将它存放在同一个系列中吗?如果没有,我怎样才能使下面的代码工作?

请记住,Mongoose查询是Asyn,因此,即使第一个地址被推送到他的模型中,用户也可以保存。

view

1 个答案:

答案 0 :(得分:0)

不确定_postData的来源,但您可能希望从req采购或明确传递。{/ p>

这里的底线是你“两个”都需要尊重这里的回调,并意识到你只能使用res 一次。因此,任何地方的失败都应该实际上停止这个过程。

async.parallel库中的async方法可让您成为最佳控件,并提供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本身相同的文档中。

思考的食物,因为你似乎没有完全“理解”这里的概念。