Slick:使用 Rep[Seq[T]] 进行过滤

Slick: filter with Rep[Seq[T]]

我正在制作 Play!我正在使用 slick 的项目(在 Scala 中)。

我在尝试过滤包含多个数组的 jsonb 列上的查询时遇到问题。

例如我的配置列包含以下 json:

{
 test1: {
   ...
 },
 test2: [
   {
    id: ...,
    bool: false
   },
   {
    id: ...,
    bool: true
   }
 ]
}

我想查询此 table 和 select 至少有 1 个 test2 元素具有 bool: true 的每一行。 (我们在 test2 中可能有大约 10 个元素)。

我可以把test2的每个元素1乘1试试:

    baseQuery.filter(a => a.config+>'test2'~>0+>>'bool' === "true" ||
                          a.config+>'test2'~>1+>>'bool' === "true" ||
                          ...
                    )

但这显然不是一个好的解决方案。

我试过:

baseQuery.filter(a => (a.config+>'test2').arrayElements[JsArray].value...
                    )

但是 Rep[JsArray] 没有值方法。 我也试过使用

arrayElements[Seq[JsValue]]

但我最终得到了一个 Rep[Seq[JsValue]],我无法在其上 map/flatMap/exists/...

它必须保留为查询而不是 DBIOAction,因此我不必重新格式化大量代码...

感谢大家的solutions/ideas!

我找到了一些 "hackish" 解决方案来解决我的问题。 我对此并不完全满意,因为我更愿意正确地迭代 Seq[JsValue] 但如果有人有同样的问题,那就是这里。

这非常简单,我使用 +>> 运算符将我的 JsValue 作为字符串获取,然后使用 like 查看它是否包含我需要设置为 true 的布尔值。

使用与之前相同(愚蠢)的示例,解决方案是:

baseQuery.filter(_.config+>>'test2' like "%\"bool\": true%")

这可能不是最好的解决方案,但它可以满足我的需要。