Skip to content

Read records

Learn how to read records from Aerospike using the Developer SDK. This guide covers getting records by key, selecting specific bins, handling missing records, and reading metadata.

Get a record by key

Use query() with a key to read a single record (one row in the stream):

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
DataSet users = DataSet.of("test", "users");
RecordStream stream = session.query(users.id("user-1")).execute();
stream.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record user = result.recordOrThrow();
System.out.println("Name: " + user.getString("name"));
System.out.println("Email: " + user.getString("email"));
System.out.println("Age: " + user.getInt("age"));
}
});
stream.close();

Handle missing records

When a record doesn’t exist, the stream has no row (or the row signals not found):

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
RecordStream stream = session.query(users.id("nonexistent")).execute();
if (stream.getFirst().isEmpty()) {
System.out.println("Record not found");
}
stream.close();
// Or use a default when present
RecordStream s2 = session.query(users.id("user-1")).execute();
String user = s2.getFirst()
.filter(RecordResult::isOk)
.map(result-> result.recordOrThrow().getString("name"))
.orElse("Not found");
s2.close();
// Or throw if not found
Record s3 = session.query(users.id("user-1"))
.includeMissingKeys() // Include errors for missing records in stream
.execute()
.getFirstRecord(); // Throws if record is missing

Select specific bins

By default, a key query returns all bins. Use bins() to retrieve only the bins you need:

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
// Only fetch name and email
RecordStream stream = session.query(users.id("user-1"))
.readingOnlyBins("name", "email")
.execute();
stream.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record user = result.recordOrThrow();
System.out.println("Name: " + user.getString("name"));
System.out.println("Email: " + user.getString("email"));
// user.getInt("age") would be null - not fetched
}
});
stream.close();

Read record metadata

Records have metadata you can access:

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
RecordStream stream = session.query(users.id("user-1")).execute();
stream.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record user = result.recordOrThrow();
// Generation: incremented on each update
int generation = user.generation;
// TTL: seconds until expiration (0 = never)
int ttlSeconds = user.getTimeToLive();
// User key (if sendKey was true during write)
String key = result.key().userKey;
System.out.println("Generation: " + generation);
System.out.println("TTL: " + ttlSeconds + "s");
System.out.println("Key: " + key);
}
});
stream.close();
MetadataDescription
GenerationVersion counter, incremented on each update. Use for optimistic locking.
TTLSeconds until expiration. 0 means never expires. -1 means use namespace default.
KeyOriginal user key (only available if send-key was enabled on the writing behavior — sendKey(true) in Java, send_key=True in Python).

Read with type safety

Use typed getters for bin values:

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
import java.util.List;
import java.util.Map;
RecordStream stream = session.query(users.id("user-1")).execute();
Record user = stream.getFirst()
.filter(RecordResult::isOk)
.map(RecordResult::recordOrThrow)
.orElseThrow();
stream.close();
// String values
String name = user.getString("name");
// Integer values
int age = user.getInt("age");
long bigNumber = user.getLong("big_number");
// Double values
double balance = user.getDouble("balance");
// Boolean values
boolean active = user.getBoolean("active");
// List values
List<String> tags = user.getList("tags");
// Map values
Map<String, Object> preferences = user.getMap("preferences");
// Raw value (when type is unknown)
Object value = user.getValue("unknown_field");

Check if a record exists

To check existence without fetching data:

boolean exists = session.exists(users.id("user-1")).execute().getFirstBoolean().orElse(false);
if (exists) {
System.out.println("User exists");
} else {
System.out.println("User not found");
}

Read header only

To get only metadata (generation, TTL) without bin values:

import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
RecordStream stream = session.query(users.id("user-1"))
.withNoBins()
.execute();
stream.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record header = result.recordOrThrow();
System.out.println("Generation: " + header.generation);
System.out.println("TTL: " + header.getTimeToLive());
// Bins are not populated
}
});
stream.close();

Batch read

For reading multiple records efficiently, see Batch Operations.

import java.util.List;
// Quick preview - see Batch Operations for full details
RecordStream usersStream = session.query(users.ids("user-1", "user-2", "user-3")).execute();
List<Record> users = usersStream.stream().toList();

Complete example

import com.aerospike.client.sdk.Cluster;
import com.aerospike.client.sdk.ClusterDefinition;
import com.aerospike.client.sdk.DataSet;
import com.aerospike.client.sdk.Record;
import com.aerospike.client.sdk.RecordResult;
import com.aerospike.client.sdk.RecordStream;
import com.aerospike.client.sdk.Session;
import com.aerospike.client.sdk.policy.Behavior;
public class ReadRecordsExample {
public static void main(String[] args) {
try (Cluster cluster = new ClusterDefinition("localhost", 3000).connect()) {
Session session = cluster.createSession(Behavior.DEFAULT);
DataSet users = DataSet.of("test", "users");
String key = "read-example-user";
// Seed data so the example is repeatable.
session.upsert(users)
.bins("name", "email", "age")
.id(key).values("Alice Smith", "alice@example.com", 28)
.execute();
// Full record read
RecordStream full = session.query(users.id(key)).execute();
full.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record user = result.recordOrThrow();
System.out.println("=== Full Record ===");
System.out.println("Name: " + user.bins.get("name"));
System.out.println("Generation: " + user.generation);
}
});
full.close();
// Partial read
RecordStream partial = session.query(users.id(key))
.readingOnlyBins("name", "email")
.execute();
partial.getFirst().ifPresent(result -> {
if (result.isOk()) {
Record user = result.recordOrThrow();
System.out.println("\n=== Selected Bins ===");
System.out.println("Name: " + user.getString("name"));
System.out.println("Email: " + user.getString("email"));
}
});
partial.close();
// Existence check
boolean exists = session.exists(users.id(key)).execute().getFirstBoolean().orElse(false);
System.out.println("\nUser exists: " + exists);
}
}
}

API reference summary

MethodDescriptionLink
query(key)Read a record by key (single-row stream)Java · Python
exists()Check if a record existsJava · Python
.readingOnlyBins(...) / .bins([...])Bin projection on queries (session.query(DataSet)); see Query records
.withNoBins() / .with_no_bins()Read only metadata (no bin payload)

Next steps

Feedback

Was this page helpful?

What type of feedback are you giving?

What would you like us to know?

+Capture screenshot

Can we reach out to you?