Class CollectionFindCursor<T, TRaw>

Overview

A lazy iterator over the results of a find operation on a Collection.

Shouldn't be directly instantiated, but rather spawned via Collection.find.


Typing

For most intents and purposes, you may treat the cursor as if it is typed simply as Cursor<T>.

If you're using a projection, it is heavily recommended to provide an explicit type representing the type of the document after projection.

In full, the cursor is typed as FindCursor<T, TRaw>, where

  • T is the type of the mapped records, and
  • TRaw is the type of the raw records before any mapping.

If no mapping function is provided, T and TRaw will be the same type. Mapping is done using the FindCursor.map method.


Options

Options may be set either through the find({}, options) method, or through the various fluent builder methods, which, unlike Mongo, do not mutate the existing cursor, but rather return a new, uninitialized cursor with the new option(s) set.

Example

interface Person {
  firstName: string,
  lastName: string,
  age: number,
}

const collection = db.collection<Person>('people');
const cursor1: Cursor<Person> = collection.find({ firstName: 'John' });

// Lazily iterate all documents matching the filter
for await (const doc of cursor1) {
  console.log(doc);
}

// Rewind the cursor to be able to iterate again
cursor1.rewind();

// Get all documents matching the filter as an array
const docs = await cursor1.toArray();

// Immutably set options & map as needed (changing options returns a new, uninitialized cursor)
const cursor2: Cursor<string> = cursor
  .project<Omit<Person, 'age'>>({ age: 0 })
  .map(doc => doc.firstName + ' ' + doc.lastName);

// Get next document from cursor
const doc = await cursor2.next();

See

  • AbstractCursor
  • FindCursor

Type Parameters

Hierarchy (view full)

Constructors

Properties

_filter: SerializedFilter
_mapping?: ((doc) => T)

Type declaration

    • (doc): T
    • Parameters

      • doc: any

      Returns T

_nextPageState: QueryState<string> = ...
_serdes: SerDes<any, any>
_state: CursorState = 'idle'
bufferedCount: "ERROR: `.bufferedCount()` has been renamed to be simply `.buffered()`"

This temporary error-ing property exists for migration convenience, and will be removed in a future version.

Deprecated

  • .bufferedCount() has been renamed to simply be .buffered().
includeSimilarity: ((includeSimilarity?) => CollectionFindCursor<WithSim<TRaw>, WithSim<TRaw>>)

Type declaration

map: (<R>(map) => CollectionFindCursor<R, TRaw>)

Type declaration

project: (<RRaw>(projection) => CollectionFindCursor<RRaw, RRaw>)

Type declaration

readBufferedDocuments: "ERROR: `.readBufferedDocuments()` has been renamed to be `.consumeBuffer()`"

This temporary error-ing property exists for migration convenience, and will be removed in a future version.

Deprecated

  • .readBufferedDocuments() has been renamed to be .consumeBuffer().

Accessors

