我正在玩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,所以我不必重新格式化很多代码...
感谢大家的解决方案/想法!
答案 0 :(得分:0)
我发现了一些解决我问题的“黑客”解决方案。 我对它并不完全满意,因为我宁愿在Seq [JsValue]上正确迭代,但是如果有人遇到同样的问题,那就好了。
这非常简单,我使用+>>
运算符将我的JsValue作为字符串,然后使用like
查看它是否包含我需要设置为true的布尔值。
使用与以前相同(愚蠢)的例子,解决方案将是:
baseQuery.filter(_.config+>>'test2' like "%\"bool\": true%")
这可能不是最好的解决方案,但它可以满足我的需要。