如何优化循环插入数据库?

时间:2015-04-04 14:47:03

标签: javascript mysql node.js sails.js waterline

您好我正在尝试将从XML文件中获取的数据插入到MySql数据库中。我正在使用Sails.js和waterline进行查询。 我的桌子是用户和宠物,用户可以有多个宠物,宠物可以有多个用户(所有者),所以我的连接表是users_pets。

-I将XML文件转换为javascript对象并循环插入数据。我的问题是我需要循环异步,因为我不想在宠物表中重复记录。对于每次迭代,我正在检查宠物是否存在,是否我没有创建它,否则我将其ID并将其插入正在插入的用户。如果这不是异步,多个" findOrCreate"同时触发,并在数据库中创建宠物的副本。

如何优化此代码?对于一个125用户xml和他们的宠物,它需要大约85秒,这是巨大的。

XML:

<users>
  <user>
    <pets>
      <pet>
      </pet>
    </pets>
  </user>
  ...
</users>

代码:

async.eachSeries(users, function(user, callback) {
  var pets = [];
  async.eachSeries(user.pets, function(pet, callback) {
   pets.findOrCreate({name: pet.name}).exec(function (err,userPet) {
      pets.push(userPet.id);
      callback();
    });
  }, function(err){
    users.create({name: user.name, pets: pets})
    .exec(function(err, created) {
      callback();
    });
  });
}, function(err){
  ...
});

1 个答案:

答案 0 :(得分:1)

在sails.js中,您可以将一组对象发送到.create(),将一组ID发送到.find()。所以你可以这样做:

Pet
    .find(user.pets)
    .then(function (pets) {
        return User.create({ name: user.name, pets: pets });
    })
    .then(function (users) {
        // done
    });