Skip to content

@mbroadst mbroadst released this Mar 21, 2019 · 61 commits to master since this release

The MongoDB Node.js team is pleased to announce version 3.2.1 of the driver.

Due to a publishing snafu v3.2.1 was immediately published without a proper v3.2.0 release

Release Highlights

2.x EOL

With the v3.1.0 release we officially deprecated the 2.x driver. With this release that driver is effectively EOL, and will no longer be supported. Please update your driver as soon as possible.

Unified Topology

In this release we are very excited to announce the immediate availability of a complete rewrite of the driver's "topology" layer. This is the core brains of the driver responsible for things like server selection, server discovery and monitoring. This work combines the three existing topology concepts (`Mongos`, `ReplSet`, and `Server`) into a single type `Topology`. The new `Topology` type uses the same machinery to represent all three types, greatly improving our ability to maintain the code, and reducing the chance for bug duplication.

The Topology class no longer uses a callback store, instead relying on a server selection loop for operation execution. This means failed operations will fail faster, with more accurate stack traces and specifics about the failure. It generally makes it much easier to reason about what the driver is doing each time an operation is executed.

You can enable it with the useUnifiedTopology feature flag passed to your MongoClient constructor, like so:

const client = MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true });

This topology layer will replace the existing topologies in a breaking 4.x release later this year, so we strongly encourage our users to try it out as soon as possible.

`withTransaction` helper

Reliably committing a transaction in the face of errors can be a complicated endeavor using the MongoDB 4.0 drivers API. This version introduces a `withTransaction` helper method on the `ClientSession` object that allows application logic to be executed within a transaction. This method is capable of retrying either the commit operation or entire transaction as needed (and when the error permits) to better ensure that the transaction can complete successfully. Consider using this for all but the most complicated of transactions use cases.

A call to withTransaction begins a new transaction, executes the provided function, and then attempts to commit the transaction. The function passed to withTransaction must take a session parameter, and this session must be passed to all methods within the function. If some error is encountered, it will attempt to re-commit the transaction before ultimately failing back to the user after aborting the transaction.
NOTE: A mentioned, the passed in function MAY be retried multiple times, please keep this in mind when executing non-database operations within the function.

Here’s an example of it in action:

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

const session = client.startSession();

// NOTE: the `withTransaction` method only supports functions that return a `Promise`
try {
  await session.withTransaction(async function(session) {
     const coll = client.db('foo').collection('coll');
     await coll.insertOne({ a: 42 }, { session });
  });
} catch (err) {
  // transaction failed after attempted retry
  console.dir({ err });
}

Cursors support asyncInterator and for..await..of loops

`Symbol.asyncIterator` is defined on cursors for Node.js versions that support it (>=v10.x.x). This allows you to use for..await..of loops with cursors:
client.connect().then(async function() {
  const collection = client.db(‘test’).collection(‘asyncIterators’);
  const cursor = collection.find();

  for await(const doc of cursor) {
    console.log(item);
  }
});

OP_MSG

This release also brings support for a new wire protocol introduced originally in version 3.6 of the server.

Database-level aggregation

The server supports several collection-less aggregation source stages like `$currentOp` and `$listLocalSessions`. In this version we have added a `Db.prototype.aggregate` helper for database-level aggregations.

Authentication

Since the 3.6 server release, multiple authentication contexts for a single MongoClient have been prohibited. This release cleans up the final bits of internal api related to multiple auth contexts, and greatly improves our ability to maintain this code. This not only involved simplifying the implementation of our auth providers, but also a large refactor of how connections are established and handshaked. Calls to `auth` and `logout` are now no-ops, and top level API for this will be removed in the next major release.

Release Notes

Bug

  • [NODE-1534] - retryWrites=true, remove, and limit=0
  • [NODE-1658] - Fix normalizing option names coming from connection string
  • [NODE-1685] - SCRAM-SHA-256 tests are not actually run against replicaset
  • [NODE-1687] - Replicaset tests for core use Server and require primary on port 31000
  • [NODE-1736] - Explain useNewUrlParser
  • [NODE-1778] - BulkWrite: Incorrect batch-size calculations causes batch to fail
  • [NODE-1782] - New Topology layer fails to clear monitor on close
  • [NODE-1840] - useNewUrlParser: true causes "command find requires authentication"
  • [NODE-1874] - Wrong JavaScript const use in lib/operations/db_ops.js
  • [NODE-1876] - Uncatchable exceptions
  • [NODE-1898] - BulkWrite: Incorrect batch-size calculations when array contains object with undefined value

New Feature

  • [NODE-1085] - OP_MSG support
  • [NODE-1259] - Refactor mongodb-core to use a single Topology type
  • [NODE-1684] - Define [Symbol.iterator] on our Cursor objects
  • [NODE-1741] - Implement Convenient API for Transactions
  • [NODE-1783] - Support running commands as aggregation
  • [NODE-1792] - Update handling of write concern errors by user management commands
  • [NODE-1793] - Transaction test runner should use "local" read concern when asserting the final collection state
  • [NODE-1841] - Disable TLS renegotiation when possible
  • [NODE-1850] - Drivers should ignore batchSize=0 for aggregate with $out
  • [NODE-1879] - Resync transaction spec tests for bulk write error reporting change

Improvement

  • [NODE-1264] - provide pre-built binaries for kerberos and ext-bson using node-pre-gyp
  • [NODE-1291] - Integrate single `Topology` from Core into Native
  • [NODE-1334] - Remove mutation of user-owned objects
  • [NODE-1385] - Remove JSDOC that says [param=null]
  • [NODE-1435] - Remove unnecessary auth code from connection pool
  • [NODE-1436] - Remove duplicated code from auth providers
  • [NODE-1437] - Implement auth connection string tests
  • [NODE-1442] - Refactor Auth to exclusively use a MongoCredential object
  • [NODE-1453] - Resync SDAM tests
  • [NODE-1491] - Add option for applications to register a custom server selector
  • [NODE-1620] - Port authentication support to new Topology class
  • [NODE-1644] - Deprecate parallelCollectionScan helpers
  • [NODE-1674] - Fix auth workflow with regards to auth mechanism resolution
  • [NODE-1683] - Evaluate and correct monitoring in new SDAM layer
  • [NODE-1688] - Update atlas connectivity tests to use new auth credentials
  • [NODE-1731] - CI Test against Node 10.x (Dubnium)
  • [NODE-1732] - Update Travis version of MongoDB
  • [NODE-1823] - Update unified topology to use refactored wire protocol
  • [NODE-1830] - Reduce creation of OP_QUERY to wire protocol classes
  • [NODE-1845] - Allow Connection to be shared with mock server
  • [NODE-1859] - Remove dead authentication code in pool and topologies
  • [NODE-1860] - Ensure ssl is honored when provided in URI
  • [NODE-1863] - Move connection handshake logic out of Server topology class
  • [NODE-1888] - countDocuments should use group with _id: 1
  • [NODE-1890] - Do not run sharding transaction tests for mongodb < 4.1.5
  • [NODE-1892] - Move all command modifying sessions methods out of pool
  • [NODE-1895] - Refactor insertMany to remove resultMutator
Assets 2
You can’t perform that action at this time.