我有一个 JSON 文档传入 Redis,其中包含目录路径。
Key: "idx:sys:ikSh-pEBejscyM5jrSyY"
"path";"/root/fred/subfolder1/subfolder2/subfolder3"
我最终可能会得到包含重复路径的提要。
Key: "idx:sys:h0Sh-pEBejscyM5jrSyX"
"path";"/root/fred/subfolder1/subfolder2/subfolder3"
我的目标是使用相同路径删除重复的键。
我已经使用 Redis 一段时间了,但我对 Redis Stack 还很陌生。 我使用 JSON.SET 将文档存储为 JSON
某些路径可能包含连字符。
我已经创建了一个索引。
FT.CREATE idx:sys
ON JSON
PREFIX 1 fred:sys:
SCHEMA
$.path AS path_tag TAG SORTABLE
$.path AS path_text TEXT SORTABLE
$.target.fspace AS filespace TEXT
如果我运行 ft.search,我会得到重复的条目。
FT.SEARCH idx:sys "*" SORTBY path_text DESC RETURN 1 $.path
1) (integer) 2
2) "lucid:blansys:ikSh-pEBejscyM5jrSyY"
3) 1) "$.path"
2) "/root/fred/subfolder1/subfolder2/subfolder3"
4) "lucid:blansys:h0Sh-pEBejscyM5jrSyX"
5) 1) "$.path"
2) "/root/fred/subfolder1/subfolder2/subfolder3"
您对如何删除路径中具有重复条目的键有任何指示吗?
非常感谢您的关注和参与。
我想我找到了解决方案并发布,看看它是否对其他人有帮助。
我需要稍微改变我的索引;
我的密钥是使用文档中的 JSON 属性构建的;
fred:sys:<docId>
因此,我将此字段添加到我的架构中。
FT.CREATE idx:sys
ON JSON
PREFIX 1 fred:sys:
SCHEMA
$.path AS path_tag TAG SORTABLE
$.path AS path_text TEXT SORTABLE
$.target.fspace AS filespace TEXT
$.docId AS docid TAG SORTABLE NOINDEX
然后,使用 FT.AGGREGATE,我获得了不同的路径值以及它们出现的所有 Redis 键。
FT.AGGREGATE idx:entryPath * GROUPBY 1 @path_text REDUCE TOLIST 1 @docid as docids
结果
1) (integer) 4
2) 1) "path_text"
2) "/root/fred/subfolder1/sub-folder2/sub folder"
3) "docids"
4) 1) "h0Sh-pEBejscyM5jrSyX"
3) 1) "path_text"
2) "/root/fred/subfolder1/subfolder2/subfolder"
3) "docids"
4) 1) "h0Sh-pEBejscyM5krSyX"
4) 1) "path_text"
2) "/root/fred/sub-folder1/sub folder2/sub-folder3"
3) "docids"
4) 1) "ikSh-pEBejscyM5jrSyY"
5) 1) "path_text"
2) "/root/fred/subfolder1/subfolder2/subfolder3"
3) "docids"
4) 1) "RFGC-5EB2UfWbJjp5QCt"
2) "ikSh-pEBejsczyM5jrSyY"
3) "R1GC-5EB2UfWbJjp5QCt"
我从 Node.js 调用它;我使用 array.shift() 和 array.split() 清理返回的数组。这给我留下了一个包含路径和嵌套键数组的数组。
然后,使用 Mustache 模板将数组转换为 JSON 对象。
现在我可以处理正在更新的目标系统中的每个不同路径,并运行键数组以在完成后从 Redis 中删除它们。
希望这对其他人有帮助。