sql >> Database teknologi >  >> NoSQL >> Redis

Hvordan tjekker man for nul/nul i Redis' Lua cjson?

TL;DR for værdier returneret af cjson.decode() , brug cjson.null at sammenligne med JSON's null værdi.

Forklaring:Lua bruger nil i tabeller for at markere slettede poster. Hvis JSONinc null s blev konverteret til Lunatic nil s, ville de afkodede objekter være korrupte. Derfor bruger cjson lib en letvægts brugerdatatype til at repræsentere null /nil .

Dine 'call_data' har et 'date_created'-felt, der er null - som forårsager fejlen.

Det sjove er, at Redis, ligesom Lua, ikke vil gemme en nul/nul værdi, så du bliver enten nødt til at ignorere nulværdier eller bruge en speciel værdi i Redis for at markere dem.

Hvis du antager, at du ignorerer dem, er der én måde at undgå det på:

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 lille optimering ville også være at batchere opdateringerne, som sådan:

  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. Hvis du vil, så se på ReJSON, som jeg skrev - den er designet til at hjælpe med, hvad det ser ud til, at du forsøger at gøre.




  1. Introduktion til Redis

  2. Hvordan kan jeg bruge en regex-variabel i en forespørgsel til MongoDB

  3. Hvordan implementerer du et primært ID med automatisk stigning i MongoDB?

  4. Vælg dokumenter, hvor alle værdier i et matrixfelt findes i et andet matrix