Aerospike - 使用多个过滤器参数进行查询
Aerospike - Query with Multiple Filter parameters
我正在尝试使用多个过滤器查询 aerospike,并参考此 link。
我可以根据给定的 lua 脚本查询 aerospike 的 1 个过滤器参数,但是当必须传递 2 个以上的过滤器参数时(例如再传递两个),lua 脚本卡住了年龄、性别和密码等参数)。
这是我第一次 lua.
Lua 脚本:
local function map_profile(record)
return map {name=record.name, password=record.password}
end
function check_password(stream,password)
local function filter_password(record)
return record.password == password
end
return stream : filter(filter_password) : map(map_profile)
end
提前致谢。
过滤函数可以有额外的参数和return一个可以访问这些参数的闭包,同时仍然符合一个参数作为记录的预期存根,具有布尔值return。
local function filter_password(password)
return function(rec)
if rec['password'] and (type(rec['password']) == 'string') and
rec['password'] == password then
return true
end
return false
end
end
local function map_profile(record)
return map {name=record.name, password=record.password}
end
function check_password(stream,password)
return stream : filter(filter_password(password)) : map(map_profile)
end
然而,如今查询或扫描多个过滤器的最佳方式(自从 release 3.12) is to use predicate filtering. In the majority of cases (unless you need to compare the values of two of the record's bins to each other in some way) you would skip UDFs and use the PredExp class (in the Java client, or its equivalent in another). You'd get back only those records that matched the filter, regardless of how complex of an expression you built. See the examples in the Aerospike Java client, or the C, C# and Go 客户以来。
我们开发了 SQL wrapper for Aerospike,它根据您的 SQL 查询构建 LUA 代码。可能对你有帮助。
我正在尝试使用多个过滤器查询 aerospike,并参考此 link。
我可以根据给定的 lua 脚本查询 aerospike 的 1 个过滤器参数,但是当必须传递 2 个以上的过滤器参数时(例如再传递两个),lua 脚本卡住了年龄、性别和密码等参数)。
这是我第一次 lua.
Lua 脚本:
local function map_profile(record)
return map {name=record.name, password=record.password}
end
function check_password(stream,password)
local function filter_password(record)
return record.password == password
end
return stream : filter(filter_password) : map(map_profile)
end
提前致谢。
过滤函数可以有额外的参数和return一个可以访问这些参数的闭包,同时仍然符合一个参数作为记录的预期存根,具有布尔值return。
local function filter_password(password)
return function(rec)
if rec['password'] and (type(rec['password']) == 'string') and
rec['password'] == password then
return true
end
return false
end
end
local function map_profile(record)
return map {name=record.name, password=record.password}
end
function check_password(stream,password)
return stream : filter(filter_password(password)) : map(map_profile)
end
然而,如今查询或扫描多个过滤器的最佳方式(自从 release 3.12) is to use predicate filtering. In the majority of cases (unless you need to compare the values of two of the record's bins to each other in some way) you would skip UDFs and use the PredExp class (in the Java client, or its equivalent in another). You'd get back only those records that matched the filter, regardless of how complex of an expression you built. See the examples in the Aerospike Java client, or the C, C# and Go 客户以来。
我们开发了 SQL wrapper for Aerospike,它根据您的 SQL 查询构建 LUA 代码。可能对你有帮助。