Usar findOne en un bucle lleva demasiado tiempo en Node.js

Estoy usando Node.js con MongoDB, también estoy usando Monk para acceso a base de datos. Tengo el siguiente código:

console.time("start");

collection.findOne({name: "jason"},
function(err, document) {

  for(var i = 0; i < document.friends.length; i++) // "friends is an array contains ids of the user's friends"
  {
    collection.findOne({id: document.friends[i]}, function(err, doc)
    {
      console.log(doc.name);
    });
   }

});

console.log("The file was saved!");
console.timeEnd("start");

Tengo dos preguntas con respecto a este código:

Veo el tiempo de ejecución y "¡El archivo se guardó!" primero, luego veo los nombres de los amigos que vienen en la consola. ¿Porqué es eso? ¿No debería ver primero los nombres y luego el tiempo de ejecución? ¿Es porque la naturaleza asincrónica de Node.js?Los nombres se imprimen muy lentamente en la consola, la velocidad es como un nombre en dos segundos. ¿Por qué es tan lento? ¿Hay alguna manera de acelerar el proceso?

EDITAR:

¿Es una buena idea dividir la lista de amigos en partes más pequeñas y llamar a los amigos de forma asincrónica? ¿Haría el proceso más rápido?

EDITAR 2:

Cambié mi código a esto:

collection.find({ id: { "$in": document.friends}}).then(function(err, doc)
{
  console.log(doc.name);

      if(err) {
      return console.log(err);
       }
}

Esto no da un error, pero tampoco imprime nada.

Gracias por adelantado.

Respuestas a la pregunta(5)

Su respuesta a la pregunta