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

Javascript 如何优化循环以插入数据库?,javascript,mysql,node.js,sails.js,waterline,Javascript,Mysql,Node.js,Sails.js,Waterline,您好,我目前正在尝试将从XML文件获取的数据插入MySql数据库。我正在使用Sails.js和waterline进行查询。 我的表是用户和宠物,一个用户可以有多个宠物,一个宠物可以有多个用户(所有者),所以我的加入表是Users\u Pets -我将XML文件转换为javascript对象,并循环它以插入数据。我的问题是我需要循环是异步的,因为我不想在pets表中重复记录。对于每次迭代,我都会检查宠物是否存在,如果不存在,我会创建它,否则我会获取它的ID并将其插入到被插入的用户。如果这不是异步的

您好,我目前正在尝试将从XML文件获取的数据插入MySql数据库。我正在使用Sails.js和waterline进行查询。 我的表是用户和宠物,一个用户可以有多个宠物,一个宠物可以有多个用户(所有者),所以我的加入表是Users\u Pets

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

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

XML:


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

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

是否更适合这种情况,因此您的XML复制了pets?也许您可以先删除其中的重复项,然后使用async.parallel而不是第一个async.eachSeries。
如何优化要插入到数据库中的循环
不使用要插入到数据库中的循环进行优化。您应该能够进行批量插入。@LaggingReflect此代码似乎已被缩短并删除了上下文,可能会在代码审阅时被视为“示例代码”,因此作为主题外关闭。@Tulio我无法删除重复的宠物,因为多个用户可以拥有相同的宠物,这就是为什么我在创建一个新宠物并将其与用户关联之前检查每个宠物是否存在的原因。好吧,这只是部分原因,也许我不够清楚。有可能数据库中已有宠物,我们只需将其与现有宠物关联,而不是创建新宠物。当我导入xml数据时,可以添加一个pet,并与同一xml中的另一个用户关联。
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){
  ...
});
Pet
    .find(user.pets)
    .then(function (pets) {
        return User.create({ name: user.name, pets: pets });
    })
    .then(function (users) {
        // done
    });