 <p>While the answer of Kevin Le is correct it can get a little messy, because you're executing async functions inside a loop. Of course it works, but let's say you want to return the user with all pets and vaccines once it's finished - how do you do that?</p> <p>There are several ways to solve this problem. One is to use the <a href="http://caolan.github.io/async/" rel="nofollow">async library</a> which offers a bunch of util functions to work with async code. The library is already included in sails and you can use it globally by default. </p> <pre><code> User.findOneByName('TestUser') .populate('pets') .then(function (user) { var pets = user.pets; // async.each() will perform a for each loop and execute // a fallback after the last iteration is finished async.each(pets, function (pet, cb) { Vaccine.find({pet: pet.id}) .then(function(vaccines){ // I didn't find a way to reuse the attribute name pet.connectedVaccines = vaccines; cb(); }) }, function(){ // this callback will be executed once all vaccines are received return res.json(user); }); }); </code></pre> <p>There is an alternative approach solving this issue with bluebird promises, which are also part of sails. It's probably more performant than the previous one, because it fetches all vaccines with just one database request. On the other hand it's harder to read...</p> <pre><code>User.findOneByName('TestUser') .populate('pets') .then(function (user) { var pets = user.pets, petsIds = []; // to avoid looping over the async function // all pet ids get collected... pets.forEach(function(pet){ petsIds.push(pet.id); }); // ... to get all vaccines with one db call var vaccines = Vaccine.find({pet: petsIds}) .then(function(vaccines){ return vaccines; }); // with bluebird this array... return [user, vaccines]; }) //... will be passed here as soon as the vaccines are finished loading .spread(function(user, vaccines){ // for the same output as before the vaccines get attached to // the according pet object user.pets.forEach(function(pet){ // as seen above the attribute name can't get used // to store the data pet.connectedVaccines = vaccines.filter(function(vaccine){ return vaccine.pet == pet.id; }); }); // then the user with all nested data can get returned return res.json(user); }); </code></pre>