Arrays 在aerospike udf中删除并修剪列表
我尝试删除并修剪一个列表以构建分页系统Arrays 在aerospike udf中删除并修剪列表,arrays,node.js,sorting,udf,aerospike,Arrays,Node.js,Sorting,Udf,Aerospike,我尝试删除并修剪一个列表以构建分页系统 local function createMap(postId, paramDate) local m = map { id = postId, date = paramDate }; return m; end function get(rec, binName, from, to) if aerospike:exists(rec) then local l = rec[binName] if (l
local function createMap(postId, paramDate)
local m = map { id = postId, date = paramDate };
return m;
end
function get(rec, binName, from, to)
if aerospike:exists(rec) then
local l = rec[binName]
if (l == nil) then
return nil
else
local length = #l;
if (length <= 10 and to <=10) then
return l;
elseif (to >= length) then
local drop = list.drop(l, from);
return drop;
else
list.trim(l, to);--Remove all elements at and beyond a specified position in the List.
list.drop(l, from); --Select all elements except the first n elements of the List
return l;
end
end
else
return nil;--end return empty array
end--end else aerospike exists
end
function get(rec, binName, from, to)
if aerospike:exists(rec) then
local l = rec[binName]
if (l == nil) then
return list()--return empty array
else
--first index in lua is 1
local length = list.size(l)
local pagination = list()
if (length < from) then
return list()
elseif (length >= from and length <=to) then
for i=from,length,1 do
list.append(pagination, l[i])
end--end for
return pagination
else
for i=from,to,1 do
list.append(pagination, l[i])
end--end for
return pagination
end
end
else
return list();--end return empty array
end--end else aerospike exists
end
--end function
看来我不能先删减,然后再删除列表。以21个元素为例:它首先返回元素21到元素13,然后返回元素21到元素4,然后返回元素3到元素1
node.js中的我的函数很容易更改为“from”和“to”,我将“page”从前端发送到node.js并使用此函数:
var skip = 9 * (page -1);
var lastIndexToReturn = skip + 9 + 1;
所以在第一个请求中,从和到是“0”和“10”,然后是“9”和“19”,以此类推
通过使用list.trim和list.drop,我认为我可以构建一个分页系统函数get(rec、binName、from、to)
local function createMap(postId, paramDate)
local m = map { id = postId, date = paramDate };
return m;
end
function get(rec, binName, from, to)
if aerospike:exists(rec) then
local l = rec[binName]
if (l == nil) then
return nil
else
local length = #l;
if (length <= 10 and to <=10) then
return l;
elseif (to >= length) then
local drop = list.drop(l, from);
return drop;
else
list.trim(l, to);--Remove all elements at and beyond a specified position in the List.
list.drop(l, from); --Select all elements except the first n elements of the List
return l;
end
end
else
return nil;--end return empty array
end--end else aerospike exists
end
function get(rec, binName, from, to)
if aerospike:exists(rec) then
local l = rec[binName]
if (l == nil) then
return list()--return empty array
else
--first index in lua is 1
local length = list.size(l)
local pagination = list()
if (length < from) then
return list()
elseif (length >= from and length <=to) then
for i=from,length,1 do
list.append(pagination, l[i])
end--end for
return pagination
else
for i=from,to,1 do
list.append(pagination, l[i])
end--end for
return pagination
end
end
else
return list();--end return empty array
end--end else aerospike exists
end
--end function
如果aerospike:存在(rec),则
本地l=rec[binName]
如果(l==nil),那么
return list()--返回空数组
其他的
--lua中的第一个索引是1
本地长度=列表大小(l)
本地分页=列表()
如果(长度 elseif(length>=from and length您的列表条目是否足够小,以使普通列表的有限大小适合您的用例?对于无限列表,Aerospike具有大的有序列表。有几种方法可以在不使用UDF的情况下构建分页(性能更高),你会对这样的答案感兴趣吗?我知道你正在使用node.js客户端?Cheeset'a用于一个大约600个元素的列表…我只使用一个bin和这个结构,所以它小于128kb…事实上你正在使用node.js…如果你有更好的方法,我会很高兴知道它…但我也会知道为什么这个代码不起作用?顺便说一下,我akso尝试了largelist:我还构建了一个节点分页,在这里我比较日期和切片来排序数组…但我认为用lua完成整个工作会更好?我无法从您的代码中发现一个明显的问题,但是列表操作最近刚刚更改,我不知道新的lua操作的行为。使用go客户端,我会使用单个多操作呈现页面和页面导航:组合ListGetRange(binname,9*(pageIndex-1),9)和ListSize()在原子读取操作中。不修剪、清除或复制列表。对于写入操作,这取决于您是否需要排序。如果您要读取已排序的列表,请创建一个记录UDF,该记录UDF接受要插入的元素并找到其正确的位置并将其插入(其原子)。对于删除或更新,您可能需要一个…一个列表排序所依据的唯一键。虽然自定义项提供了极大的灵活性,但如果您可以避免它们,则可以实现更高的性能。使用multi-ops命令,您可以做到这一点。例如,在上述情况下,您可以呈现第一页并知道有多少页。可以通过从排序列表中删除:如果不这样做,您必须将完整副本读取到cliend,找到位置,然后写回,希望/检查在此期间没有其他人更改列表。使用UDF更简单,同时节省延迟(往返)和带宽。。。