对于具有如下形状的 JSON 类型对象
# myPrefix:myKey
{
"inventory": [
{
"name": "Carrot",
"desc": "A fresh vegetable"
},
{
"name": "Knife",
"desc": "A tool to cut things"
}
]
}
可以使用 JsonPath 通配符获取
name
中的所有 inventory
,如下所示:JSON.GET myPrefix:myKey $.inventory[*].name
(或 $.inventory..name
),这将返回 "[\"Carrot\",\"Knife\"]"
。
但是,当尝试使用 RediSearch 使用
LOAD
聚合此类数据时,似乎只返回第一个值。例如,创建类似 FT.CREATE mySearch ON JSON PREFIX 1 myPrefix: SCHEMA $.inventory[*].name as itemName TEXT
的搜索后,尝试与 FT.AGGREGATE mySearch * LOAD 2 @__key @itemName groupby 1 @__key reduce tolist 1 @itemName as itemsList
聚合将返回:
1) "1"
2) 1) "__key"
2) "myPrefix:myKey"
3) "itemsList"
4) 1) "Carrot"
忽略除“胡萝卜”之外的所有其他
itemName
。
是否可以使用 FT.AGGREGATE 命令以这种方式查询嵌套的 Json 数据,如果可以,如何查询?
根据 FT.SEARCH 文档,可以使用 DIALECT 设置返回多个值:https://redis.io/commands/ft.search/#return-multiple-values
因此像
FT.AGGREGATE mySearch * LOAD 2 @__key @itemName GROUPBY 1 @__key REDUCE TOLIST 1 @itemName AS itemsList DIALECT 3
这样的聚合会正确返回:
1) "1"
2) 1) "__key"
2) "myPrefix:myKey"
3) "itemsList"
4) 1) "[\"Carrot\",\"Knife\"]"