67

我正在使用 sequelize ORM 从 PSQL DB 中获取数据。但是,当我检索某些东西时,会给出一大堆数据。我想要的唯一数据在“dataValues”内。当然,我可以使用object.dataValues。但是,还有其他好的解决方案吗?

我正在使用 Sequelize 4.10

4

6 回答 6

115

Yes you can

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

would return just the data and not the model instance

于 2017-09-23T17:50:23.030 回答
41

Sequelize 将它的所有返回值包装在一个包含元数据的虚拟对象中。如果你有一个对象并且你只想要未修饰的数据值,你可以像这样解开它们:

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

此外,如果您只想打印出对象,则可以使用该.toJSON方法。

Model.findById(1).then(data => {
  console.log(data.toJSON());
});
于 2018-02-06T01:44:06.013 回答
18

经过大量搜索,我终于找到了答案。你应该做这样的事情

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

来源:github问题

于 2019-03-31T11:28:51.140 回答
6

为了澄清 Masoud Tavakkoli 的答案(在那个 github 答案上并不清楚): usingelement.get({ plain: true })返回一个具有每个属性键:值对的对象数组。

如果您只想要一个特定属性值的数组(例如用户 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]
于 2019-09-15T03:50:53.273 回答
6

这就是我解决我的方法

    let rows = await database.Book.findAll(options);
    rows = JSON.stringify(rows);
    rows = JSON.parse(rows);

请注意,查询具有“包含 childModel”,如果它只是一个模型,我可以使用“raw:true”。对结果进行字符串化会清除“_previousDataValues”等并为您提供普通对象,现在将字符串化对象解析回 json。我花了很长时间才弄清楚这一点。

于 2021-05-10T15:19:37.050 回答
4

仅当我使用以下方法记录时才会出现问题:

console.log(Model.findAll());

如果我把它保存到一个变量中,我可以直接访问里面的对象而不使用“ dataValues

于 2017-10-03T05:53:30.557 回答