Javascript - собирать данные из mongodb из нескольких коллекций, а затем объединять в массив - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу получить новейший объект из нескольких коллекций и сохранить все в массив с именем коллекции в качестве ключа и новейшим объектом в качестве значения.

Как я могу добиться этого последовательно или асинхронно?

        let dat = ["test", "test2"];
        let merged = [];

        dat.map((collName) => {
          const promise = new Promise((resolve, reject) => {
            db.collection(collName).find().sort({ timestamp: -1 }).limit(1).forEach((d) => {
              resolve(d);
            });
          })
          .then((result) => {
            merged.push(result);
          });

        console.log(merged);

Лог в конце дает мне пустой массив.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете попробовать использовать async / await как:

let dat = ["test", "test2"];

const promises = dat.map(async (collName) => {
    try {
        const data = await db.collection(collName)
             .find({})
             .sort({ timestamp: -1 })
             .limit(1)
             .toArray();
        return data[0];
    } catch(err) {
        console.error(err);
    }
});

(async () => {
    const merged = await Promise.all(promises);
    console.log(merged);
})();
0 голосов
/ 10 декабря 2018

Похоже, асинхронная проблема для меня.Вы можете обернуть свой код в функцию и полностью вернуть цепочку обещаний.Это должно дать вам полный массив.Тогда используйте его как вам нужно.

let dat = ["test", "test2"]

const mergeData = async () => {
  const promises = await dat.map(async (collName) => {
    let value = ''
    await new Promise((resolve, reject) => {
      db.collection(collName).find().sort({ timestamp: -1 }).limit(1).forEach((d) => {
        resolve(d)
      })
    }).then(response => {
      value = response
    })
    return value
  })
  const results = await Promise.all(promises)
  
  console.log('results: ', results)
}
mergeData()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...