2016-03-30 9 views
2

Ich brauche einige Datensätze aus dem Weltraum zu holen users. Dieses Feld hat einen sekundären Index category_status_rating. Ich brauche ausgewählte Benutzer mit category=1, status=1, rating<=123456789:Tarantool: Limit/Offset in index.indexName: Paare Anruf

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 

Wie ich weiß, Iteration mit indexName:pairs nicht limit unterstützt und ich kann meine eigenen Zähler nur Benutzer. Aber was ist mit offset? Kann ich diesen Parameter verwenden und von "Seite" starten, die ich brauche? Oder werde ich ohne offset iterieren und nutzlose Datensätze (etwa 100000) übergeben und zu table.insert(users, user) starten, wenn meine "Seite" startet? Danke!

+1

Warum versuchst du es nicht einfach, wenn es das macht, was du willst? – Piglet

Antwort

3

Anstatt Offset zu verwenden, können Sie Ihre Position speichern (das ist das letzte getestete Tupel), wenn Sie es wirklich brauchen. z.B:

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 

oder unter Verwendung von luafun (wobei drop_n analog der Grenze ist, und Speichern in last ist analog der 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 

Documentation on LuaFun, die embedded into Tarantool ist.

+0

Hmm ... Aber was ist, wenn "Rating" kein eindeutiger Wert ist? Bedeutet dies, dass Aufzeichnungen von "ersten 20 Aufzeichnungen" in "zweiten 20 Aufzeichnungen" stehen können, wenn ich "letzte" als Position verwende? –

+0

Dann müssen Sie die Anzahl der Tupel mit der Bewertung 'last', die Sie verarbeitet haben, zählen und (zum Beispiel)' drop_n' verwenden – bigbes