sql >> Databáze >  >> NoSQL >> Redis

Jak zkontrolovat nulu/null v Redis' Lua cjson?

TL;DR pro hodnoty vrácené cjson.decode() , použijte cjson.null pro srovnání s null JSON hodnotu.

Vysvětlení:Lua používá nil v tabulkách k označení smazaných záznamů. Pokud JSONinc null s byly převedeny na šílence nil s, dekódované objekty by byly poškozeny. Proto knihovna cjson používá odlehčený typ uživatelských dat k reprezentaci null /nil .

Vaše 'call_data' obsahuje pole 'date_created', které je prázdné – to způsobuje chybu.

Legrační je, že Redis, stejně jako Lua, neuloží hodnotu nula/null, takže budete muset buď ignorovat hodnoty null, nebo použít speciální hodnotu v Redis k jejich označení.

Za předpokladu, že je budete ignorovat, zde je jeden způsob, jak to obejít:

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)

Také by malou optimalizací bylo dávkovat aktualizace, například takto:

  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. pokud chcete, podívejte se na ReJSON, který jsem napsal - je navržen tak, aby vám pomohl s tím, co se zdá, že se snažíte udělat.




  1. Jak získat ID objektu v PyMongu po vložení?

  2. Skript Redis Lua implementující CAS (check-and-set)?

  3. Vytvořte textový index s různými tloušťkami polí v MongoDB

  4. Vytváření ovladače mongo-cxx pomocí CMake ExternalProject_Add