Aerospike - 使用多个过滤器参数查询

时间:2015-12-09 13:36:32

标签: lua udf aerospike

我正在尝试使用多个过滤器来查询aerospike,并参考此link

我能够根据给定的lua脚本查询airospike的1个过滤器参数,但是当必须传递2个以上的过滤器参数时,他们会使用lua脚本(例如传递两个更多参数,如年龄,性别和密码)。登记/> 这是我第一次使用lua。

Lua Script:

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

filter函数可以有额外的参数并返回一个闭包,它可以访问那些,同时仍然符合作为记录的一个参数的预期存根,具有布尔返回值。

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

但是,现在查询或扫描多个过滤器的最佳方法(从predicate filtering起)是使用PredExp。在大多数情况下(除非你需要以某种方式将两个记录的bin的值相互比较),你将跳过UDF并使用examples类(在Java客户端中,或者在另一个中等效) )。无论您构建的表达式有多复杂,您都只返回与过滤器匹配的记录。请参阅Aerospike Java客户端中的CC#Go和{{3}}客户端。

答案 1 :(得分:2)

我们开发了SQL wrapper for Aerospike,它可以从您的SQL查询构建LUA代码。它可能对你有帮助。