我该如何处理Aerospike脚本中的重复项

时间:2018-10-12 09:49:47

标签: lua aerospike

我有脚本,它可以正常工作,但是我必须对其进行更新。脚本现在可以添加项目,而无需检查是否存在。

    function put_page(rec, id, val)
        local l = rec['h']
        if l==nil  then l = list() rec['id'] = id  end
        list.append(l, val)
        rec['h'] = l
        if aerospike:exists(rec) then aerospike:update(rec) else aerospike:create(rec) end 
    end

我尝试用list.iterator(l)中的for值遍历列表,如果value〜= val追加项,但是没有用。 函数中的ID为Solr document_id,val为users_id。我从aerospike得到了示例对象:(('contextChannel','ContextChannel',None,bytearray(b'E \ xfb \ xa3 \ xd0 \ r \ xd6 \ r \ J @ f \ xa8 \ xf6> y!\ xd18 = \ x9b')),{'ttl':2592000,'gen':8},{'id':'ALKSD4EW','h':[]})

更新 我尝试了不同的变体,这是可行的:

    function put_page(rec, id, val)
        local l = rec['h']
        local count = 0
        if l==nil  then l = list() rec['id'] = id  end
        for value in list.iterator(l) do
            if (value ~= val) then count = count + 1 end
        end
        if (list.size(l) == count) then list.append(l, val) end
        rec['h'] = l
        if aerospike:exists(rec) then aerospike:update(rec) else aerospike:create(rec) end
    end

1 个答案:

答案 0 :(得分:1)

请勿为List API操作中存在的内容创建UDF。 UDF的效果不佳,也无法扩展。

您可以在没有UDF的情况下执行此操作。这是一个使用Python client进行相同操作的示例。

[^\s]

我在rbotzer/aerospike-cdt-examples有一个类似的例子。