sql >> Database >  >> NoSQL >> Redis

Hoe te controleren op nul/nul in Lua cjson van Redis?

TL;DR voor waarden geretourneerd door cjson.decode() , gebruik cjson.null om te vergelijken met JSON's null waarde.

Uitleg:Lua gebruikt nil in tabellen om verwijderde items te markeren. Als JSONinc null s zijn geconverteerd naar Lunatic nil s, zouden de gedecodeerde objecten beschadigd zijn. Daarom gebruikt de cjson-lib een lichtgewicht type gebruikersgegevens om null weer te geven /nil .

Uw 'call_data' heeft een 'date_created' veld dat null is - dat de fout veroorzaakt.

Het grappige is dat Redis, net als Lua, geen nul/nul-waarde opslaat, dus je moet ofwel null-waarden negeren of een speciale waarde in Redis gebruiken om ze te markeren.

Ervan uitgaande dat je ze negeert, is hier een manier om het te omzeilen:

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)

Een kleine optimalisatie zou ook zijn om de updates te batchen, zoals:

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

PS als je wilt, kijk dan eens naar ReJSON die ik heb geschreven - het is ontworpen om te helpen met wat het lijkt dat je probeert te doen.




  1. 2 manieren om de grootte van een document te krijgen in MongoDB

  2. Geneste array $pull-query met behulp van C# MongoDB-stuurprogramma

  3. MongoDB samengestelde index gebruik

  4. runCommand-equivalent voor nodejs-native-mongodb