вложенный запрос mongoos, дождитесь второго запроса для возврата данных - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть следующая коллекция:

коллекция A:

 {
      _id: 5e8b1dd9e45da75adb2278fd,
      mobile: '445566',
      content_id: 5e8b1d1ae45da75adb2278fc,
      active: false,
    }

У меня есть другая коллекция, подобная этой:

коллекция B:

{
    title: {
      en: 'example title',
      xx: 'another title',
    },
    body: {
      en: 'example body',
      yy: 'another body',
    },
    _id: 5e8b1d1ae45da75adb2278fc,
  }

, если вы видите, что первая коллекция содержит _id второй коллекции, поэтому я использую mon goose, и каждый из них я могу перечислить отдельно, и он работает нормально. Теперь я хочу получить все элементы в столбце А, и поскольку это массив элементов, я хочу сделать что-то вроде этого:

async (req, res, err) {
  const allContents = [];
  const mobile = [];

  mobiles = await MyCollectionA.find({mobile: req.params.mobile})

  mobiles.forEach(async (mobile) => {
      const content = await MyCollectionB.findById(mobile.content_id);
      allContents.push(mobile, content);
      // if I do console.log(allContents), here I have all needed data available
  });
  console.log(allContents) // show me empty array, []
  res.json(allContents);
}

кажется, что он не ждет, пока forEach завершит свою работу; Я попробовал mon goose stream и не смог достичь того, чего хочу.

1 Ответ

2 голосов
/ 07 апреля 2020

Вы можете заставить его ждать, используя "for" l oop или используя Promise.all, как я показал ниже:

async (req, res, err) {
  const allContents = [];
  const mobile = [];

  mobiles = await MyCollectionA.find({mobile: req.params.mobile})

  await Promise.all( mobiles.map(async (mobile) => {
      const content = await MyCollectionB.findById(mobile.content_id);
      allContents.push(mobile, content);
  }));
  console.log(allContents) // show me empty array, []
  res.json(allContents);
}
...