You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RediSearch查询含指定元素的JSON数组并返回UUID与完整数组

RedisJSON + RediSearch 查询数组包含元素时返回完整数组与UUID

问题场景

现有RedisJSON数据:

JSON.SET uuid_1 $ '{ "type": "game1", "players": ["player1", "player2"] }'
JSON.SET uuid_2 $ '{ "type": "game1", "players": ["player3", "player2"] }'

需求:查询players数组包含指定玩家时,返回对应的键名(UUID)和完整的players数组,例如:

  • 查询player1 → 返回["uuid_1", ["players", ["player1", "player2"]]]
  • 查询player2 → 返回["uuid_2", ["players", ["player3", "player2"]]]

已创建索引:

FT.CREATE idx ON JSON SCHEMA '$.players[*]' AS players TAG $.type AS gameType TEXT

当前问题:执行FT.SEARCH idx @players:{player2} RETURN 1 players时,仅返回players数组的第一个元素,无法获取完整数组。

解决方案

问题根源:索引中$.players[*]是将数组的每个元素单独作为TAG索引,但返回时直接使用别名players,只会提取数组中第一个匹配的元素。要返回完整数组,需直接引用JSON路径而非索引别名。

正确查询命令

保持现有索引不变,查询时指定返回$.players路径:

FT.SEARCH idx @players:{player2} RETURN 2 '$.players' AS players

命令说明

  • RETURN 2:指定返回额外1个自定义字段(键名默认返回,数字代表自定义字段的数量)
  • '$.players':直接引用JSON数据中的完整数组路径
  • AS players:为返回的字段设置别名,方便识别

执行结果

执行后会得到:

1) (integer) 2
2) "uuid_1"
3) 1) "players"
   2) "[\"player1\",\"player2\"]"
4) "uuid_2"
5) 1) "players"
   2) "[\"player3\",\"player2\"]"

返回的players字段是JSON字符串格式,客户端可直接解析为数组。

扩展:返回原生数组格式

若需要在Redis端直接返回数组而非字符串,可分两步操作:

  1. 先查询匹配的键名:
    FT.SEARCH idx @players:{player1} RETURN 0
    
  2. 再通过键名获取完整数组:
    JSON.GET uuid_1 '$.players'
    

此方式需两次操作,效率低于直接在FT.SEARCH中返回路径。


内容的提问来源于stack exchange,提问作者Andrea Nicolai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:31:13