Class Collection<TSchema>

The Collection class is an internal class that embodies a MongoDB collection allowing for insert/find/update/delete and other command operation on that MongoDB collection.

COLLECTION Cannot directly be instantiated

import { MongoClient } from 'mongodb';

interface Pet {
name: string;
kind: 'dog' | 'cat' | 'fish';
}

const client = new MongoClient('mongodb://localhost:27017');
const pets = client.db().collection<Pet>('pets');

const petCursor = pets.find();

for await (const pet of petCursor) {
console.log(`${pet.name} is a ${pet.kind}!`);
}

Type Parameters

Accessors

  • get dbName(): string
  • The name of the database this collection belongs to

    Returns string

  • get namespace(): string
  • The namespace of this collection, in the format ${this.dbName}.${this.collectionName}

    Returns string

  • get readConcern(): undefined | ReadConcern
  • The current readConcern of the collection. If not explicitly defined for this collection, will be inherited from the parent DB

    Returns undefined | ReadConcern

  • get writeConcern(): undefined | WriteConcern
  • The current writeConcern of the collection. If not explicitly defined for this collection, will be inherited from the parent DB

    Returns undefined | WriteConcern

Methods

  • Perform a bulkWrite operation without a fluent API

    Legal operation types are

    • insertOne
    • replaceOne
    • updateOne
    • updateMany
    • deleteOne
    • deleteMany

    If documents passed in do not contain the _id field, one will be added to each of the documents missing it by the driver, mutating the document. This behavior can be overridden by setting the forceServerObjectId flag.

    Parameters

    Returns Promise<BulkWriteResult>

    MongoDriverError if operations is not an array

  • An estimated count of matching documents in the db to a filter.

    NOTE: This method has been deprecated, since it does not provide an accurate count of the documents in a collection. To obtain an accurate count of documents in the collection, use Collection#countDocuments| countDocuments. To obtain an estimated count of all documents in the collection, use Collection#estimatedDocumentCount| estimatedDocumentCount.

    Parameters

    Returns Promise<number>

    use Collection#countDocuments| countDocuments or Collection#estimatedDocumentCount| estimatedDocumentCount instead

  • Creates an index on the db and collection collection.

    Parameters

    Returns Promise<string>

    const collection = client.db('foo').collection('bar');

    await collection.createIndex({ a: 1, b: -1 });

    // Alternate syntax for { c: 1, d: -1 } that ensures order of indexes
    await collection.createIndex([ [c, 1], [d, -1] ]);

    // Equivalent to { e: 1 }
    await collection.createIndex('e');

    // Equivalent to { f: 1, g: 1 }
    await collection.createIndex(['f', 'g'])

    // Equivalent to { h: 1, i: -1 }
    await collection.createIndex([ { h: 1 }, { i: -1 } ]);

    // Equivalent to { j: 1, k: -1, l: 2d }
    await collection.createIndex(['j', ['k', -1], { l: '2d' }])
  • Creates multiple indexes in the collection, this method is only supported for MongoDB 2.6 or higher. Earlier version of MongoDB will throw a command not supported error.

    Note: Unlike Collection#createIndex| createIndex, this function takes in raw index specifications. Index specifications are defined here.

    Parameters

    Returns Promise<string[]>

    const collection = client.db('foo').collection('bar');
    await collection.createIndexes([
    // Simple index on field fizz
    {
    key: { fizz: 1 },
    }
    // wildcard index
    {
    key: { '$**': 1 }
    },
    // named index on darmok and jalad
    {
    key: { darmok: 1, jalad: -1 }
    name: 'tanagra'
    }
    ]);
  • Creates a single search index for the collection.

    Parameters

    Returns Promise<string>

    A promise that resolves to the name of the new search index.

    Only available when used against a 7.0+ Atlas cluster.

  • Creates multiple search indexes for the current collection.

    Parameters

    Returns Promise<string[]>

    A promise that resolves to an array of the newly created search index names.

    Only available when used against a 7.0+ Atlas cluster.

  • Drop the collection from the database, removing it permanently. New accesses will create a new collection.

    Parameters

    Returns Promise<boolean>

  • Deletes a search index by index name.

    Parameters

    • name: string

      The name of the search index to be deleted.

    Returns Promise<void>

    Only available when used against a 7.0+ Atlas cluster.

  • Gets an estimate of the count of documents in a collection using collection metadata. This will always run a count command on all server versions.

    due to an oversight in versions 5.0.0-5.0.8 of MongoDB, the count command, which estimatedDocumentCount uses in its implementation, was not included in v1 of the Stable API, and so users of the Stable API with estimatedDocumentCount are recommended to upgrade their server version to 5.0.9+ or set apiStrict: false to avoid encountering errors.

    Parameters

    Returns Promise<number>

  • Checks if one or more indexes exist on the collection, fails on first non-existing index

    Parameters

    • indexes: string | string[]

      One or more index names to check.

    • Optionaloptions: ListIndexesOptions

      Optional settings for the command

    Returns Promise<boolean>

  • Initiate an In order bulk write operation. Operations will be serially executed in the order they are added, creating a new operation for each switch in types.

    Parameters

    Returns OrderedBulkOperation

    MongoNotConnectedError

    NOTE: MongoClient must be connected prior to calling this method due to a known limitation in this legacy implementation. However, collection.bulkWrite() provides an equivalent API that does not require prior connecting.

  • Initiate an Out of order batch write operation. All operations will be buffered into insert/update/remove commands executed out of order.

    Parameters

    Returns UnorderedBulkOperation

    MongoNotConnectedError

    NOTE: MongoClient must be connected prior to calling this method due to a known limitation in this legacy implementation. However, collection.bulkWrite() provides an equivalent API that does not require prior connecting.

  • Returns if the collection is a capped collection

    Parameters

    Returns Promise<boolean>

  • Updates a search index by replacing the existing index definition with the provided definition.

    Parameters

    • name: string

      The name of the search index to update.

    • definition: Document

      The new search index definition.

    Returns Promise<void>

    Only available when used against a 7.0+ Atlas cluster.

  • Create a new Change Stream, watching for new changes (insertions, updates, replacements, deletions, and invalidations) in this collection.

    Type Parameters

    Parameters

    • pipeline: Document[] = []

      An array of pipeline stages through which to pass change stream documents. This allows for filtering (using $match) and manipulating the change stream documents.

    • options: ChangeStreamOptions = {}

      Optional settings for the command

    Returns ChangeStream<TLocal, TChange>

    watch() accepts two generic arguments for distinct use cases:

    • The first is to override the schema that may be defined for this specific collection
    • The second is to override the shape of the change stream document entirely, if it is not provided the type will default to ChangeStreamDocument of the first argument

    By just providing the first argument I can type the change to be ChangeStreamDocument<{ _id: number }>

    collection.watch<{ _id: number }>()
    .on('change', change => console.log(change._id.toFixed(4)));

    Passing a second argument provides a way to reflect the type changes caused by an advanced pipeline. Here, we are using a pipeline to have MongoDB filter for insert changes only and add a comment. No need start from scratch on the ChangeStreamInsertDocument type! By using an intersection we can save time and ensure defaults remain the same type!

    collection
    .watch<Schema, ChangeStreamInsertDocument<Schema> & { comment: string }>([
    { $addFields: { comment: 'big changes' } },
    { $match: { operationType: 'insert' } }
    ])
    .on('change', change => {
    change.comment.startsWith('big');
    change.operationType === 'insert';
    // No need to narrow in code because the generics did that for us!
    expectType<Schema>(change.fullDocument);
    });

    In iterator mode, if a next() call throws a timeout error, it will attempt to resume the change stream. The next call can just be retried after this succeeds.

    const changeStream = collection.watch([], { timeoutMS: 100 });
    try {
    await changeStream.next();
    } catch (e) {
    if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
    await changeStream.next();
    }
    throw e;
    }

    In emitter mode, if the change stream goes timeoutMS without emitting a change event, it will emit an error event that returns a MongoOperationTimeoutError, but will not close the change stream unless the resume attempt fails. There is no need to re-establish change listeners as this will automatically continue emitting change events once the resume attempt completes.

    const changeStream = collection.watch([], { timeoutMS: 100 });
    changeStream.on('change', console.log);
    changeStream.on('error', e => {
    if (e instanceof MongoOperationTimeoutError && !changeStream.closed) {
    // do nothing
    } else {
    changeStream.close();
    }
    });