【问题标题】:drop and trim a list in aerospike udf在 aerospike udf 中删除和修剪列表
【发布时间】:2016-04-07 03:47:30
【问题描述】:

我尝试删除和修剪列表以构建分页系统

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

我的列表有这样的结构:

[{"date":"2016-01-02T19:45:00.806Z", "id":"568828bc49017f16659f6978"}, {"date":"2016-01-02T19:44:56.040Z", "id":"568828b849017f16659f6977"},...]

我似乎无法修剪然后删除列表。以 21 个元素为例:它首先返回元素 21 到元素 13,然后元素 21 到元素 4,然后元素 3 到元素 1

我在 node.js 中的函数很简单,可以更改“从”和“到”我将“页面”从前端发送到 node.js 并使用此函数:

      var skip = 9 * (page -1);
      var lastIndexToReturn = skip + 9 + 1;

所以在第一个请求中从和到是'0'和'10',然后是'9'和'19',等等 通过使用 list.trim 和 list.drop 我认为我可以构建一个分页系统

【问题讨论】:

  • 您的列表条目是否足够小,以至于普通列表的有限大小适合您的用例?对于无限列表,Aerospike 有大型有序列表。有很多方法可以在没有 UDF 的情况下构建分页(性能更高),您会对这样的答案感兴趣吗?我了解您使用的是 node.js 客户端?干杯
  • 这是一个限制到大约 600 个元素的列表...我只使用一个 bin 和这个结构,所以它小于 128kb...实际上你正在使用 node.js...如果你有一个更好的方法我很高兴知道它......但我也知道为什么这段代码不起作用?顺便说一句,我 akso 尝试使用 largelist :stackoverflow.com/questions/34564418/…
  • 我还建立了一个带有节点的分页,我在其中比较日期和切片以对数组进行排序......但我认为在 lua 中完成整个工作会更好?
  • 我无法从您的代码中发现明显的问题,但是列表操作最近刚刚更改,我不知道新的 lua 操作的行为方式。对于 go 客户端,我将使用单个多操作来呈现页面和页面导航:在原子读取操作中结合 ListGetRange(binname,9*(pageIndex-1),9) 和 ListSize()。没有修剪,清除或复制列表。对于写入,这取决于您是否需要订购。如果要读取排序列表,请创建一个记录 UDF,该记录 UDF 需要插入一个元素并找到其正确位置并将其插入那里(其原子)。对于删除或更新,您可能需要 ...
  • 列表排序依据的唯一键。虽然 UDF 提供了极大的灵活性,但如果您可以避免使用它们,您可以获得更高的性能。使用 multi ops 命令,您可以这样做。例如。在上述情况下,您可以呈现第一页并知道有多少页。从排序列表中删除可以看到 UDF 的好处:没有它,您必须向客户端读取完整副本,找到位置然后写回希望/检查同时没有其他人更改列表。使用 UDF,它更简单,节省了延迟(往返)和带宽......

标签: arrays node.js sorting udf aerospike


【解决方案1】:
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

我最后编写了这个函数:为了确保不会得到列表索引的错误,我得到了列表的大小,并将这个大小与我想要分页的部分进行比较以确定返回什么:我没有'不要遍历整个数组。

当然,只有当记录是列表时它才有效 注意:确保来自客户端的第一个“来自”是 1,因为 lua 数组从 1 开始

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多