【问题标题】:Sequelize: delete JSONB property (with PostgreSQL)Sequelize:删除 JSONB 属性(使用 PostgreSQL)
【发布时间】:2016-01-19 09:43:44
【问题描述】:

我正在使用sequelize (v3.12.2)、pg (4.4.3)、PostgreSQL (v9.4) 和 Node (v4.1.2)。

我有一个包含 JSONB 数据类型字段的模型。

var User = {
  data: {
    type: Sequelize.JSONB
}

现在我可以了

User.findOne({where: {id: 12345}})
  .update({data: {x: 'foo'}});

和

User.findOne({where: {id: 12345}})
  .update({'data.y': 'bar'});

现在,如果我只想删除 data.x 属性,如何在一个命令中完成?

User.findOne({where: {id: 12345}})
  .update({'data.x': null});

显然不起作用。实际上,生成的数据对象应该是:

{y: 'bar'}

而不是:

{x: null, y: 'bar'}

如何使用 Sequelize 做到这一点?感谢您的帮助!

【问题讨论】:

  • 您找到解决方案了吗?
  • 我认为在“jsonb”字段中恢复整个json对象更容易..(但可能不是那么有效)

标签: node.js postgresql sequelize.js jsonb


【解决方案1】:

我认为下面应该可以工作

User.findOne({where: {id: 12345}})
  .update({'data': sequelize.literal("data - 'x' ")});

还没有测试过,但如果它不起作用,请告诉我。解决方案将仅遵循这些思路

【讨论】:

    【解决方案2】:

    如果@Tarun Lalwani 的代码不起作用,可能 您的 postgresql 9.4 不支持“-”操作。

    在这种情况下,您可以选择创建函数或升级到 9.5+。

    看 PostgreSQL: Remove attribute from JSON column

    【讨论】:

    • @Shamoon,你读过这个吗?stackoverflow.com/questions/23490965/…
    • 您能否将相关信息添加到您的答案中,以便这篇文章完成?
    • JSONB 类型是 postgresql 数据类型。序列是到 DB 的 ORM 映射器。如果 postgresql (9.4) 不支持某些操作,如 JSONB 的“-”,您也不能在 ORM 映射器中使用这些操作。但从 v9.5 开始支持操作和在序列中的“-”操作工作。
    【解决方案3】:

    试试这个:

    User.update({
            "data": sequelize.literal("data - 'x' ") 
        }, {
            where: {
                id: 12345
            }
        });
    

    【讨论】:

    • 这与现有答案有何不同?
    • 它在单个查询中更新数据库。而你的做 2 个查询。一是获取数据,二是更新。
    • 这样比较实用,因为它可以一次查询批量更新任意数量的记录
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多