2

space からいくつかのレコードをフェッチする必要がありますusers。このスペースには副次索引がありますcategory_status_ratingcategory=1、、status=1で ユーザーを選択する必要がありますrating<=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)、「ページ」が始まるときに開始しますか? ありがとう!

4

1 に答える 1

3

オフセットを使用する代わりに、本当に必要な場合は位置 (最後にチェックされたタプル) を保存できます。例えば:

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
    -- process your tuples
end

または、luafun を使用します (ここで、drop_nは limit の類似物であり、save intolastは 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()
    -- process your tuples
end

Tarantool組み込まれている LuaFunに関するドキュメント。

于 2016-03-30T13:40:06.080 に答える