Search code examples
luatarantool

How to make a select via secondary indexes in Tarantool?


I create a space with two indexes — primary and secondary:

box.schema.sequence.create('user_seq', { if_not_exists = true })
box.schema.space.create('user', {
    if_not_exists = true,
    format = {
        { name = 'id', type = 'unsigned'},
        { name = 'bio', type = 'string'}
    }
})
box.space.user:create_index('id', {
     sequence = 'user_seq',
     parts = {'id'}
})
box.space.user:create_index('bio', {
     parts = {'bio'},
     if_not_exists = true,
     unique = false
})

Insert the tuple:

tarantool> box.space.user:insert({ box.sequence.user_seq:next(), 'other stuff'})
---
- [1, 'other stuff']
...

I've tried to search like this:

box.space.user:select({'other stuff'})

And got the error:

- error: 'Supplied key type of part 0 does not match index part type: expected unsigned'

How I should search via secondary indexes?


Solution

  • The documentation said:

    index.index-name is optional. If it is omitted, then the assumed index is the first (primary-key) index. Therefore, for the example above, box.space.tester:select({1}, {iterator = 'GT'}) would have returned the same two rows, via the ‘primary’ index.

    Use that secondary index explicitly:

    tarantool> box.space.user.index.bio:select({'other stuff'})
    ---
    - - [1, 'other stuff']
    ...
    

    Read more about it in the documentation.