Skip to content

Releases: mongodb/node-mongodb-native

4.11.0

19 Oct 16:29
6fb87e4
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.11.0 of the mongodb package!

Release Highlights

Recursive Schema Support

Version 4.3.0 of the Node driver added Typescript support for dot notation into our Filter type but
in the process it broke support for recursive schemas. In 4.11.0, we now support mutually recursive schemas and
provide type safety on dot notation queries up to a depth of 8. Beyond a depth of 8, code still compiles
but is no longer type checked (it falls back to a type of any).

interface Author {
    name: string;
    bestBook: Book;
}

interface Book {
    title: string;
    author: Author;
}
 
let authors: Collection<Author>

// below a depth of 8, type checking is enforced
authors.findOne({ 'bestBook.author.bestBook.title': 25 }}) 
// ✅ expected compilation error is thrown: "title must be a string"

// at a depth greater than 8 code compiles but is not type checked (9 deep in this example)
authors.findOne({ 'bestBook.author.bestBook.author.bestBook.author.bestBook.author.name': 25 }) 
// ⛔️ perhaps unexpected, no compilation error is thrown because the key is too deeply nested

Note that our depth limit is a product of Typescript's recursive type limitations.

AWS Authentication

If the optional aws-sdk dependency is installed, the driver will now use the SDK to get credentials
from the environment. Because of this, if you have a shared AWS credentials or config file, then
those credentials will be used by default if AWS auth environment variables are not set. To override this
behavior, set AWS_SHARED_CREDENTIALS_FILE="" in your shell or set the
equivalent environment variable value in your script or application. Alternatively, you can create
an AWS profile specifically for your MongoDB credentials and set the AWS_PROFILE environment
variable to that profile name.

External Contributions

Many thanks to those who contributed to this release!

  • @ermik provided an extremely large schema to test compilation with, which made testing our new recursive schema support possible with large schemas straightforward.
  • @noahsilas for documentation improvements in change streams and fixing our Typescript types for read preferences.
  • @zendagin for adding Typescript support for hashed indexes.
  • @biniona-mongodb for fixing our parsing of TLS options.
  • @LinusU for removing support for server versions lower than our minimum supported server version and improving error messages for unacknowledged writes with hints.

Features

Bug Fixes


Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.10.0

19 Sep 15:15
dc34388
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.10.0 of the mongodb package!

Release Highlights

Callback Deprecation

Looking to improve our API's consistency and handling of errors we are planning to remove callback support in the next major release of the driver. Today marks the notice of their removal. Migrating to a promise only API allows us to offer uniform error handling and better native support for automatic promise construction. In this release you will notice deprecation warnings in doc comments for all our callback overloads and if you are working in VSCode you should notice strikethroughs on these APIs. We encourage you to migrate to promises where possible:

  • Using async/await syntax can yield the best experience with promise usage.
  • Using Node.js' callbackify utility is one approach:
    • require('util').callbackify(() => collection.findOne())(callback)
  • Using .then syntax is another:
    • collection.findOne().then(res => callback(null, res), err => callback(err))
  • And lastly, for large codebases still intertwined with callbacks we have an alternative package prepared.

MongoDB-Legacy Callback Support

While the 4.10.0 version only deprecates our support of callbacks, there will be a major version that removes the support altogether. In order to keep using callbacks after v5 is released, we recommend migrating your driver version to mongodb-legacy (github link). This package wraps every single async API our driver offers and is designed to provide the exact behavior of the MongoDB 4.10.0 release (both callbacks and promises are supported). Any new features added to MongoDB will be automatically inherited but will only support promises. This package is fully tested against our current suite and adoption should be confined to changing an import require('mongodb') -> require('mongodb-legacy'). If this package is useful to you and your use case we encourage you to adopt it before v5 to ensure it continues to work as expected.

Read more about it on the package's readme here:

Features

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.9.1

31 Aug 19:50
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.9.1 of the mongodb package!

