создание объекта из запросов mongoose

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #mongoose

Вопрос:

Как я могу создать объект из результата запросов? В meals таблица функционирует с запросами к базе данных. Как я могу это сделать, если запросы асинхронны?

 const returnResultOfQuery = () => {
  Dinner1300.count().exec(function (err, count) {

    const random = Math.floor(Math.random() * count)
  
    Dinner1300.findOne().skip(random).exec(
      function (err, result) {
        console.log(result)
      })
  })  

 const week = [
  {id: 1, day: 1},
  {id: 2, day: 2},
  {id: 3, day: 3},
  {id: 4, day: 4},
  {id: 5, day: 5},
  {id: 6, day: 6},
  {id: 7, day: 7},
]

const diet = week
  .map(value => ({
    id: value.id,
    day: value.day,
    meals: [
      returnResultOfQuery(),
      returnResultOfQuery(),
      returnResultOfQuery()
    ]
  }))

  console.log(diet)  

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

1. Похоже, ваш пример не работает. Кроме того, не могли бы вы обновить свой вопрос, включив в него код для ваших запросов Mongo? На данный момент невозможно ответить на ваш вопрос, потому что мы не знаем, как выглядят ваши запросы

2. я добавил пример запроса

Ответ №1:

вы можете использовать код, это просто оболочка promise

 const returnResultOfQuery = () => {
return new Promise((resolve, reject) => {
    Dinner1300.count().exec(function (err, count) {
        const random = Math.floor(Math.random() * count)
        Dinner1300.findOne().skip(random).exec(
          function (err, result) {
            if (err) {
                return reject(err);
            }
            return resolve(result);
        });
     });
  });
}

const week = [
  {id: 1, day: 1},
  {id: 2, day: 2},
  {id: 3, day: 3},
  {id: 4, day: 4},
  {id: 5, day: 5},
  {id: 6, day: 6},
  {id: 7, day: 7},
]

 const diet = Promise.all(week
    .map(value => ({
      id: value.id,
      day: value.day,
      meals: [
        returnResultOfQuery(),
        returnResultOfQuery(),
        returnResultOfQuery()
      ]
   }))
 );

console.log(diet)
  

Ответ №2:

Один из способов добиться этого — сначала выполнить все запросы с помощью Promise.all и, как только вы получите результаты, создайте новый объект. Что-то вроде:

 const week = [
    { id : 1, day : 1 },
    { id : 2, day : 2 },
    { id : 3, day : 3 },
    { id : 4, day : 4 },
    { id : 5, day : 5 },
    { id : 6, day : 6 },
    { id : 7, day : 7 }
];

const returnResultOfQuery = () => {
    return Dinner1300.count ().exec ( function ( err, count ) { 
        const random = Math.floor ( Math.random () * count );

        return Dinner1300.findOne ().skip ( random ).exec (
            function ( err, result ) {
                console.log ( result );
                return resu<
            } );
    } );
};

let promises = [];

for ( let x in week ) {
    promises.push ( returnResultOfQuery () );
    promises.push ( returnResultOfQuery () );
    promises.push ( returnResultOfQuery () );
}

let diet = [];

Promise.all ( promises ).then ( function ( result ) {
    let i = 0;
    for ( let x in week ) {
        diet.push (
            {
                id : x.id,
                day : x.day,
                meals : [
                    result[ i ],
                    result[ i   1 ],
                    result[ i   2 ]
                ]
            }
        );
        i = i   3;
    }
} );

console.log ( diet );
  

P.S: Я не тестировал приведенный выше код.