sql >> Base de Datos >  >> NoSQL >> Redis

¿Cómo comprobar nil/null en Redis' Lua cjson?

TL;DR para valores devueltos por cjson.decode() , usa cjson.null para comparar con null de JSON valor.

Explicación:Lua usa nil en las tablas para marcar las entradas eliminadas. Si JSONinc null s se convirtieron a Lunatic nil s, los objetos decodificados estarían dañados. Por lo tanto, cjson lib usa un tipo de datos de usuario ligero para representar null /nil .

Su 'call_data' tiene un campo 'date_created' que es nulo, lo que provoca el error.

Lo curioso es que Redis, como Lua, no almacenará un valor nulo/nul, por lo que tendrá que ignorar los valores nulos o usar un valor especial en Redis para marcarlos.

Asumiendo que los ignorará, aquí hay una forma de evitarlo:

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)

Además, una pequeña optimización sería agrupar las actualizaciones, así:

  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))

PD si quieres, mira ReJSON que escribí:está diseñado para ayudarte con lo que parece que estás tratando de hacer.