有没有办法在 Tarantool 中存储数组的字段上建立索引?
Is there the way to build index over the field that stores the array in Tarantool?
我需要从两部分创建部分索引,其中第一个字段是整数,第二个字段是数组。
然后我需要 select 所有第一个键的元组值相等且第二个键的值包含在数组中的元组。
即
box.space.test:select()
[..., 1, [1, 2, 3]]
[..., 1, [3, 4, 5]]
[..., 2, [3, 7, 9]]
box.space.test.index.test:select({1, 3})
[..., 1, [1, 2, 3]]
[..., 1, [3, 4, 5]]
可以使用 Tarantool 完成吗?
是的,这是可能的。您可以在任何索引中使用数组索引部分。
box.space.create_index() 上的文档对此进行了描述。不是很明显,需要在页面搜索“[*]”
这是您可以使用的完整示例:
local yaml = require('yaml')
box.cfg({listen=3301})
box.schema.space.create('test', {if_not_exists=true})
box.space.test:format({
{name='id',type='unsigned'},
{name='value',type='unsigned'},
{name='items',type='array'}})
box.space.test:create_index('primary',
{
unique = true,
parts = { {field = 'id', type = 'unsigned'}},
if_not_exists=true})
-- items[*] define a multi-key index part
box.space.test:create_index('secondary',
{
unique = false,
parts = {
{field = 'value', type = 'unsigned'},
{field='items[*]', type='unsigned'}},
if_not_exists=true})
box.space.test:put({1, 1, {1,2,3}})
box.space.test:put({2, 1, {2,7,8}})
box.space.test:put({3, 1, {3,7,8}})
box.space.test:put({4, 2, {4,5,6}})
local result = box.space.test.index.secondary:select({1,2})
print(yaml.encode(result))
此代码将输出以下内容:
---
- [1, 1, [1, 2, 3]]
- [2, 1, [2, 7, 8]]
...
我需要从两部分创建部分索引,其中第一个字段是整数,第二个字段是数组。
然后我需要 select 所有第一个键的元组值相等且第二个键的值包含在数组中的元组。
即
box.space.test:select()
[..., 1, [1, 2, 3]]
[..., 1, [3, 4, 5]]
[..., 2, [3, 7, 9]]
box.space.test.index.test:select({1, 3})
[..., 1, [1, 2, 3]]
[..., 1, [3, 4, 5]]
可以使用 Tarantool 完成吗?
是的,这是可能的。您可以在任何索引中使用数组索引部分。 box.space.create_index() 上的文档对此进行了描述。不是很明显,需要在页面搜索“[*]”
这是您可以使用的完整示例:
local yaml = require('yaml')
box.cfg({listen=3301})
box.schema.space.create('test', {if_not_exists=true})
box.space.test:format({
{name='id',type='unsigned'},
{name='value',type='unsigned'},
{name='items',type='array'}})
box.space.test:create_index('primary',
{
unique = true,
parts = { {field = 'id', type = 'unsigned'}},
if_not_exists=true})
-- items[*] define a multi-key index part
box.space.test:create_index('secondary',
{
unique = false,
parts = {
{field = 'value', type = 'unsigned'},
{field='items[*]', type='unsigned'}},
if_not_exists=true})
box.space.test:put({1, 1, {1,2,3}})
box.space.test:put({2, 1, {2,7,8}})
box.space.test:put({3, 1, {3,7,8}})
box.space.test:put({4, 2, {4,5,6}})
local result = box.space.test.index.secondary:select({1,2})
print(yaml.encode(result))
此代码将输出以下内容:
---
- [1, 1, [1, 2, 3]]
- [2, 1, [2, 7, 8]]
...