【发布时间】:2018-03-04 23:14:39
【问题描述】:
我正在使用 sequelize ORM 从 PSQL DB 中获取数据。但是,当我检索某些东西时,会给出一大堆数据。我想要的唯一数据在“dataValues”内。当然,我可以使用object.dataValues。但是,还有其他好的解决方案吗?
我正在使用 Sequelize 4.10
【问题讨论】:
标签: node.js sequelize.js sequelize-cli
我正在使用 sequelize ORM 从 PSQL DB 中获取数据。但是,当我检索某些东西时,会给出一大堆数据。我想要的唯一数据在“dataValues”内。当然,我可以使用object.dataValues。但是,还有其他好的解决方案吗?
我正在使用 Sequelize 4.10
【问题讨论】:
标签: node.js sequelize.js sequelize-cli
是的,你可以
Model.findAll({
raw: true,
//Other parameters
});
将只返回数据而不是模型实例
【讨论】:
const sequelize = new Sequelize('connectionUri', { define: { raw: true } }); 这样的东西。来自文档here
var sequelize = new Sequelize('database', 'username', 'password', {query:{raw:true}}),如stackoverflow.com/a/26228558/1802726 中所述。
只有当我使用以下方式记录时才会出现问题:
console.log(Model.findAll());
如果我将它保存到一个变量中,我可以直接访问里面的对象而不使用“dataValues”
【讨论】:
Sequelize 将它的所有返回值包装在一个包含元数据的虚拟对象中。如果你有一个对象并且你只想要未修饰的数据值,你可以像这样解开它们:
Model.findById(1).then(data => {
console.log(data.get({ plain: true }));
});
此外,如果您只想打印出对象,可以使用.toJSON 方法。
Model.findById(1).then(data => {
console.log(data.toJSON());
});
【讨论】:
data.get 答案,这几乎正是我想要的。但是您知道是否有一种方法可以在find 的选项中指定data.get(或plain:true,或其他任何东西)部分?例如。而不是做你所做的,而是像 Model.findOne({ plain:true, ... }).then(...) ?因为在我看来,如果你只想过滤掉你想要 inside .then() 的数据,你不妨节省一些时间,只做 data.dataValues 而不是 @ 987654332@.
data.dataValues 也可以工作,但要注意可变性,还要记住 dataValues 是 sequelize 的内部实现,可能会改变。
经过大量搜索,我终于找到了答案。你应该这样做
const users = await db.users.findAll({})
.map(el => el.get({ plain: true })) // add this line to code
来源:github issue
【讨论】:
为了澄清 Masoud Tavakkoli 的回答(在 github 上的回答并不清楚):使用 element.get({ plain: true }) 返回一个 objects 数组,每个属性 key:value 对。
如果你只想要一个特定属性值的数组(例如用户 ID)而不是对象,你可以使用这样的东西:
const users = await User.findAll({
attributes: ["id"],
where: {} // Your filters here
}).map(u => u.get("id")) // [1,2,3]
Nika Kasradze 的回答实际上达到了与中间步骤相同的结果;使用 JSON stringifier 生成相同的数组输出。这可能比映射更快,但我不确定。
const users = await User.findAll({
attributes: ["id"],
where: {} // Your filters here
})
const userIds = JSON.stringify(users)) // [1,2,3]
【讨论】:
这就是我的解决方法
let rows = await database.Book.findAll(options);
rows = JSON.stringify(rows);
rows = JSON.parse(rows);
请注意,查询包含“包含 childModel”,如果它只是一个模型,我可以使用“raw:true”。对结果进行字符串化会清除“_previousDataValues”等并为您提供普通对象,现在将字符串化对象解析回 json。我花了很长时间才弄明白。
【讨论】: