如何使用键和值将 LUA Table 插入到 Tarantool?

How to insert a LUA Table to Tarantool with Key and Value?

我有一个 JSON 字符串:

{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
    "geohash64" : 5637765837143565,
    "mime_type" : "image/jpg"
}

我已经使用 Tarantool 的模块将其转换为 Lua Table json:

table = json.decode(JSONstring)

然后我想将 table 插入 ID = 1

的 Tarantool
box.space.somespace:insert{1, table}

当我 select 以 JSON 形式添加到 Tarantool 数据库的 table 时,结果是这样的:

Cannot access values through key

我只能访问table[1]和table[2]:table[1]是ID = 1,而table[2]是所有 JSON 字符串。这意味着我无法使用键访问 JSON 的值:table['entry_offset']、table['entry_size']、.... return 当我尝试访问它们时为零

那么如何将 Lua table 插入 Tarantool 然后通过它的键访问值?

谢谢你的帮助!!!

您基本上是在 space 中插入一个包装元组,而不是 table 对象本身,所以当您这样做时:

obj = box.space.somespace:get{1}

你得到了你的元组,而不是 table。也就是说,如果您想使用键访问 table 的字段,您只需要像这样索引该对象:

table = obj[2]
print(table.entry_offset)

一旦您习惯了它,请查看 tarantool space format 功能及其 tomap/frommap 功能。这是基本示例,可能对您有所帮助:

box.cfg{}
box.schema.create_space('test', {if_not_exists = true})
box.space.test:create_index('pk', {unique = true, if_not_exists = true, parts = {1, 'unsigned'}})
box.space.test:format({
    { name = 'id', 'unsigned' },
    { name = 'entry_offset', 'unsigned' },
    { name = 'entry_size', 'unsigned' },
    { name = 'created_time', 'unsigned' },
    { name = 'additional_meta', 'map' },
})

json = require('json')
obj_json = [[{
"entry_offset" : 180587225765,
"entry_size" : 54003,
"created_time" : 1577500878,
"additional_meta" : {
    "geohash64" : 5637765837143565,
    "mime_type" : "image/jpg"
}}]]
obj = json.decode(obj_json)
obj.id = 1

tuple = box.space.test:frommap(obj)
box.space.test:insert(tuple)
result = box.space.test:get({1}):tomap()

print(result.additional_meta.mime_type)

或者,对于更高级的序列化方法,请查看 avro-schema with its flatten/unflatten methods. There are examples in README