0

我有太空人

  1. ID
  2. 姓名
  3. 年龄

有两个索引:

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 }

我需要按姓名和年龄选择人而不是一些价值。例如,我想选择所有年龄> 10的'Alex',等待下一个结果:

[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]

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

4

2 回答 2

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

在这里,它开始使用 遍历所有记录name >= 'Alex' and age >= 10take_while用于将记录限制为仅匹配name == 'Alex'

:totable()是可选的,没有它,这个表达式可以在类似于 的 for 循环中使用pairs

于 2019-09-03T07:10:59.480 回答
2

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

你必须做什么才能看到预期的行为?您必须将 for 循环 [1] 与 GE 迭代器一起使用,并且您必须使用该循环内的 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
于 2018-03-22T08:14:09.053 回答