Skip to content

Background filter query

For the complete documentation index see: llms.txt

All documentation pages available in markdown.

A common use case for a background query — see the guide for Java, Go, or Python — is to perform maintenance or cleanup operations on a database. Unlike production queries, which are highly optimized, maintenance operations may involve scans of the entire database for records which meet some criteria.

  • Optionally narrow the scan before evaluating any filter expression:

    • Limit it to a single set, as the examples below do (stmt.setSetName(mySet) in Java, the mySet argument to as.NewStatement() in Go, or the my_set argument to client.query() in Python).
    • Filter on a secondary index, if a suitable index exists on the set — see the guide for Java, Go, or Python. The server applies the secondary index filter before the filter expression.
  • Create a filter expression which selectively retrieves records. You can combine any of the following in a single filter expression:

  • Process the query in the background.

  • Perform one or more operations on the returned records.

    Record operations include:

Scans which go through an entire dataset can take a long time. Aerospike provides tools for monitoring long-running queries. See Query Management for more information.

The following example creates a filter expression which identifies all records which do not have a TTL (time to live) value set. The TTL value specifies a duration in seconds after which the record expires and is removed from the set.

private static void touchByTTL(AerospikeClient client) {
Statement stmt = new Statement();
stmt.setNamespace(namespace);
stmt.setSetName(mySet);
WritePolicy policy = client.copyWritePolicyDefault();
// Create the expression
policy.filterExp = Exp.build(Exp.eq(Exp.ttl(), Exp.val(-1)));
// Touch each record found by the expression
ExecuteTask task = client.execute(policy, stmt, Operation.touch());
System.out.println("Touched records with TTL equals to -1");
System.out.println("task.id: " + task.getTaskId());
}

For monitoring purposes, you must have the task ID of a particular query.

ExecuteTask.getTaskId() returns the task ID of the current job. The touchByTTL() method above already prints it right after client.execute(...):

Touched records with TTL equals to -1
task.id: 5234562535299509836

Starting with Aerospike Database 8.2, the Developer SDK (Java and Python) accepts the same filter as AEL (Aerospike Expression Language) text passed to .where(), instead of a compiled expression. See the AEL overview and AEL reference for the full grammar.

DataSet records = DataSet.of(namespace, mySet);
ExecuteTask task = session.backgroundTask()
.touch(records)
.where("$.ttl() == -1")
.execute();

Query management

Use task ID of your background query with the Aerospike admin tool to manage the job, or terminate it.

Admin+> show jobs queries trid 5234562535299509836
~~~~~~~~~~~~~Query Jobs (2024-11-30 23:21:42 UTC)~~~~~~~~~~~~~
Node |mycluster-1:3000 |172.17.0.2:3000
Namespace |test |test
Module |query |query
Type |basic |basic
Progress % |100.0 |100.0
Transaction ID |5234562535299509836 |5234562535299509836
Time Since Done |00:12:51 |00:12:51
active-threads |0 |0
from |127.0.0.1+60036 |172.17.0.3+55372
n-pids-requested |2.048 K |2.048 K
net-io-bytes |30.000 B |149.000 B
net-io-time |00:00:00 |00:00:00
recs-failed |0.000 |0.000
recs-filtered-bins|0.000 |0.000
recs-filtered-meta|0.000 |0.000
recs-succeeded |0.000 |1.000
recs-throttled |0.000 |0.000
rps |0.000 |0.000
run-time |00:00:00 |00:00:00
set |testset |testset
sindex-name |mysindex |mysindex
socket-timeout |00:00:30 |00:00:30
status |done(ok) |done(ok)
Number of rows: 23
Admin+> manage jobs kill trids 1343444200604843206 9156474088110606100
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Kill Jobs (2024-10-20 23:57:22 UTC)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Node| Transaction ID|Namespace|Module| Type| Response
10.0.0.1:3000|9156474088110606100| bar|scan |basic|ok
10.0.0.2:3000|1343444200604843206| bar|query |basic|Failed to kill job : job not active.
Number of rows: 1