Class ArrayCursor<T>

The ArrayCursor type represents a cursor returned from a database.Database#query.

When using TypeScript, cursors can be cast to a specific item type in order to increase type safety.

See also BatchedArrayCursor.

Example

const db = new Database();
const query = aql`FOR x IN 1..5 RETURN x`;
const result = await db.query(query) as ArrayCursor<number>;

Example

const db = new Database();
const query = aql`FOR x IN 1..10 RETURN x`;
const cursor = await db.query(query);
for await (const value of cursor) {
// Process each value asynchronously
await processValue(value);
}

Type Parameters

  • T = any

    Type to use for each item. Defaults to any.

Accessors

  • get count(): undefined | number
  • Total number of documents in the query result. Only available if the count option was used.

    Returns undefined | number

  • get hasNext(): boolean
  • Whether the cursor has more values. If set to false, the cursor has already been depleted and contains no more items.

    Returns boolean

Methods

  • Enables use with for await to deplete the cursor by asynchronously yielding every value in the cursor's remaining result set.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    Returns AsyncGenerator<T, undefined, undefined>

    Example

    const cursor = await db.query(aql`
    FOR user IN users
    FILTER user.isActive
    RETURN user
    `);
    for await (const user of cursor) {
    console.log(user.email, user.isAdmin);
    }
  • Depletes the cursor, then returns an array containing all values in the cursor's remaining result list.

    Returns Promise<T[]>

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.all(); // [1, 2, 3, 4, 5]
    console.log(cursor.hasNext); // false
  • Depletes the cursor by applying the callback function to each item in the cursor's remaining result list. Returns an array containing the return values of callback for each item, flattened to a depth of 1.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    See also: Array.prototype.flatMap.

    Type Parameters

    • R

      Return type of the callback function.

    Parameters

    • callback: ((currentValue, index, self) => R | R[])

      Function to execute on each element.

        • (currentValue, index, self): R | R[]
        • Parameters

          • currentValue: T
          • index: number
          • self: this

          Returns R | R[]

    Returns Promise<R[]>

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const squares = await cursor.flatMap((currentValue) => {
    return [currentValue, currentValue ** 2];
    });
    console.log(squares); // [1, 1, 2, 4, 3, 9, 4, 16, 5, 25]
    console.log(cursor.hasNext); // false

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const odds = await cursor.flatMap((currentValue) => {
    if (currentValue % 2 === 0) {
    return []; // empty array flattens into nothing
    }
    return currentValue; // or [currentValue]
    });
    console.logs(odds); // [1, 3, 5]
  • Advances the cursor by applying the callback function to each item in the cursor's remaining result list until the cursor is depleted or callback returns the exact value false. Returns a promise that evalues to true unless the function returned false.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    See also: Array.prototype.forEach.

    Parameters

    • callback: ((currentValue, index, self) => false | void)

      Function to execute on each element.

        • (currentValue, index, self): false | void
        • Parameters

          • currentValue: T
          • index: number
          • self: this

          Returns false | void

    Returns Promise<boolean>

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.forEach((currentValue) => {
    console.log(currentValue);
    });
    console.log(result) // true
    console.log(cursor.hasNext); // false

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.forEach((currentValue) => {
    console.log(currentValue);
    return false; // stop after the first item
    });
    console.log(result); // false
    console.log(cursor.hasNext); // true
  • Kills the cursor and frees up associated database resources.

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

    Returns Promise<void>

    Example

    const cursor1 = await db.query(aql`FOR x IN 1..5 RETURN x`);
    console.log(cursor1.hasMore); // false
    await cursor1.kill(); // no effect

    const cursor2 = await db.query(
    aql`FOR x IN 1..5 RETURN x`,
    { batchSize: 2 }
    );
    console.log(cursor2.hasMore); // true
    await cursor2.kill(); // cursor is depleted
  • Depletes the cursor by applying the callback function to each item in the cursor's remaining result list. Returns an array containing the return values of callback for each item.

    Note: This creates an array of all return values, which may impact memory use when working with very large query result sets. Consider using ArrayCursor#forEach, ArrayCursor#reduce or ArrayCursor#flatMap instead.

    See also: Array.prototype.map.

    Type Parameters

    • R

      Return type of the callback function.

    Parameters

    • callback: ((currentValue, index, self) => R)

      Function to execute on each element.

        • (currentValue, index, self): R
        • Parameters

          • currentValue: T
          • index: number
          • self: this

          Returns R

    Returns Promise<R[]>

    Example

    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const squares = await cursor.map((currentValue) => {
    return currentValue ** 2;
    });
    console.log(squares); // [1, 4, 9, 16, 25]
    console.log(cursor.hasNext); // false
  • Advances the cursor and returns the next value in the cursor's remaining result list, or undefined if the cursor has been depleted.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    Returns Promise<undefined | T>

    Example

    const cursor = await db.query(aql`FOR x IN 1..3 RETURN x`);
    const one = await cursor.next(); // 1
    const two = await cursor.next(); // 2
    const three = await cursor.next(); // 3
    const empty = await cursor.next(); // undefined
  • Depletes the cursor by applying the reducer function to each item in the cursor's remaining result list. Returns the return value of reducer for the last item.

    Note: Most complex uses of the reduce method can be replaced with simpler code using ArrayCursor#forEach or the for await syntax.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    See also: Array.prototype.reduce.

    Type Parameters

    • R

      Return type of the reducer function.

    Parameters

    • reducer: ((accumulator, currentValue, index, self) => R)

      Function to execute on each element.

        • (accumulator, currentValue, index, self): R
        • Parameters

          • accumulator: R
          • currentValue: T
          • index: number
          • self: this

          Returns R

    • initialValue: R

      Initial value of the accumulator value passed to the reducer function.

    Returns Promise<R>

    Example

    function largestOfTwo(one, two) {
    return Math.max(one, two);
    }
    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.reduce(largestOfTwo, 0);
    console.log(result); // 5
    console.log(cursor.hasNext); // false
    const emptyResult = await cursor.reduce(largestOfTwo, 0);
    console.log(emptyResult); // 0

    Example

    // BAD! NEEDLESSLY COMPLEX!
    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.reduce((accumulator, currentValue) => {
    if (currentValue % 2 === 0) {
    accumulator.even.push(...currentValue);
    } else {
    accumulator.odd.push(...currentValue);
    }
    return accumulator;
    }, { odd: [], even: [] });
    console.log(result); // { odd: [1, 3, 5], even: [2, 4] }

    // GOOD! MUCH SIMPLER!
    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const odd = [];
    const even = [];
    for await (const currentValue of cursor) {
    if (currentValue % 2 === 0) {
    even.push(currentValue);
    } else {
    odd.push(currentValue);
    }
    }
    console.log({ odd, even }); // { odd: [1, 3, 5], even: [2, 4] }
  • Depletes the cursor by applying the reducer function to each item in the cursor's remaining result list. Returns the return value of reducer for the last item.

    Note: If the result set spans multiple batches, any remaining batches will only be fetched on demand. Depending on the cursor's TTL and the processing speed, this may result in the server discarding the cursor before it is fully depleted.

    See also: Array.prototype.reduce.

    Type Parameters

    • R

      Return type of the reducer function.

    Parameters

    • reducer: ((accumulator, currentValue, index, self) => R)

      Function to execute on each element.

        • (accumulator, currentValue, index, self): R
        • Parameters

          • accumulator: T | R
          • currentValue: T
          • index: number
          • self: this

          Returns R

    Returns Promise<undefined | R>

    Example

    function largestOfTwo(one, two) {
    return Math.max(one, two);
    }
    const cursor = await db.query(aql`FOR x IN 1..5 RETURN x`);
    const result = await cursor.reduce(largestOfTwo);
    console.log(result); // 5
    console.log(cursor.hasNext); // false
    const emptyResult = await cursor.reduce(largestOfTwo);
    console.log(emptyResult); // undefined