Release Highlights

This is a bug fix release as noted below.

Bug Fixes

v4.9.0

18 Aug 21:08
428bdeb
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.9.0 of the mongodb package!

Release Highlights

We have corrected an inconsistency with our writeConcern options in the type definitions where the MongoClient alleged to not support "writeConcern" as an option. In fact, it did support it at run time and now the types correctly reflect that, along with the corresponding deprecations we made to the nested writeConcern config settings.

Our index specification handling had a few peculiar edge cases that we have detailed below, we believe these are unlikely to affect a vast majority of users as the type definitions would have likely reported an error with the impacted usage. As a feature, the typescript definitions now support a javascript Map as a valid input for an index specification.

Index Specification Detailed Fixes
  • Map as a valid input type in TS definition
  • Uses Map under the hood to ensure key order is preserved, fixed numeric index key order issue in combination with FLE usage
  • Tuples passed at the top level to createIndex were incorrectly parsed as string input
    • createIndex(['myKey', 1]) would create { 'myKey': 1, '1': 1 }.
    • Now it's correctly detected if the second arg is one of the known index directions.
    • For complex programmatic generation of indexes we recommend using a Map to avoid all the edge cases here.
  • Type strictness on this nesting of array (one or more)
  • Type strictness for createIndexes aligned with createIndex
    • No longer accepts just Document, checks that the values are a known IndexDirection

As per usual this release brings in the latest BSON release (v4.7.0) which added automatic UUID support. You can read more about that in the BSON release notes here!

Special thanks to the folks who contributed to this release!

Features

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.8.1

26 Jul 19:05
6c3ac96
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.8.1 of the mongodb package!

Release Highlights

