光滑:使用Rep [Seq [T]]过滤

时间:2018-05-08 11:57:52

标签: scala playframework slick

我正在玩Play!我正在使用光滑的项目(在Scala中)。

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

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

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

我想查询此表并选择每个至少有一个test2元素具有bool的行:true。 (我们在test2中可能有大约10个元素。)

我可以尝试test1 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]],我无法映射/ flatMap / exists /...

它必须保持查询而不是DBIOAction,所以我不必重新格式化很多代码...

感谢大家的解决方案/想法!

1 个答案:

答案 0 :(得分:0)

我发现了一些解决我问题的“黑客”解决方案。 我对它并不完全满意,因为我宁愿在Seq [JsValue]上正确迭代,但是如果有人遇到同样的问题,那就好了。

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

使用与以前相同(愚蠢)的例子,解决方案将是:

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

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