Tarantool:在 index.indexName:pairs 调用中使用 limit/offset

我需要从 space users 中获取一些记录。 该 space 具有二级索引 category_status_rating。 我需要选择 category=1status=1rating<=123456789 的用户:

for _, user in box.space.users.index.category_status_rating:pairs({ 1, 1, 123456789 }, { limit = 20, offset = 5, iterator = box.index.LE }) do
    if user[categoryIdx] ~= 1 or user[statusIdx] ~= 1 then break end
    table.insert(users, user)
end

据我所知,使用 indexName:pairs 进行迭代不支持 limit,我只能使用自己的计数器。但是 offset 呢?我可以使用这个参数并从我需要的“页面”开始吗?还是我会在没有任何 offset 的情况下迭代并传递无用的记录(约 100000),并在我的“页面”开始时开始 table.insert(users, user)? 谢谢!

点赞
用户1277198
用户1277198

使用存储位置替代offset,如果确实需要的话。

例如:

local last = 123456789
for i = 1, 2 do
    local count = 0
    for _, user in box.space.users.index.category_status_rating:pairs({1, 1, last}, { iterator = box.index.LE }) do
        if user[categoryIdx] ~= 1 or user[statusIdx] ~= 1 or count > 20 then
            break
        end
        table.insert(users, user)
        last = user[LAST_INDEX_FIELD]
        count = count + 1
    end
    -- 处理元组
end

或者使用 luafun(其中 drop_n 相当于 limit,将结果存储到 last 相当于 offset):

local last = 123456789
for i = 1, 2 do
    local users = box.space.users.index.category_status_rating:pairs({1, 1, last}, { iterator = box.index.LE }):take_n(20):map(function(user)
        last = user[LAST_INDEX_FIELD]
        return user
    end):totable()
    -- 处理元组
end

Luafun的文档,已经嵌入Tarantool中

2016-03-30 13:40:06