Aerospike Удалить запись в списке, если известен элемент bin

У меня есть набор с тремя ячейками (PK, cat_id и data). Индекс списка применяется к cat_id. Я могу выбрать запись по запросу:

SELECT * FROM test.myset IN LIST where cat_id = '1'

Это работает нормально для меня. Теперь мне нужно удалить эту запись в том же состоянии. Но, как я прочитал, PK необходимо удалить любую запись. В моем случае у меня есть cat_id, чтобы удалить эту запись.

Помогите мне удалить эту запись, используя элемент bin, а не PK. Я использую PHP для этого. AQL также работает для меня.

2

Решение

Вы бы использовали асинхронный фоновый запрос, который применяет крошечный (запись UDF) Функция Lua для каждой записи, соответствующей предикату этого запроса. В клиенте PHP вы бы использовали queryApply () метод для этого.

Эта функция Lua просто говорит «умереть»:

function del_rec(rec)
aerospike:remove(rec)
end

Я использовал Справочник по Lua UDF API для этой «сложной» функции, в основном аэрокосмический объект ссылка. Если вы хотите сделать больше логики, например, проверить другие корзины, вы бы использовали запись методы. Там больше информации о UDFs а также разработка записей UDF на веб-сайте Aerospike.

Однажды ты зарегистрировать модуль UDF (файл, содержащий эту функцию) с кластером, вы можете вызвать его из своего кода PHP:

$where = Aerospike::predicateContains("cat_id", Aerospike::INDEX_TYPE_LIST, 1);
$status = $client->queryApply("test", "mytest", $where, "my_udfs", "del_rec", [], $job_id);
if ($status === Aerospike::OK) {
var_dump("The background job ID is $job_id");
} else {
echo "An error occured while initiating the background query [{$client->errorno()}] ".$client->error();
}
2

Другие решения

Других решений пока нет …