我有一个存储在 Redis 中的 JSON 字符串列表,如下所示:
[
{ "ID": 25, "DomainID": 23455, "Name": "Stuff", "Value": 23 },
{ "ID": 35, "DomainID": 23455, "Name": "Stuff", "Value": 10 }
]
密钥类似于“Event:23455”。
使用 Lua 脚本和 ServiceStack.Redis 如何提取仅包含值小于 20 的值的匿名对象?
所以我想要返回的内容如下所示:
[{ "ID": 35, "Value": 10}]
谢谢。
2013 年 3 月 31 日更新:
在尝试了建议后,我现在遇到了一个新问题。Lua 脚本语法错误。
我收到有关“在 cjson 附近预期 '='”的 Lua 语法错误。这是我提供给 Redis 的 Lua 脚本字符串(在 C# 中):
string luaScript = "local tDecoded = cjson.decode(redis.call('GET', KEYS[1]));"
+ "local tFinal = {};"
+ "for iIndex, tValue in ipairs(tDecoded) do"
+ " if tonumber( tValue.Value ) < 20 then"
+ " table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});"
+ " end"
+ "end"
+ "return cjson.encode(tFinal);";
是否有任何 Lua 或 Redis Lua 专家可以看到可能是什么问题?ie Lua 语法看起来正确吗?
2013 年 4 月 2 日更新
通过像这样在每行的末尾添加 \n 换行符来解决解析错误。
string luaScript = "local tDecoded = redis.call('GET', KEYS[1]);\n"
+ "local tFinal = {};\n"
+ "for iIndex, tValue in ipairs(tDecoded) do\n"
+ " if tonumber( tValue.Value ) < 20 then\n"
+ " table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});\n"
+ " else\n"
+ " table.insert(tFinal, { ID = 999, Value = 0});\n"
+ " end\n"
+ "end\n"
+ "return cjson.encode(tFinal);";
不幸的是,这可以正常工作,但由于某种原因仅返回“{}”或 ServiceStack RedisClient 中的空列表。所以我还没有到那里,但我更近了一步。