如何使用RedisJSON MGET获取多个键的指定属性?
解决RedisJSON批量获取多个对象指定属性的问题
问题原因
JSON.MGET的语法规则是:键列表之后只能传入单个路径参数,你之前传入.name和.color两个路径的写法不符合命令格式,因此无法正常执行。
解决方案
方案1:使用多属性选择的JSONPath表达式
利用RedisJSON支持的JSONPath语法,通过单个路径表达式同时指定多个需要获取的属性:
方式A:返回属性值数组
JSON.MGET Cat:1 Cat:2 '$["name","color"]'
返回结果示例:
1) ["Mitzi", "pink"] 2) ["Lucky", "black"]
方式B:返回结构化对象
如果希望保留属性名,返回完整的对象结构,可以使用JSONPath的对象投影语法:
JSON.MGET Cat:1 Cat:2 '${"name":$.name, "color":$.color}'
返回结果示例:
1) {"name":"Mitzi","color":"pink"} 2) {"name":"Lucky","color":"black"}
也可以使用RedisJSON简化的路径写法,效果和方式A一致:
JSON.MGET Cat:1 Cat:2 '{.name, .color}'
方案2:使用Lua脚本批量处理
如果需要更灵活的输出格式,或者你的RedisJSON版本不支持上述JSONPath语法,可以通过Lua脚本实现批量查询:
local result = {} for _, key in ipairs(KEYS) do local name = redis.call('JSON.GET', key, '.name') local color = redis.call('JSON.GET', key, '.color') table.insert(result, string.format('{"name":%s, "color":%s}', name, color)) end return result
执行脚本的命令:
EVAL "local result = {} for _, key in ipairs(KEYS) do local name = redis.call('JSON.GET', key, '.name') local color = redis.call('JSON.GET', key, '.color') table.insert(result, string.format('{\"name\":%s, \"color\":%s}', name, color)) end return result" 2 Cat:1 Cat:2
返回结果示例:
1) "{\"name\":\"Mitzi\",\"color\":\"pink\"}" 2) "{\"name\":\"Lucky\",\"color\":\"black\"}"
内容的提问来源于stack exchange,提问作者marina
相关产品推荐
相关产品推荐

