Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Wie überprüfe ich nil/null in Redis' Lua cjson?

TL;DR für Werte, die von cjson.decode() zurückgegeben werden verwenden Sie cjson.null zum Vergleich mit null von JSON Wert.

Erklärung:Lua verwendet nil in Tabellen, um gelöschte Einträge zu markieren. Wenn JSONinc null s wurden in Lunatic nil konvertiert s, die decodierten Objekte wären beschädigt. Daher verwendet die cjson-Bibliothek einen leichtgewichtigen Benutzerdatentyp, um null darzustellen /nil .

Ihre 'call_data' hat ein 'date_created'-Feld, das null ist - das verursacht den Fehler.

Das Lustige ist, dass Redis, wie Lua, keinen Null-/Null-Wert speichert, also müssen Sie entweder Null-Werte ignorieren oder einen speziellen Wert in Redis verwenden, um sie zu markieren.

Angenommen, Sie ignorieren sie, hier ist eine Möglichkeit, sie zu umgehen:

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)

Eine kleine Optimierung wäre auch, die Aktualisierungen wie folgt zu bündeln:

  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. Wenn Sie möchten, schauen Sie sich ReJSON an, das ich geschrieben habe - es soll Ihnen bei dem helfen, was Sie zu tun scheinen.