Как запросить модель с разными атрибутами

Я создаю приложение в Express и использую Postgres для своей базы данных, Sequelize для ORM.

В моей базе данных каждый Post может иметь один из 5 типов: 1, 2, 3, 4, 5.

Я хочу показать количество всех постов по типу.

router.route('/post).get(async (req, res) => {
  const postOne = await Post.findAll({
    where: { 
      state: 1
    }
  });
  const postTwo = await Post.findAll({
    where: { 
      state: 2
    }
});
res.send({ postOne: postOne.length, postTwo: postTwo.length });

Я могу написать так для всех 5 типов, но мне было интересно, есть ли более короткий способ сделать это, чтобы мне не приходилось писать один и тот же код 5 раз.

Спасибо!

какой фреймворк вы используете? какую БД вы используете?

skyboyer 12.04.2018 10:56

Я использую Node и Postgres

Tom Bomb 12.04.2018 10:58

вы уверены, что не используете ExpressJs или что-то в этом роде? Я считаю, что NodeJS не имеет ORM включен. Большинство ORM предоставляют функцию агрегирования, которая поможет вам получить все подсчеты за один запрос.

skyboyer 12.04.2018 11:05

спасибо @skyboyer Я разъяснил свой вопрос

Tom Bomb 12.04.2018 11:11

Теперь после уточнения кажется, что следующая ссылка - именно то, что вам нужно: stackoverflow.com/questions/22627258/…

skyboyer 12.04.2018 15:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
52
2

Ответы 2

const getPostWithType = (type) => Post.findAll({
  where: { 
    state: type
  }
});

Теперь вы можете использовать await getPostWithType(1). Или даже лучше:

const postTypes = [1,2,3,4,5];
const allPosts = await Promise.all(postTypes.map(getPostWithType));

// allPosts is now an array with the results. You can map it again to get the lengths
const allPostLengths = allPosts.map(p => p.length);

как насчет использования массива? Как показано ниже ...

let promiseArray = [];

for (let i = 1; i <= 5; i++) {
  let promise = Post.findAll({
    where: { 
      state: i
    }
  });

  promiseArray.push(promise);
}

Promise.all(promiseArray).then(function(response) {
  //Do whatever...
});

Другие вопросы по теме