提问者:小点点

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


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

-我将XML文件转换为javascript对象,并循环使用它来插入数据。我的问题是我需要循环是异步的,因为我不希望在pets表中有重复的记录。对于每次迭代,我检查宠物是否存在,如果它不存在,我就创建它,否则我就获取它的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个答案

匿名用户

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

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