Php 如果bin元素已知,Aerospike将删除列表中的记录

Php 如果bin元素已知,Aerospike将删除列表中的记录,php,aerospike,Php,Aerospike,我有一套有三个箱子(PK、cat_id和数据)。列表索引应用于cat_id。我可以通过查询选择记录: SELECT * FROM test.myset IN LIST where cat_id = '1' 这对我来说很好。现在我需要按相同的条件删除此记录。但正如我所读到的,PK是删除任何记录所必需的。就我而言,我有cat_id来删除此记录 请帮助我使用bin元素not PK删除此记录。我正在使用PHP。AQL也适用于我。您可以使用一个异步后台查询,将一个极小的()Lua函数应用于与该查询的谓词

我有一套有三个箱子(PK、cat_id和数据)。列表索引应用于cat_id。我可以通过查询选择记录:

SELECT * FROM test.myset IN LIST where cat_id = '1'
这对我来说很好。现在我需要按相同的条件删除此记录。但正如我所读到的,PK是删除任何记录所必需的。就我而言,我有cat_id来删除此记录


请帮助我使用bin元素not PK删除此记录。我正在使用PHP。AQL也适用于我。

您可以使用一个异步后台查询,将一个极小的()Lua函数应用于与该查询的谓词匹配的每个记录。在PHP客户端中,您将使用此方法

这个Lua函数只表示“die”:

function del_rec(rec)
    aerospike:remove(rec)
end
对于这个“复杂”函数,我使用了,主要是引用。如果你想做更多的逻辑,比如检查其他箱子,你应该使用这些方法。Aerospike网站上有更多信息

使用集群(包含此函数的文件)后,可以从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();
}

非常感谢@Ronen。你太棒了。我也想知道UDF的性能。我可以首先使用Aerospike::INDEX_TYPE_LIST选择PK,然后使用该PK删除记录。那么,UDF或first select比delete更好的方法是什么呢。另外,如果ram被分配到1GB,您能告诉我aerospike可以处理多少并发(更新/删除/添加)请求吗?这将对我非常有益。UDF占用更多内存(必须有一个Lua实例),并且比本机操作慢。它们的并行性不如本机键值操作。如果您需要非常低的操作延迟,或者非常高的并发性,那么您可能不应该使用UDF。对于delete示例,您可以轻松地使用附加到后台扫描或查询的recordudf,因为异步执行该操作很好。