Это можно сделать, используя как Lua, так и SQL.
1) Вот пример на Lua. Предположим, у нас есть пространство с именем «users» с полями «name», «фамилия», «age». Во-первых, давайте создадим и заполните пространство:
$ tarantool
Tarantool 2.1.1-465-gbd1a43fbc
type 'help' for interactive help
tarantool> box.cfg({})
...
2019-06-10 14:51:33.827 [47393] main/102/interactive I> ready to accept requests
...
2019-06-10 14:51:33.827 [47393] main/104/checkpoint_daemon I> scheduled next checkpoint for Mon Jun 10 16:14:44 2019
---
...
tarantool> s = box.schema.space.create('users', {temporary=true})
---
...
tarantool> box.space.users:format({{'id','unsigned'},{'name','string'},{'surname','string'},{'age','unsigned'}})
---
...
tarantool> s:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
---
- unique: true
parts:
- type: unsigned
is_nullable: false
fieldno: 1
id: 0
space_id: 512
name: primary
type: TREE
...
tarantool> s:insert({1,'Pasha','Yudin',33})
---
- [1, 'Pasha', 'Yudin', 33]
...
tarantool> s:insert({3,'Kostya','Nazarov',34})
---
- [2, 'Kostya', 'Nazarov', 34]
...
tarantool> s:insert({2,'Oleg','Babin',23})
---
- [3, 'Oleg', 'Babin', 23]
...
tarantool> s:insert({4,'Roma','Babaev',34})
---
- [4, 'Roma', 'Babaev', 34]
...
Давайте выберем все записи из пробела:
tarantool> s:select()
---
- - [1, 'Pasha', 'Yudin', 33]
- [2, 'Kostya', 'Nazarov', 23]
- [3, 'Oleg', 'Babin', 34]
- [4, 'Roma', 'Babaev', 34]
...
Далее, давайте выберем всех пользователей старше 33 лет. Библиотека LuaFun может использоваться:
tarantool> fun = require('fun')
---
...
tarantool> fun.iter(s:select()):filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
- [4, 'Roma', 'Babaev', 34]
...
Но, как упомянул @AlexanderTurenko ниже, лучше использовать итератор pairs
, чтобы не загружать дополнительные кортежи в память:
tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):totable()
---
- - [3, 'Oleg', 'Babin', 34]
- [4, 'Roma', 'Babaev', 34]
...
Также этот вариант короче и более читабелен.
Наконец, давайте выберем только одного пользователя, который соответствует нашим критериям, что эквивалентно запросу SQL "SELECT * FROM users WHERE age > 33 LIMIT 1
":
tarantool> s:pairs():filter(function (tuple) return tuple.age > 33 end):take_n(1):totable()
---
- - [3, 'Oleg', 'Babin', 34]
...
2) Начиная с Tarantool 2.0, это можно сделать с использованием SQL (при условии, что у вас есть формат пространства):
box.execute('select * from users where age > 33 limit 1;')