只从Sequelize ORM获取dataValues

时间:2017-09-23 14:20:19

标签: node.js sequelize.js sequelize-cli

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

我正在使用Sequelize 4.10

8 个答案:

答案 0 :(得分:18)

是的,你可以

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

只会返回数据,而不会返回模型实例

答案 1 :(得分:10)

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

.toJSON

此外,如果您只想打印对象,可以使用Model.findById(1).then(data => { console.log(data.toJSON()); }); 方法。

mx.sym.Convolution

答案 2 :(得分:1)

只有在使用以下方式登录时才会出现问题:

  

的console.log(Model.findAll());

如果我将其保存到变量,我可以直接访问其中的对象而不使用“ dataValues

答案 3 :(得分:1)

要弄清Masoud Tavakkoli的答案(在该github答案上尚不清楚):使用element.get({ plain: true })返回带有每个属性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字符串生成器生成相同的数组输出。可能这比映射要快,但我不确定。

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

答案 4 :(得分:0)

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

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

来源:github issue

答案 5 :(得分:0)

对于嵌套实体,这种愚蠢的解决方法对我有用:

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

以某种方式JSON.stringify(row, null, 4)删除了所有多余的东西,并假装对象的dataValues属性是对象本身。然后JSON.parse(...)将对象放回原处。

编辑:

显然,我是TypeScript的新手,所以我根本不需要它。 console.log(row)印刷的巨大物体让我感到困惑。我想念很好的c#次:'(

答案 6 :(得分:0)

我就是这样解决的

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

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

答案 7 :(得分:-2)

要仅选择某些属性,可以使用attributes选项。大多数情况下,您传递一个数组:

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

来源:Here