You would use a record UDF, written in Lua, to inspect whether the criteria are met for deletion, and if they are you’d call the aerospike.remove() function.
Currently you have to use scanApply() to attach the record UDF to a scan of the set Company.Products. Be aware that we are working on secondary index record UDFs, meaning there will soon be a queryApply() that will let you run a record UDF against the records matched by a secondary index query. This should fit your use case better, as the query itself can be targeted at an index over product type or ID, rather than scanning all the records in the set.
Thank you for your answer. After query, I have a RecordSet about 2M records, now I want to remove all these records . Can you tell me how I can do this with best performance ?
This is my code to do this but it’s very slow (200s to remove 2M record).
As I pointed out, you do not want to get a RecordSet, you want to apply a record UDF to each that matches your criteria. The UDF has a single line removing the record it’s being applied to.
Here’s a similar example of modifying the TTL of all records that match a specific criteria. You would change the Lua code from trying to modify the TTL and update the record to an aerospike:remove(rec) call.
Hello zbotzer,
I removed records from aerospike by update TTL = 1 to record. But the records still on Ram and after few seconds( ~ 10s ) , the records have gone from Ram. I want after update TTL then record has gone immediate so how I can do that ?
If you set the TTL to 1s, it will expire one second after being written. The record cannot be accessed by a get once it is expired, but it still needs the nsup thread to clean it up from the primary index. It’ll consume the 64B of DRAM in the primary index until it’s removed by the namespace supervisor.
Instead of changing the TTL to 1 second in order to remove a record, your code should call aerospike:remove(rec). See the aerospike module of the Lua UDF API. That will immediately remove the record’s metadata from the primary index.
What you were doing before (rather than updating the TTL) should work.
How to delete a single record from AQL?
Found below query from aerospike documentation but unable to get the PK of a record to delete.
DELETE FROM [.] WHERE PK=
PK is what is your key - when you created a record. Aerospike (at the client library) takes your key, set name (defualt null) and you key type inferred, and hashes to a digest in the client library. The client library sends only the digest to the Aerospike server by default. So all the server has is your record’s digest against which it looks up the record’s value or data. You have to know your key.
So - DELETE FROM mynamespace.myset WHERE PK = “mykey”