【问题标题】:Get only dataValues from Sequelize ORM仅从 Sequelize ORM 中获取 dataValues
【发布时间】:2018-03-04 23:14:39
【问题描述】:

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

我正在使用 Sequelize 4.10

【问题讨论】:

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


    【解决方案1】:

    是的,你可以

    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 中所述。
    • 你在挑选生的时候应该有一些免责声明
    【解决方案2】:

    只有当我使用以下方式记录时才会出现问题:

    console.log(Model.findAll());

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

    【讨论】:

    • 这适用于 JS,但在 typescript 上,将触发以下错误:“错误 TS2551:属性 'dataValues' 在类型'Model'上不存在。你的意思是'getDataValue'吗?”对于这种情况,Masoud Tavakkoli 的回答解决了问题。
    【解决方案3】:

    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@.
    • @PrintlnParams 有关详细信息,请参阅 Shivam 的答案,如果您想全局执行此操作,请参阅此答案stackoverflow.com/a/26228558/3803506 如果您想将对象用于实例方法等,我描述的方法更多,但是您想在传递值或记录之前封装实现细节。 data.dataValues 也可以工作,但要注意可变性,还要记住 dataValues 是 sequelize 的内部实现,可能会改变。
    【解决方案4】:

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

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

    来源:github issue

    【讨论】:

      【解决方案5】:

      为了澄清 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]
      

      【讨论】:

        【解决方案6】:

        这就是我的解决方法

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-18
          • 2014-10-23
          • 2015-06-16
          • 2014-08-17
          • 1970-01-01
          • 1970-01-01
          • 2019-09-06
          • 2015-09-06
          相关资源
          最近更新 更多