【问题标题】:How do I check if an array column contains a value in Postgres using Objection JS?如何使用 Objection JS 检查数组列是否包含 Postgres 中的值?
【发布时间】:2020-07-31 13:51:49
【问题描述】:

我尝试使用整数数组,然后是字符串数组。但是,我不断收到同样的错误:

ERROR:  operator does not exist: jsonb ?| integer[]

我的查询如下所示:

Bet.query()
    .select(
        'id', 
        'status'
    )
    .whereJsonSupersetOf('participants_ids', [userId])
    .range()
    .limit(10)   
    .orderBy('id', 'DESC')
    .throwIfNotFound();

这就是数组的存储方式:

每个用户都有一个屏幕,他们可以在其中查看自己与其他用户的赌注。为了列出登录用户的投注,我需要检查参与者 ID 列。这是一个数组,其中包含 2 个相互投注的用户的 id。

我查询的目的是返回一个投注列表,其中当前用户的 ID 包含在每个投注的参与者 ID 数组中。

最初,我尝试使用用户.where().orWhere() 来检查当前用户的ID 是投注主机的ID,还是投注挑战者的ID。但这并没有给我想要的结果。所以我决定一个数组列会更好。

我似乎无法让它工作。我看过一些帖子,但它们似乎是对象数组,而不是整数或字符串数​​组。我只是想检查参与者ids 数组列是否包含我传递给查询的 userId。

我也在使用 Knex JS。

知道我在这里做错了什么吗?

提前致谢。

【问题讨论】:

    标签: postgresql knex.js objection.js


    【解决方案1】:

    .whereJsonXXX 方法仅适用于 postgresql jsonb 列。

    查询数组列类型需要使用数组运算符https://www.postgresql.org/docs/12/functions-array.html

    Bet.query()
        .select(
            'id', 
            'status'
        )
        .where('participants_ids', '@>', [userId])
        .range()
        .limit(10)   
        .orderBy('id', 'DESC')
        .throwIfNotFound();
    

    如果在第一个示例中未正确传递数组,则可能是 .where('participants_ids', '@>', val([userId]).asArray().castTo('integer[]'))

    【讨论】:

    • 谢谢。我将数组类型更改为整数并使用您的第一个示例。效果很好。
    猜你喜欢
    • 2020-10-10
    • 2012-03-26
    • 2012-01-10
    • 2012-08-14
    • 2019-08-10
    • 2021-09-10
    相关资源
    最近更新 更多