Expressions
Jump to the Code block for a combined complete example.
Aerospike Expressions is a strongly typed, functional, domain-specific language designed for manipulating and comparing bins and record metadata. This page explores expression usage within single record commands.
For expression usage within multi-record requests see the Batch Operations and Queries pages.
Setup
The following examples will use the setup and record structure below to illustrate the use of expressions in single record commands.
const Aerospike = require('aerospike');const op = Aerospike.operations;const map = Aerospike.maps;const list = Aerospike.lists;const exp = Aerospike.exp;
// Define host configurationlet config = {hosts: '127.0.0.1:3000'};
// Creates a key with the namespace "sandbox", set "ufodata", and user key 5001let key = new Aerospike.Key('sandbox', 'ufodata', 5001);
The record structure:
+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+| PK | occurred | reported | posted | report | location |+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+| 5001 | 20220531 | 20220601 | 20220601 | MAP('{"shape":["circle", "flash", "disc"], "summary":"Large flying disc flashed in the sky above the student union. Craziest thing I've ever seen!", "city":"Ann Arbor", "state":"Michigan", "duration":"5 minutes"}') | GeoJSON('{"type":"Point","coordinates":[42.2808,83.743]}') |+------+----------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------+
Filter Expressions
Introduced in Aerospike Database 5.2, Filter Expressions are commonly used to select records that satisfy a boolean expression and work with all single record commands (reads, writes, operations, and record UDFs), batch reads, and queries. Filters are only executed when a record exists, not executing when a record is created or not found.
Read
When using a Filter Expression on a read command, the expression is defined within the read policy.
The following example creates a filter expression that checks the length of the shape
list in the report
map and only returns if there are more than two shapes.
// Create the policylet readPolicy = new Aerospike.ReadPolicy({ filterExpression: exp.gt( exp.lists.size( exp.maps.getByKey(exp.binMap('report'), exp.str('shape'), exp.type.LIST, map.returnType.VALUE) ), exp.int(2) )});
;(async () => { // Establishes a connection to the server let client = await Aerospike.connect(config);
// Read the record let record = await client.get(key, readPolicy);
// Do something console.info('Record: %o', record.bins);
// Close the connection to the server client.close();})();
Write
When using a Filter Expression on a write command, the expression is defined within the write policy.
The following example creates a filter expression that checks if occurred
is later than 20211231
and posted
exists. If the filter returns true, a recent
key with the value true
will be added to the report
map.
// Create the policylet writePolicy = new Aerospike.WritePolicy({ filterExpression: exp.and( exp.gt(exp.binInt('occurred'), exp.int(20211231)), exp.binExists('posted') )});
// Create the opslet ops = [ map.put('report', 'recent', true)];
;(async () => { // Establishes a connection to the server let client = await Aerospike.connect(config);
// Update the record client.operate(key, ops, [], writePolicy);
// Close the connection to the server client.close();})();
Operation Expressions
Introduced in Aerospike Database 5.6, Operation Expressions are bin operations that atomically compute a value from information within the record or provided by the expression. The result is either returned to the client, in a read expression, or written to a specified bin, in a write expression.
A Filter Expression can be defined in the write policy of the operate
method to determine the execution of a Bin Operation using an Operation Expression.
Read
The read expression operation computes an expression, and returns that value. A defined name
in the operation can be used as the synthetic bin name when retrieving results.
The folowing example takes the Read Filter Expression example from above and changes the scenario slightly.
This command computes the length of the shape
list in the report
map and returns the value in a synthetic bin called numShapes
.
// Build the expressionlet expr = exp.lists.size( exp.maps.getByKey(exp.binMap('report'), exp.str('shape'), exp.type.LIST, map.returnType.VALUE));
// Create the opslet ops = [ exp.operations.read('numShapes', expr, 0)];
;(async () => { // Establishes a connection to the server let client = await Aerospike.connect(config);
// Read the record let record = await client.operate(key, ops);
// Do something console.info('Record: %o', record.bins);
// Close the connection to the server client.close();})();
Write
An operation that computes an expression and writes that value to a bin.
The folowing example takes the Write Filter Expression example from above and changes the scenario slightly.
Using the same criteria to compute a recent
value, reported
bin value and posted
bin exists,
this command updates the report
map with the recent
value, true
or false
.
// Build the expressionlet expr = exp.maps.put(exp.binMap('report'), exp.and( exp.gt(exp.binInt('occurred'), exp.int(20211231)), exp.binExists('posted') ), exp.str('recent'));
// Create the opslet ops = [ exp.operations.write('report', expr, 0)];
;(async () => { // Establishes a connection to the server let client = await Aerospike.connect(config);
// Update the record client.operate(key, ops);
// Close the connection to the server client.close();})();
Code block
Expand this section for a single code block to create a Operation Expression
const Aerospike = require('aerospike');const op = Aerospike.operations;const map = Aerospike.maps;const list = Aerospike.lists;const exp = Aerospike.exp;
// Define host configurationlet config = {hosts: '127.0.0.1:3000'};
// Creates a key with the namespace "sandbox", set "ufodata", and user key 5001let key = new Aerospike.Key('sandbox', 'ufodata', 5001);
// Build the expressionlet expr = exp.maps.put(exp.binMap('report'), exp.and( exp.gt(exp.binInt('occurred'), exp.int(20211231)), exp.binExists('posted') ), exp.str('recent'));
// Create the opslet ops = [ exp.operations.write('report', expr, 0)];
;(async () => { // Establishes a connection to the server let client = await Aerospike.connect(config);
// Update the record client.operate(key, ops);
// Close the connection to the server client.close();})();