2016-07-21 15 views
2

Ich habe ein Set, das drei Bins (PK, cat_id und Daten) haben. Der Listenindex wird auf cat_id angewendet. Ich bin in der Lage, Datensatz von Abfrage auswählen:Aerospike Löschen Datensatz in der Liste, wenn Element von bin bekannt

Es funktioniert gut für mich. Jetzt muss ich diesen Datensatz nach der gleichen Bedingung löschen. Aber wie ich gelesen habe, ist PK notwendig, um einen Datensatz zu löschen. In meinem Fall habe ich cat_id, um diesen Datensatz zu löschen.

Hilf mir, diesen Datensatz zu löschen, indem ich bin-Element nicht PK verwende. Ich benutze PHP dafür. AQL funktioniert auch für mich.

Antwort

1

Sie würden eine asynchrone Hintergrundabfrage verwenden, die eine winzige (record UDF) Lua-Funktion auf jeden Datensatz anwendet, der mit dem Prädikat dieser Abfrage übereinstimmt. Im PHP-Client würden Sie dazu die Methode queryApply() verwenden.

Diese Lua Funktion 'sterben' einfach sagt:

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

ich die Lua UDF API reference für diese 'komplexe' Funktion, vor allem der aerospike object Referenz. Wenn Sie mehr Logik verwenden möchten, wie andere Bins überprüfen, verwenden Sie die Methoden record. Auf der Aerospike-Website gibt es weitere Informationen zu UDFs und developing Record UDFs.

Sobald Sie register UDF module (die Datei diese Funktion enthält) mit dem Cluster, können Sie es von Ihrem PHP-Code aufrufen können:

$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(); 
} 
+1

Ihnen sehr @Ronen danken. Du bist toll . Auch ich möchte über UDF-Leistung wissen. Ich kann zuerst PK auswählen, indem ich Aerospike :: INDEX_TYPE_LIST benutze, und danach werde ich den Datensatz mit diesem PK löschen. Also was ist besser UDF oder zuerst auswählen als löschen. Und können Sie mir bitte sagen, wie viel gleichzeitige (Update/Delete/Add) Anfrage Aerospike verarbeiten kann, wenn RAM 1 GB zugewiesen ist? Es wird sehr vorteilhaft für mich sein. –

+1

UDFs benötigen mehr Speicher (müssen eine Lua-Instanz haben) und sind langsamer als eine native Operation. Sie parallelisieren nicht so gut wie native Schlüsselwertoperationen. Wenn Sie eine sehr niedrige Latenzzeit für eine Operation oder sehr hohe Parallelität benötigen, sollten Sie wahrscheinlich keine UDF verwenden. Für Ihr Löschbeispiel können Sie die UDF-Datei, die einem Hintergrundscan oder einer Abfrage zugeordnet ist, problemlos verwenden, da dies asynchron durchgeführt werden kann. –