Methods

  • An async iterator that lazily iterates over all records in the cursor.

    Note that there'll only be partial results if the cursor has been previously iterated over. You may use FindCursor.rewind to reset the cursor.

    If the cursor is uninitialized, it will be initialized. If the cursor is closed, this method will return immediately.

    It will close the cursor when iteration is complete, even if it was broken early.

    Returns AsyncGenerator<T, void, void>

    Example

    for await (const doc of cursor) {
      console.log(doc);
    }
  • Consumes up to max records from the buffer, or all records if max is not provided.

    Note that this actually consumes the buffer; it doesn't just peek at it.

    Parameters

    • Optional max: number

      The maximum number of records to read from the buffer. If not provided, all records will be read.

    Returns TRaw[]

    The records read from the buffer.

  • Overview

    Sets the filter for the cursor, overwriting any previous filter.

    Note: this method does NOT mutate the cursor; it simply returns a new, uninitialized cursor with the given new filter set.

    Parameters

    Returns this

    A new cursor with the new filter set.

    Example

    await collection.insertOne({ name: 'John', ... });

    const cursor = collection.find({})
    .filter({ name: 'John' });

    // The cursor will only return records with the name 'John'
    const john = await cursor.next();
    john.name === 'John'; // true
  • Iterates over all records in the cursor, calling the provided consumer for each record.

    If the consumer returns false, iteration will stop.

    Note that there'll only be partial results if the cursor has been previously iterated over. You may use FindCursor.rewind to reset the cursor.

    If the cursor is uninitialized, it will be initialized. If the cursor is closed, this method will return immediately.

    It will close the cursor when iteration is complete, even if it was stopped early.

    Parameters

    • consumer: ((doc) => boolean | Promise<boolean>) | ((doc) => void | Promise<void>)

      The consumer to call for each record.

    Returns Promise<void>

    A promise that resolves when iteration is complete.

    Remarks

    If you get an IDE error "Promise returned from forEach argument is ignored", it is a known WebStorm bug.

  • Overview

    Retrieves the vector used to perform the vector search, if applicable.

    • If includeSortVector is not true, this will unconditionally return null. No find request will be made.

    • If sort: { $vector } was used, getSortVector() will simply regurgitate that same $vector.

    • If sort: { $vectorize } was used, getSortVector() will return the $vector that was created from the text.

    • If vector search is not used, getSortVector() will simply return null. A find request will still be made.

    If includeSortVector is true, and this function is called before any other cursor operation (such as .next() or .toArray()), it'll make an API request to fetch the sort vector, filling the cursor's buffer in the process.

    If the cursor has already been executed before this function has been called, no additional API request will be made to fetch the sort vector, as it has already been cached.

    But to reiterate, if includeSortVector is false, and this function is called, no API request is made, and the cursor's buffer is not populated; it simply returns null.

    Returns Promise<null | DataAPIVector>

    The sort vector, or null if none was used (or if includeSortVector !== true).

  • Tests if there is a next record in the cursor.

    If the cursor is uninitialized, it will be initialized. If the cursor is closed, this method will return false.

    Returns Promise<boolean>

    Whether or not there is a next record.

  • Overview

    Sets whether the sort vector should be fetched on the very first API call. Note that this is a requirement to use FindCursor.getSortVector—it'll unconditionally return null if this is not set to true.

    • This is only applicable when using vector search, and will be ignored if the cursor is not using vector search.
    • See FindCursor.getSortVector to see exactly what is returned when this is set to true.

    Note: this method does NOT mutate the cursor; it simply returns a new, uninitialized cursor with the given new setting.

    Parameters

    • Optional includeSortVector: boolean

      Whether the sort vector should be fetched on the first API call

    Returns this

    A new cursor with the new sort vector inclusion setting.

    Example

    const cursor = table.find({ name: 'John' })
    .sort({ $vectorize: 'name' })
    .includeSortVector();

    // The cursor will return the sort vector used
    // Here, it'll be the embedding for the vector created from the name 'John'
    const sortVector = await cursor.getSortVector();
    sortVector; // DataAPIVector([...])
  • Overview

    Sets the maximum number of records to return.

    If limit == 0, there will be no limit on the number of records returned (beyond any that the Data API may itself enforce).

    Note: this method does NOT mutate the cursor; it simply returns a new, uninitialized cursor with the given new limit set.

    Parameters

    • limit: number

      The limit for this cursor.

    Returns this

    A new cursor with the new limit set.

    Example

    await collection.insertMany([
    { name: 'John', age: 30 },
    { name: 'Jane', age: 25 },
    ]);

    const cursor = collection.find({})
    .limit(1);

    // The cursor will return only one record
    const all = await cursor.toArray();
    all.length === 1; // true
  • Fetches the next record from the cursor. Returns null if there are no more records to fetch.

    If the cursor is uninitialized, it will be initialized. If the cursor is closed, this method will return null.

    Returns Promise<null | T>

    The next record, or null if there are no more records.

  • Rewinds the cursor to its uninitialized state, clearing the buffer and any state.

    Any configuration set on the cursor will remain, but iteration will start from the beginning, sending new queries to the server, even if the resultant data was already fetched by this cursor.

    Returns void

  • Overview

    Sets the number of records to skip before returning. Must be used with FindCursor.sort.

    Note: this method does NOT mutate the cursor; it simply returns a new, uninitialized cursor with the given new skip set.

    Parameters

    • skip: number

      The skip for the cursor query.

    Returns this

    A new cursor with the new skip set.

    Example

    await collection.insertMany([
    { name: 'John', age: 30 },
    { name: 'Jane', age: 25 },
    ]);

    const cursor = collection.find({})
    .sort({ age: -1 })
    .skip(1);

    // The cursor will skip the first record and return the second
    const secondOldest = await cursor.next();
    secondOldest.age === 25; // true
  • Overview

    Sets the sort criteria for prioritizing records.

    Note: this method does NOT mutate the cursor; it simply returns a new, uninitialized cursor with the given new sort set.

    Parameters

    • sort: Sort

      The sort order to prioritize which records are returned.

    Returns this

    A new cursor with the new sort set.

    Example

    await collection.insertMany([
    { name: 'John', age: 30 },
    { name: 'Jane', age: 25 },
    ]);

    const cursor = collection.find({})
    .sort({ age: -1 });

    // The cursor will return records sorted by age in descending order
    const oldest = await cursor.next();
    oldest.age === 30; // true
  • Returns an array of all matching records in the cursor. The user should ensure that there is enough memory to store all records in the cursor.

    Note that there'll only be partial results if the cursor has been previously iterated over. You may use FindCursor.rewind to reset the cursor.

    If the cursor is uninitialized, it will be initialized. If the cursor is closed, this method will return an empty array.

    Returns Promise<T[]>

    An array of all records in the cursor.