Docs Home → Develop Applications → MongoDB Drivers → Node.js
What's New
Learn what's new in:
What's New in 4.1
New features of the 4.1 Node.js driver release include:
Added load balanced connection support for all cluster types including the beta Serverless platform.
Added support for the
advanceClusterTime()
method to determine if theClientSession
should update its cluster time.
What's New in 4.0
New features of the 4.0 Node.js driver release include:
TypeScript
We've migrated the driver to TypeScript. You can now harness the type hinting and intellisense features in editors that support it to develop your MongoDB applications. Enjoy the benefits of this work in pure JavaScript projects as well.
The underlying BSON library used by this version is now migrated to TypeScript.
Inline documentation is now consistenly formatted to improve display in editors.
If you are a user of the community types
@types/mongodb
, there will likely be issues adopting the types from our codebase. We could not achieve a one to one match in types due to the details of writing the codebase in TypeScript.
We'd love to hear your TypeScript related feature requests. Please submit ideas on our JIRA project here.
Key Changes
Node.js Version
The minimum supported version of Node.js is now v12.9 or greater for version 4 of the driver. Support for our 3.x branches will continue until summer 2022 to allow time to upgrade.
Note
3.x supports back to Node.js v4.
Cursor Improvements
Our Cursor implentation is now updated to make it clear what is possible before and after execution of an operation.
Example
const fc = collection.find({a: 2.3}).skip(1) for await (const doc of fc) { console.log(doc) fc.limit(1) // incorrect usage, cursor already executing }
There was inconsistency surrounding how the cursor would error if a setting was applied after cursor execution began. Now, the cursor will throw an error when attempting to apply operations in an invalid state, similar to the following:
MongoError: Cursor is already initialized
Affected classes:
AbstractCursor
FindCursor
AggregationCursor
ChangeStreamCursor
(This is the underlying cursor forChangeStream
)ListCollectionsCursor
Cursor Stream API
Our Cursor types no longer extend Readable
directly. They must be
transformed into a stream by calling cursor.stream()
.
Example
const cursor = collection.find({}) const stream = cursor.stream() stream.on("data", data => console.log) stream.on("error", () => client.close())
Use hasNext()
and next()
for manual iteration.
Use for await of
syntax or any Promise
helpers for
asynchronous iteration.
MongoClientOptions
Interface
With type hinting, you should find that options passed to a MongoClient
are enumerated and discoverable. We've made a large effort to process
all options in the driver to give early warnings about incompatible settings
to get your app up and running in a correct state quickly.
checkServerIdentity
is no longer checked before being passed to the underlying Node API. Previously, accepted values werefalse
, or a function. Now, the argument must be a function. Specifying a boolean will result in an error being thrown.It is no longer required to specify
useUnifiedTopology
oruseNewUrlParser
.
createCollection()
This method no longer supports a strict
option, which returned
an error if the collection did not exist. To assert the existence of
a collection, use the listCollections()
method instead.
Example
const collections = (await db.listCollections({}, { nameOnly: true }) .toArray()).map( ({name}) => name ); if (!collections.includes(myNewCollectionName)) { throw new Error(`${myNewCollectionName} doesn't exist`); }
BulkWriteError
→ MongoBulkWriteError
BulkWriteError
is now renamed to MongoBulkWriteError
.
When running bulk operations that make writes you can encounter errors
depending on your settings. Import the new class name MongoBulkWriteError
when testing for errors in bulk operations.
DB
DB
is no longer an EventEmitter
. Listen for events directly from your
MongoClient
instance.
Collection.group()
The Collection.group()
helper, deprecated since MongoDB 3.4,
is now removed. Use the aggregation pipeline $group
operator instead.
Authentication
gssapiServiceName
is now removed. Use authMechanismProperties.SERVICE_NAME in the URI or as an option onMongoClientOptions
.Example
?authMechanismProperties.SERVICE_NAME // or new MongoClient(url, { SERVICE_NAME: "alternateServiceName" }) Specifying username and password as options is only supported in the URI or as an option on
MongoClientOptions
.Example
new MongoClient("mongodb://username:password@<host><port>") // or new MongoClient(url, { auth: { username: "<>", password: "<>" } })
GridStore
Removal
The GridStore API (already deprecated in 3.x) is now replaced with GridFSBucket
.
For more information on GridFS
, see the mongodb manual.
Below are some snippets that represent equivalent operations.
Construction
Example
// old way const gs = new GridStore(db, filename, mode[, options]) // new way const bucket = new GridFSBucket(client.db('test')[,options])
File Seeking
GridFSBucket uses the Node.js Stream API. You can replicate file seeking
by using the start
and end
options, creating a download stream
from your GridFSBucket
.
Example
bucket.openDownloadStreamByName(filename, { start: 0, end: 100 })
File Upload & Download
Example
await client.connect(); const filename = 'test.txt'; // whatever local file name you want const db = client.db(); const bucket = new GridFSBucket(db); fs.createReadStream(filename) .pipe(bucket.openUploadStream(filename)) .on('error', console.error) .on('finish', () => { console.log('done writing to db!'); bucket .find() .toArray() .then(files => { console.log(files); bucket .openDownloadStreamByName(filename) .pipe(fs.createWriteStream('downloaded_' + filename)) .on('error', console.error) .on('finish', () => { console.log('done downloading!'); client.close(); }); }); });
Note
GridFSBucket
does not need to be closed like GridStore
.
File Deletion
Example
// old way GridStore.unlink(db, name, callback); // new way bucket.delete(file_id);
Finding File Metadata
File metadata that used to be accessible on the GridStore
instance can be
found by querying the bucket.
Example
const fileMetaDataList: GridFSFile[] = bucket.find({}).toArray();
Unified Topology
We internally now only manage a
unifiedTopology
when you connect to amongod
. The differences between this and previous versions is detailed here.It is no longer required to specify
useUnifiedTopology
oruseNewUrlParser
.You must use the new
directConnection
option to connect to unitiliazed replica set members.
Explain
Support is now added for fine-grained verbosity modes. You can learn more about each mode here.
Command Monitoring
The instrument()
method is now removed. Use command monitoring instead.
See our guide on command monitoring
for more information.
Detailed List
To view a full list of breaking changes introduced in this version, see the Breaking Changes section in the Upgrade guide.
What's New in 3.7
New features of the 3.7 Node.js driver release include:
Added support for load balancer mode while enabling the
useUnifiedTopology
optionAdded support for Stable API while enabling the
useUnifiedTopology
option
What's New in 3.6
New features of the 3.6 Node.js driver release include:
Added support for the MONGODB-AWS authentication mechanism using Amazon Web Services (AWS) Identity and Access Management (IAM) credentials
The find() method supports
allowDiskUse()
for sorts that require too much memory to execute in RAMThe update() and replaceOne() methods support index hints
A reduction in recovery time for topology changes and failover events
Improvements in validation testing for the default writeConcern
Authentication requires fewer round trips to the server, resulting in faster connection setup
Shorter Salted Challenge Response Authentication Mechanism (SCRAM) conversations
Ability to create collections and indexes for multiple document transactions
Running validation for a collection in the background