sql >> Databasteknik >  >> NoSQL >> Redis

Hur kontrollerar jag noll/null i Redis' Lua cjson?

TL;DR för värden som returneras av cjson.decode() , använd cjson.null att jämföra med JSONs null värde.

Förklaring:Lua använder nil i tabeller för att markera raderade poster. Om JSONinc null s konverterades till Lunatic nil s, de avkodade objekten skulle vara korrupta. Därför använder cjson lib en lättviktig användardatatyp för att representera null /nil .

Din "call_data" har ett "date_created"-fält som är null - som orsakar felet.

Det roliga är att Redis, liksom Lua, inte kommer att lagra ett noll/nollvärde, så du måste antingen ignorera nollvärden eller använda ett speciellt värde i Redis för att flagga dem.

Förutsatt att du kommer att ignorera dem, här är en väg runt det:

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)

En liten optimering skulle också vara att batcha uppdateringarna, som så:

  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. Om du vill, titta på ReJSON som jag skrev - den är utformad för att hjälpa till med vad det verkar som du försöker göra.




  1. Komma igång med MongoDB User Management

  2. Redis - Använder Incr-värde i en transaktion

  3. Förstå MongoDB Client Timeout-alternativ

  4. Den snabbaste MongoDB på Azure!