Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como verificar nil/null no Redis' Lua cjson?


TL;DR para valores retornados por cjson.decode() , use cjson.null para comparar com o null do JSON valor.

Explicação:Lua usa nil nas tabelas para marcar as entradas excluídas. Se JSONinc null s foram convertidos para Lunatic nil s, os objetos decodificados estariam corrompidos. Portanto, a biblioteca cjson usa um tipo userdata leve para representar null /nil .

Seu 'call_data' tem um campo 'date_created' que é nulo - isso causa o erro.

O engraçado é que o Redis, como Lua, não armazenará um valor nil/null, então você terá que ignorar valores nulos ou usar um valor especial no Redis para marcá-los.

Supondo que você irá ignorá-los, aqui está uma maneira de contornar isso:
local call_data     = cjson.decode(ARGV[1])
local other_data    = cjson.decode(ARGV[2])
local data          = {}
local next          = next
local null          = cjson.null
local populate_data = function(source)
  if next(source) == nil then
    return
  end

  for property,value in pairs(source) do
    if value ~= null then
      redis.call('HSET', KEYS[2], property, value)
    end
  end
end
populate_data(call_data)
populate_data(other_data)

Além disso, uma pequena otimização seria agrupar as atualizações, assim:
  local payload = {}
  for property,value in pairs(source) do
    if value ~= null then
      table.insert(payload, property)
      table.insert(payload, value)
    end
  end
  redis.call('HSET', KEYS[2], unpack(payload))

P.S. se você quiser, veja o ReJSON que escrevi - ele foi projetado para ajudar com o que parece que você está tentando fazer.