Как я могу работать с дублирующимися элементами в скрипте Aerospike - PullRequest
0 голосов
/ 12 октября 2018

У меня есть скрипт, он работает нормально, но я должен его обновить.Скрипт теперь добавляет элементы без какой-либо проверки существующих.

    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

Я пытаюсь перебрать список с помощью значения for в list.iterator (l) и добавить элемент, если значение ~ = val, но это не сработало.Идентификатор в функции - 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 голосов
/ 20 октября 2018

Не создавайте UDF для чего-либо, существующего как операция List API .UDF не будут работать так же хорошо, как и масштабироваться.

Вы можете сделать это без UDF.Вот пример того же действия с использованием Python-клиента .

from aerospike_helpers.operations import list_operations as lh
from aerospike_helpers.operations import operations as oh

list_policy = {
    "list_order": aerospike.LIST_UNORDERED,
    "write_flags": (aerospike.LIST_WRITE_ADD_UNIQUE |
                    aerospike.LIST_WRITE_NO_FAIL)
}
ops = [
    oh.write('id', id),
    lh.list_append('h', val, list_policy)
]
client.operate(key, ops)

У меня есть пример аналогичной вещи в rbotzer / aerospike-cdt-examples .

...