如何在 Tarantool 中选择数据?

我创建了一个具有两个索引的 space:

box.schema.sequence.create('user_seq', { if_not_exists = true })
box.schema.create_space('users', { if_not_exists = true, format={
    { name = 'id', type = 'unsigned'},
    { name = 'name', type = 'string'},
    { name = 'age', type = 'unsigned'}}
})
box.space.users:create_index('pk', { parts = { 'id' }, if_not_exists = true })
box.space.users:create_index('age', { parts = { 'age' }, if_not_exists = true })

已插入了一些记录:

box.space.users:insert({ box.sequence.user_seq:next(), 'Artur Barsegyan', 24})
box.space.users:insert({ box.sequence.user_seq:next(), 'Kostya Nazarov', 32})

我应该如何选择数据?

点赞
用户10792439
用户10792439

如果需要按索引迭代,应调用所需索引上的pairs方法。例如:

for _, tuple in box.space.users.index.age:pairs({30}, { iterator = 'LT' }) do
    print(tuple)
end

您会得到以下结果:

[1, 'Artur Barsegyan', 24]
---
...

我们做了什么?我们已经通过所有年龄小于30岁的年龄索引迭代了所有元组。有关迭代器和其他参数和过滤器的更多详细信息,请参见文档。

如果要选择空间中的所有元组,请在没有参数的情况下在空间对象上调用pairs方法:

tarantool> for i, tuple in box.space.users:pairs() do
         > print(tuple)
         > end
[1, 'Artur', 'Barsegyan', 24, {'gender': 'male', 'position': 'Product Manager'}]
[2, 'Kostya', 'Nazarov', 32, {'gender': 'male', 'position': 'Lead of Tarantool Solutions'}]
---
...

在文档和以下SO问题中探索更多参数和过滤器:

2020-09-23 11:48:33
用户4984564
用户4984564

为什么不以简单的方式做事呢?

box.schema.space.create "users"
box.space.users:format { { name="id", type="unsigned"} --[[等等]] }
box.space.users:create_index("primary", { sequence = true })
box.space.users:insert { nil, "John Doe", 20 }
box.space.users:insert { nil, "Jon Snow", 20 }

local all_users = box.space.users:select()
2020-09-23 13:06:09