Получите только dataValues из Sequelize ORM

Я использую sequelize ORM для извлечения данных из базы данных PSQL. Однако, когда я что-то получаю, дается целая куча данных. Единственные данные, которые я хочу, находятся внутри 'dataValues'. Конечно, я могу использовать object.dataValues. Но есть ли другие хорошие решения?

Я использую Sequelize 4.10

Ответ 1

Проблема возникает только при входе в нее, используя:

console.log(Model.findAll());

Если я сохраню его в переменной, я могу напрямую обращаться к объектам внутри, не используя " dataValues ",

Ответ 2

Да, ты можешь

Model.findAll({
 raw: true,
 //Other parameters
});

будет возвращать только данные, а не экземпляр модели

Ответ 3

Sequelize оборачивает все возвращаемые значения в виртуальный объект, который содержит метаданные. Если у вас есть объект, и вы просто хотите неокрашенные значения данных, вы можете развернуть их следующим образом:

Model.findById(1).then(data => {
  console.log(data.get({ plain: true }));
});

Кроме того, если вы просто хотите распечатать объект, вы можете использовать метод .toJSON.

Model.findById(1).then(data => {
  console.log(data.toJSON());
});

Ответ 4

Наконец-то я нашел ответ после долгих поисков. вы должны сделать что-то вроде этого

const users = await db.users.findAll({})
   .map(el => el.get({ plain: true })) // add this line to code

источник: проблема github

Ответ 5

Для вложенных сущностей этот глупый обходной путь работает для меня:

let row = await Model.findOne({
     include: [ /*your includes here*/ ]
});
row = JSON.parse( JSON.stringify(row, null, 4) );

Каким-то образом JSON.stringify(row, null, 4) удаляет все лишние dataValues и делает вид, что свойство dataValues объекта является самим объектом. Затем JSON.parse(...) объединяет объект.

РЕДАКТИРОВАТЬ:

очевидно, я новичок в машинописи, так что мне это вообще не нужно. console.log(row) печатающая огромный объект, запутала меня. Я скучаю по добрым старым разам: '(

Ответ 6

Чтобы прояснить ответ масуда Тавакколи (что не сразу понятно в ответе github): использование element.get({ plain: true }) возвращает массив объектов с каждой парой ключ-значение: значение.

Если вам просто нужен массив из одного определенного значения атрибута (например, идентификатора пользователя) вместо объектов, вы можете использовать что-то вроде этого:

const users = await User.findAll({
    attributes: ["id"], 
    where: {} // Your filters here
}).map(u => u.get("id")) // [1,2,3]

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

const users = await User.findAll({
    attributes: ["id"], 
    where: {} // Your filters here
})
const userIds = JSON.stringify(users)) // [1,2,3]

Ответ 7

Чтобы выбрать только некоторые атрибуты, вы можете использовать параметр атрибутов. Чаще всего вы передаете массив:

Model.findAll({
  attributes: ['foo', 'bar']
});

Источник: здесь