This patch comes with some bug fixes that are listed below as well as a quality of life improvement for nested keys in the UpdateFilter and Filter types. Thanks to @coyotte508 (#3328) for contributing this improvement!

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.8.0

13 Jul 15:48
be34a94
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.8.0 of the mongodb package!

Release Highlights

UpdateFilter nested fields

Thanks to a contribution from @coyotte508, in this release you will now get auto-complete and type safety for nested keys in an update filter. See the example below:
image1

Optional client.connect() fixup

In our last release we made explicitly calling client.connect() before performing operations optional with some caveats. In this release client.startSession() can now be called before connecting to MongoDB.

NOTES:

  • The only APIs that need the client to be connected before using are the legacy collection.initializeUnorderedBulkOp() / collection.initializeOrderedBulkOp() builder methods. However, the preferred collection.bulkWrite() API can be used without calling connect explicitly.
  • While executing operations without explicitly connecting may be streamlined and convenient, depending on your use case client.connect() could still be useful to find out early if there is some easily detectable issue (ex. networking) that prevents you from accessing your database.

Features

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.7.0

07 Jun 14:09
1cc2c4b
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.7.0 of the mongodb package! Happy MongoDB World Day!

Release Highlights

Support for ZSTD Compression

zstd compression is now supported by the NodeJS driver. To enable zstd compression, add it as a dependency in your project: npm install –save @mongodb-js/zstd. The add the option to your URI options: mongodb://host:port/db?compressors=zstd.

Improved Connection Storm Avoidance

The Node driver has improved connection storm avoidance by limiting the number of connections that the driver will attempt to open to each server at a time. The number of concurrent connection attempts is set to 2 by default, but can be configured with a new MongoClient argument, maxConnecting. The following code example creates a new MongoClient that configures maxConnecting to 5.

const client = new MongoClient('MONGODB_URL', { maxConnecting: 5 });

Expanded Change Stream Events

The collection.watch function now supports a new option, showExpandedEvents. When showExpandedEvents is enabled, change streams will report the following events on servers 6.0 and later:

  • createIndexes
  • dropIndexes
  • modify
  • create
  • shardCollection

On servers 6.1.0 and later, showExpandedEvents will also show change stream events for the following commands:

  • reshardCollection
  • refineCollectionShardKey

As an example, the following code creates a change stream that has expanded events enabled on a collection:

const client = new MongoClient('MONGODB_URL');
await client.connect();

const collection = client.db('example-db').collection('example-collection');
const changeStream = collection.watch([], { showExpandedEvents: true });

Change Stream Support of Pre/Post Images

Change streams now support pre and post images for update events. To enable pre and post images, the collection must be created with the changeStreamPreAndPostImages option enabled:

const collection = await db.createCollection(‘collectionName’, { changeStreamPreAndPostImages: { enabled: true }} )

Pre and post images can then be enabled on the change stream when the change stream is created:

const changeStream = collection.watch([], { fullDocumentBeforeChange: ‘required’ })

See the documentation on pre and post images for more information: https://www.mongodb.com/docs/v6.0/changeStreams/#change-streams-with-document-pre--and-post-images.

Improved Performance in Serverless Environments

The driver now only processes the most recent server monitoring event if multiple heartbeat events are recorded in sequence before any can be processed. In serverless environments, this results in increased performance when a function is invoked after a period of inactivity as well as lower resource consumption.

Estimated Document Count uses the Count command

The 5.0 server compatible release unintentionally broke the estimatedDocumentCount command on views by changing the implementation from the count command to aggregate and a collStats stage. This release fixes estimatedDocumentCount on views by reverting the implementation to use count.

Due to an oversight, the count command was omitted from the Stable API in server versions 5.0.0 - 5.0.8 and 5.1.0 - 5.3.1, so users of the Stable API with estimatedDocumentCount are recommended to upgrade their MongoDB clusters to 5.0.9 or 5.3.2 (if on Atlas) or set apiStrict: false when constructing their MongoClients.

MongoClient.connect is now optional

If an operation is run before MongoClient.connect is called by the client, the driver will now automatically connect along with that first operation. This makes the repl experience much more streamlined, going right from client construction to your first insert or find. However, MongoClient.connect can still be called manually and remains useful for learning about misconfiguration (auth, server not started, connection string correctness) early in your application's startup.

Note: It's a known limitation that explicit sessions (client.startSession) and initializeOrderedBulkOp, initializeUnorderedBulkOp cannot be used until MongoClient.connect is first called. Look forward to a future patch release that will correct these inconsistencies.

Support for Clustered Collections

Clustered Collections can now be created using the createCollection method in the Node driver:

const client = new MongoClient('MONGODB_URL');
// No need to connect anymore! (see above)
const collection = await client.db(‘example-db’).createCollection(‘example-collection’, { 
    key: _id,
    unique: true
});

More information about clustered indexes can be found on the official documentation page. https://www.mongodb.com/docs/upcoming/core/clustered-collections/

Automatic Encryption Shared Library

To enable the driver to use the new Automatic Encryption Shared Library instead of using mongocryptd, pass the location of the library in the auto-encryption extra options to the MongoClient. Example:

const client = new MongoClient(uri, {
  autoEncryption: {
    keyVaultNamespace: 'encryption.__keyVault',
    kmsProviders: {
      local: { key: 'localKey' }
    },
    extraOptions: {
      cryptSharedLibPath: "/path/to/mongo_crypt_v1.dylib",
    },
    encryptedFieldsMap: {
      "default.secretCollection": {
        [
          {
            keyId: '_id',
        	path: 'ssn',
        	bsonType: 'string',
        	queries: { queryType: 'equality' }
          }
        ]
      },
    },
  },
})

Queryable Encryption Preview

Queryable Encryption is a beta feature that enables you to encrypt data in your application before you send it over the network to MongoDB while still maintaining the ability to query the encrypted data. With Queryable Encryption enabled, no MongoDB-managed service has access to your data in an unencrypted form.

Checkout the documentation: https://www.mongodb.com/docs/upcoming/core/queryable-encryption/queryable-encryption/

ATTENTION: This feature is included in this release as a beta preview. All related APIs marked with @expiremental in the documentation. There are no guarantees that the APIs will not undergo breaking changes without prior notice.

Features:

Bug Fixes

Documentation

Read more

v4.6.0

11 May 19:27
273d8e7
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.6.0 of the mongodb package!

Release Highlights

TypeScript: ChangeStreamDocument

Our change stream document type and watch API have undergone some improvements! You can now define your own custom type for the top level document returned in a 'change' event. This is very useful when using a pipeline that significantly changes the shape of the change document (ex. $replaceRoot, $project operators). Additionally, we've improved the type information of the default change stream document to default to union of the possible events from MongoDB. This works well with typescript's ability to narrow a Discriminated Union based on the operationType key in the default change stream document.

Prior to this change the ChangeStreamDocument inaccurately reflected the runtime shape of the change document. Now, using the union, we correctly indicate that some properties do not exist at all on certain events (as opposed to being optional). With this typescript fix we have added the properties to for rename events, as well as lsid, txnNumber, and clusterTime if the change is from within a transaction.

NOTE: Updating to this version may require fixing typescript issues. Those looking to adopt this version but defer any type corrections can use the watch API like so: .watch<any, X>(). Where X controls the type of the change document for your use case.

Check out the examples and documentation here.

Performance: Consider Server Load During Server Selection

Operations will now be directed towards servers that have fewer in progress operations. This distributes load across servers and prevents overwhelming servers that are already under load with additional requests.

Note

This release includes some experimental features that are not yet ready for use. As a reminder, anything marked experimental is not a part of the official driver API and is subject to change without notice.

Features

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.

v4.6.0-alpha.0

04 May 21:00
3269a6e
Compare
Choose a tag to compare
v4.6.0-alpha.0 Pre-release
Pre-release

The MongoDB Node.js team is pleased to announce version v4.6.0-alpha.0 of the mongodb package!

Release Highlights

This release is for internal testing - NOT intended for use production.

Features

Bug Fixes

Documentation

v4.5.0

04 Apr 20:32
3dba3ae
Compare
Choose a tag to compare

The MongoDB Node.js team is pleased to announce version 4.5.0 of the mongodb package!

Release Highlights

This release includes a number of enhancements noted below.

comment option support

The comment option is now widely available: by setting a comment on an operation you can trace its value in database logs for more insights.

collection.insertOne(
  { name: 'spot' },
  { comment: { started: new Date() } }
)

An example of a log line, trimmed for brevity. We can see the timestamp of the log and the time created on our client application differ.

{
  "t": { "$date": "2022-04-04T16:08:56.079-04:00" },
  "attr": {
    "commandArgs": {
      "documents": [ { "_id": "...", "name": "spot" } ],
      "comment": { "started": { "$date": "2022-04-04T20:08:56.072Z" } } }
  }
}

Socket timeout fixes for FaaS environments

This release includes a fix for serverless environments where transient serverHeartBeatFailure events that could be corrected to serverHeartBeatSucceeded events in the next tick of the event loop were nonetheless handled as an actual issue with the client's connection and caused unnecessary resource clean up routines.

It turns out that since Node.js handles timeout events first in the event loop, socket timeouts expire while the FaaS environment is dormant and the timeout handler code is the first thing that runs upon function wake prior to checking for any data from the server. Delaying the timeout handling until after the data reading phase avoids the sleep-induced timeout error in the cases where the connection is still healthy.

TS fixes for 4.7

Typescript 4.7 may not be out yet but in preparation for its release we've fixed issues compiling against that version. The main new obstacle was defaulting generic arguments that require that the constraining condition enforce similarity with the defaulted type. You may notice that our change stream watch<T extends Document = Document>() methods now requires that T extends Document, a requirement that already had to be met by the underlying ChangeStreamDocument type.

Features

Bug Fixes

Documentation

We invite you to try the mongodb library immediately, and report any issues to the NODE project.