【发布时间】: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