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更简单,同时节省延迟(往返)和带宽。。。