Select 来自 Tarantool,通过具有不同迭代器的复合索引
Select from Tarantool by composite index with different iterators
我有 space 人:
- id
- 名字
- 年龄
有两个索引:
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 }
我需要 select 人的名字和年龄,而不是某个值。
比如我想select所有年龄>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]
如何对姓名和年龄索引部分使用不同的迭代器?
您有一个索引并按第一部分排序。意味着它不能像您期望的那样进行选择。
您需要做什么才能看到预期的行为?您必须将 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
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 循环中
我有 space 人:
- id
- 名字
- 年龄
有两个索引:
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 }
我需要 select 人的名字和年龄,而不是某个值。 比如我想select所有年龄>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]
如何对姓名和年龄索引部分使用不同的迭代器?
您有一个索引并按第一部分排序。意味着它不能像您期望的那样进行选择。
您需要做什么才能看到预期的行为?您必须将 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
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
.