您好,我当前正在尝试将从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){
...
});
在sails.js中,可以将对象数组发送到.create()
中,将ID数组发送到.find()
中。所以你可以做这样的事情:
Pet
.find(user.pets)
.then(function (pets) {
return User.create({ name: user.name, pets: pets });
})
.then(function (users) {
// done
});