Nosql Aerospike-地图键查询
我有一个关于Aerospike DB的问题 我有一组学生,每个学生(记录键是StudentId)都有一个Nosql Aerospike-地图键查询,nosql,user-defined-functions,aerospike,Nosql,User Defined Functions,Aerospike,我有一个关于Aerospike DB的问题 我有一组学生,每个学生(记录键是StudentId)都有一个的地图(bin)。 我正在尝试创建一些查询,但我不确定正确的方法是什么 我有一个包含课程ID列表的变量 我要创建的查询包括: 对于每个学生,获取地图和列表中存在的所有课程ID 对于每个学生,获取仅存在于其地图中而不存在于列表中的所有课程ID 这里最好的方法是什么?我应该使用UDF吗 谢谢。这是一种很好的扩展功能的方式,而这种功能在中还不存在。记录UDF可以将bin名称作为第一个参数,将您的列表
的地图(bin)。
我正在尝试创建一些查询,但我不确定正确的方法是什么
我有一个包含
课程ID列表的变量
我要创建的查询包括:
谢谢。这是一种很好的扩展功能的方式,而这种功能在中还不存在。记录UDF可以将bin名称作为第一个参数,将您的列表变量作为第二个参数,并使用可选的第三个参数来确定这是“IN”还是“NOT IN”,然后根据球场ID的地图对其进行迭代 您可以将此记录UDF应用于通过针对包含学生的集合运行的扫描或查询匹配的每个记录 测试。lua
function list_compare(rec, bin, l, not_in_l)
if rec[bin] then
local b = rec[bin]
if (tostring(getmetatable(rec[bin])) == tostring(getmetatable(list()))) then
iter = list.iterator
elseif (tostring(getmetatable(rec[bin])) == tostring(getmetatable(map()))) then
iter = map.values
else
return nil
end
local s = {}
local l_keys = {}
if (not_in_l ~= nil) then
for v in list.iterator(l) do
l_keys[v] = 1
end
end
for i in list.iterator(l) do
for v in iter(b) do
if (not_in_l == nil) then
if (i == v) then
s[v] = 1
end
else
if (i ~= v and not l_keys[v]) then
s[v] = 1
end
end
end
end
local keys = {}
for k,v in pairs(s) do
table.insert(keys, k)
end
table.sort(keys)
return list(keys)
end
end
在AQL中:
$ aql
Aerospike Query Client
Version 3.15.1.2
C Client Version 4.3.0
Copyright 2012-2017 Aerospike. All rights reserved.
aql> register module './test.lua'
OK, 1 module added.
aql> insert into test.demo (PK,i,s,m,l) values ('88',6,'six',MAP('{"a":2, "b":4, "c":8, "d":16}'),LIST('[2, 4, 8, 16, 32, 128, 256]'))
OK, 1 record affected.
aql> select * from test.demo where PK='88'
+---+-------+--------------------------------------+-------------------------------------+
| i | s | m | l |
+---+-------+--------------------------------------+-------------------------------------+
| 6 | "six" | MAP('{"a":2, "b":4, "c":8, "d":16}') | LIST('[2, 4, 8, 16, 32, 128, 256]') |
+---+-------+--------------------------------------+-------------------------------------+
1 row in set (0.001 secs)
aql> execute test.list_compare("l", LIST('[1,2,3,4]')) on test.demo where PK='88'
+----------------+
| list_compare |
+----------------+
| LIST('[2, 4]') |
+----------------+
1 row in set (0.002 secs)
aql> execute test.list_compare("l", LIST('[1,2,3,4]'),1) on test.demo where PK='88'
+-------------------------------+
| list_compare |
+-------------------------------+
| LIST('[8, 16, 32, 128, 256]') |
+-------------------------------+
1 row in set (0.001 secs)
aql> execute test.list_compare("m", LIST('[1,2,3,4]')) on test.demo where PK='88'
+----------------+
| list_compare |
+----------------+
| LIST('[2, 4]') |
+----------------+
1 row in set (0.001 secs)
aql> execute test.list_compare("m", LIST('[1,2,3,4]'), 1) on test.demo where PK='88'
+-----------------+
| list_compare |
+-----------------+
| LIST('[8, 16]') |
+-----------------+
1 row in set (0.000 secs)
顺便说一句,由于尖括号所以没有显示地图结构。我只是在它周围加了一个`字。你可以通过在Github中打开一个关于回购的问题来要求将这种类型的功能添加到PredExp中。谢谢Ronen。我试试看。