вызов карты для коллекции после ее возврата по сравнению с цепочкой карт с использованием точки

#javascript #node.js #mongodb #asynchronous #mongoose

Вопрос:

Это работает так, как и ожидалось:

     let responses = await Response.find({
      responder_id: req.user._id,
    }).populate({ path: "query_id", select: ["query_type", "content"] });

    responses = responses.map((response) => {
      return response.query_id;
    });
 

Но ниже не указано:

     let responses = await Response.find({
      responder_id: req.user._id,
    })
      .populate({ path: "query_id", select: ["query_type", "content"] })
      .map((response) => {
        return response.query_id;
      });
 

Единственное, о чем я могу думать, — это, возможно, как-то связано с асинхронной природой этих функций.

Комментарии:

1. используйте .populate().exec().map() это должно помочь

Ответ №1:

Приоритет не таков, как вы думаете. То , чего ждут, не Response.find(...) есть, но Response.find(...).populate(...) . Имея это в виду, вот как правильно написать это во второй форме (с той лишь разницей, что это пара круглых скобок).:

 let responses = (await Response.find({
  responder_id: req.user._id,
})
  .populate({ path: "query_id", select: ["query_type", "content"] }))
  .map((response) => {
    return response.query_id;
  });
 

Однако для того, чтобы это было читабельно, потребуется сделать некоторые отступы. В любом случае, первый фрагмент может быть легче прочитать.