Ответ 1
Проблема возникает только при входе в нее, используя:
console.log(Model.findAll());
Если я сохраню его в переменной, я могу напрямую обращаться к объектам внутри, не используя " dataValues ",
Я использую sequelize ORM для извлечения данных из базы данных PSQL. Однако, когда я что-то получаю, дается целая куча данных. Единственные данные, которые я хочу, находятся внутри 'dataValues'. Конечно, я могу использовать object.dataValues. Но есть ли другие хорошие решения?
Я использую Sequelize 4.10
Проблема возникает только при входе в нее, используя:
console.log(Model.findAll());
Если я сохраню его в переменной, я могу напрямую обращаться к объектам внутри, не используя " dataValues ",
Да, ты можешь
Model.findAll({
raw: true,
//Other parameters
});
будет возвращать только данные, а не экземпляр модели
Sequelize оборачивает все возвращаемые значения в виртуальный объект, который содержит метаданные. Если у вас есть объект, и вы просто хотите неокрашенные значения данных, вы можете развернуть их следующим образом:
Model.findById(1).then(data => {
console.log(data.get({ plain: true }));
});
Кроме того, если вы просто хотите распечатать объект, вы можете использовать метод .toJSON
.
Model.findById(1).then(data => {
console.log(data.toJSON());
});
Наконец-то я нашел ответ после долгих поисков. вы должны сделать что-то вроде этого
const users = await db.users.findAll({})
.map(el => el.get({ plain: true })) // add this line to code
источник: проблема github
Для вложенных сущностей этот глупый обходной путь работает для меня:
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)
печатающая огромный объект, запутала меня. Я скучаю по добрым старым разам: '(
Чтобы прояснить ответ масуда Тавакколи (что не сразу понятно в ответе 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]
Чтобы выбрать только некоторые атрибуты, вы можете использовать параметр атрибутов. Чаще всего вы передаете массив:
Model.findAll({
attributes: ['foo', 'bar']
});
Источник: здесь