Cursor API

Cursor instances provide an abstraction over the HTTP API’s limitations. Unless a method explicitly exhausts the cursor, the driver will only fetch as many batches from the server as necessary. Like the server-side cursors, Cursor instances are incrementally depleted as they are read from.

const db = new Database();
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
// query result list: [1, 2, 3, 4, 5]
const value = await cursor.next();
assert.equal(value, 1);
// remaining result list: [2, 3, 4, 5]

cursor.count

cursor.count: number

The total number of documents in the query result. This is only available if the count option was used.

cursor.all

async cursor.all(): Array<Object>

Exhausts the cursor, then returns an array containing all values in the cursor’s remaining result list.

Examples

const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.all();
// result is an array containing the entire query result
assert.deepEqual(result, [1, 2, 3, 4, 5]);
assert.equal(cursor.hasNext(), false);

cursor.next

async cursor.next(): Object

Advances the cursor and returns the next value in the cursor’s remaining result list. If the cursor has already been exhausted, returns undefined instead.

Examples

// query result list: [1, 2, 3, 4, 5]
const val = await cursor.next();
assert.equal(val, 1);
// remaining result list: [2, 3, 4, 5]

const val2 = await cursor.next();
assert.equal(val2, 2);
// remaining result list: [3, 4, 5]

cursor.hasNext

cursor.hasNext(): boolean

Returns true if the cursor has more values or false if the cursor has been exhausted.

Examples

await cursor.all(); // exhausts the cursor
assert.equal(cursor.hasNext(), false);

cursor.nextBatch

async cursor.nextBatch(): Object

Advances the cursor and returns all remaining values in the cursor’s current batch. If the current batch has already been exhausted, fetches the next batch from the server and returns it. If no more batches are available, returns undefined instead.

Examples

const cursor = await db.query(aql`FOR i IN 1..10 RETURN i`, { batchSize: 5 });
await cursor.nextBatch(); // [1, 2, 3, 4, 5]
await cursor.next(); // 6
await cursor.nextBatch(); // [7, 8, 9, 10]
cursor.hasNext(); // false

cursor.each

async cursor.each(fn): any

Advances the cursor by applying the function fn to each value in the cursor’s remaining result list until the cursor is exhausted or fn explicitly returns false.

Returns the last return value of fn.

Equivalent to Array.prototype.forEach (except async).

Arguments

  • fn: Function

    A function that will be invoked for each value in the cursor’s remaining result list until it explicitly returns false or the cursor is exhausted.

    The function receives the following arguments:

    • value: any

      The value in the cursor’s remaining result list.

    • index: number

      The index of the value in the cursor’s remaining result list.

    • cursor: Cursor

      The cursor itself.

Examples

const results = [];
function doStuff(value) {
  const VALUE = value.toUpperCase();
  results.push(VALUE);
  return VALUE;
}

const cursor = await db.query(aql`FOR x IN ["a", "b", "c"] RETURN x`);
const last = await cursor.each(doStuff);
assert.deepEqual(results, ["A", "B", "C"]);
assert.equal(cursor.hasNext(), false);
assert.equal(last, "C");

cursor.every

async cursor.every(fn): boolean

Advances the cursor by applying the function fn to each value in the cursor’s remaining result list until the cursor is exhausted or fn returns a value that evaluates to false.

Returns false if fn returned a value that evaluates to false, or true otherwise.

Equivalent to Array.prototype.every (except async).

Arguments

  • fn: Function

    A function that will be invoked for each value in the cursor’s remaining result list until it returns a value that evaluates to false or the cursor is exhausted.

    The function receives the following arguments:

    • value: any

      The value in the cursor’s remaining result list.

    • index: number

      The index of the value in the cursor’s remaining result list.

    • cursor: Cursor

      The cursor itself.

const even = value => value % 2 === 0;

const cursor = await db.query(aql`FOR x IN 2..5 RETURN x`);
const result = await cursor.every(even);
assert.equal(result, false); // 3 is not even
assert.equal(cursor.hasNext(), true);

const value = await cursor.nextBatch();
assert.equal(value, 4); // next value after 3

cursor.some

async cursor.some(fn): boolean

Advances the cursor by applying the function fn to each value in the cursor’s remaining result list until the cursor is exhausted or fn returns a value that evaluates to true.

Returns true if fn returned a value that evaluates to true, or false otherwise.

Equivalent to Array.prototype.some (except async).

Examples

const even = value => value % 2 === 0;

const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.some(even);
assert.equal(result, true); // 2 is even
assert.equal(cursor.hasNext(), true);

const value = await cursor.next();
assert.equal(value, 3); // next value after 2

cursor.map

async cursor.map(fn): Array<any>

Advances the cursor by applying the function fn to each value in the cursor’s remaining result list until the cursor is exhausted.

Returns an array of the return values of fn.

Equivalent to Array.prototype.map (except async).

Note: This creates an array of all return values. It is probably a bad idea to do this for very large query result sets.

Arguments

  • fn: Function

    A function that will be invoked for each value in the cursor’s remaining result list until the cursor is exhausted.

    The function receives the following arguments:

    • value: any

      The value in the cursor’s remaining result list.

    • index: number

      The index of the value in the cursor’s remaining result list.

    • cursor: Cursor

      The cursor itself.

Examples

const square = value => value * value;
const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.map(square);
assert.equal(result.length, 5);
assert.deepEqual(result, [1, 4, 9, 16, 25]);
assert.equal(cursor.hasNext(), false);

cursor.reduce

async cursor.reduce(fn, [accu]): any

Exhausts the cursor by reducing the values in the cursor’s remaining result list with the given function fn. If accu is not provided, the first value in the cursor’s remaining result list will be used instead (the function will not be invoked for that value).

Equivalent to Array.prototype.reduce (except async).

Arguments

  • fn: Function

    A function that will be invoked for each value in the cursor’s remaining result list until the cursor is exhausted.

    The function receives the following arguments:

    • accu: any

      The return value of the previous call to fn. If this is the first call, accu will be set to the accu value passed to reduce or the first value in the cursor’s remaining result list.

    • value: any

      The value in the cursor’s remaining result list.

    • index: number

      The index of the value in the cursor’s remaining result list.

    • cursor: Cursor

      The cursor itself.

Examples

const add = (a, b) => a + b;
const baseline = 1000;

const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
const result = await cursor.reduce(add, baseline);
assert.equal(result, baseline + 1 + 2 + 3 + 4 + 5);
assert.equal(cursor.hasNext(), false);

// -- or --

const result = await cursor.reduce(add);
assert.equal(result, 1 + 2 + 3 + 4 + 5);
assert.equal(cursor.hasNext(), false);

cursor.kill

async cursor.kill(): void

Kills the cursor and frees up associated database resources.

This method has no effect if all result batches have already been fetched.

Examples

const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
await cursor.kill(); // has no effect

const cursor2 = await db.query(aql`FOR x IN 1..5 RETURN x`, { batchSize: 2 });
await cursor2.kill(); // this kills the cursor