使用不同的迭代器

时间:2018-03-21 11:06:38

标签: lua tarantool

我有空间

  1. ID
  2. 名称
  3. 年龄
  4. 有两个索引:

    peoples = box.schema.space.create('peoples', {engine = 'memtx', field_count = 3, if_not_exists = true})
    peoples:create_index('primary', {type = 'TREE', unique = true, parts = {1, 'unsigned'}, if_not_exists = true})
    peoples:create_index('by_name_age', {type = 'TREE', unique = false, parts = {2, 'STR', 3, 'unsigned'}, if_not_exists = true})
    

    和数据:

    peoples:auto_increment{ 'name_1', 10 }
    peoples:auto_increment{ 'name_1', 11 }
    peoples:auto_increment{ 'name_1', 12 }
    

    我需要按姓名和年龄选择人数超过某些值。 例如,我想选择年龄> gt的所有'Alex'; 10,等待下一个结果:

    [1, 'Alex', 11]
    [2, 'Alex', 12]
    

    我尝试执行查询:

    peoples.index.by_name_age:select({'Alex', 10}, {{iterator = box.index.EQ},{iterator = box.index.GT}})
    

    但得到结果

    [1, 'Alex', 10]
    

    如何为名称和年龄索引部分使用不同的迭代器?

2 个答案:

答案 0 :(得分:2)

你有一个索引,它按第一部分排序。意味着它无法按照您的预期进行选择。

您需要做些什么才能看到预期的行为?你必须在GE迭代器中使用for循环[1],你必须使用此循环中的if条件测试范围。

[1]一个简单的代码示例:

local test_val = 'Alex'
for _, v in peoples.index.by_name_age:select({test_val, 10}, {iterator = box.index.GE})
   if v[1] ~= test_val then
   -- do exit
   end
   -- do store result 
end

答案 1 :(得分:1)

peoples.index.by_name_age:pairs({'Alex', 10}, 'GE'):
    take_while(function(x) return x.name == 'Alex' end):
    totable()

此处开始使用name >= 'Alex' and age >= 10遍历所有记录。 take_while用于将记录仅限制为匹配name == 'Alex'

:totable()是可选的,没有它,该表达式可以像pairs一样在for循环中使用。