MongoDB 9.0 was released on September 29, 2026, covering Atlas, Enterprise Advanced, Community Edition and self-managed environments. This post goes through its main changes by theme, and tags each one as a server capability available everywhere, Atlas-only, or Enterprise Advanced-only. A final section collects the compatibility changes and known issues listed in the release notes, to help you decide when to upgrade.
Figures are from MongoDB's internal testing (9.0 vs 8.0, using public benchmark methodologies). All are "up to" values and vary with workload, deployment, hardware and configuration — they don't predict results in your own environment.
Alongside the speedups, 9.0 puts explicit resource limits on single operations and concurrent transactions, making it harder for one runaway query to drag down a whole server.
A single query operation is capped at the greater of 1 GB or 20% of server memory. Operations that exceed it fail with errors such as ExceededMemoryLimit (146). The 100 MB per-stage limit and spill-to-disk behavior are unchanged.
maxConcurrentMultiDocumentTransactions defaults to 10000. Beyond that, new transactions from external clients fail with TooManyOpenTransactions.
At executionStats and above, explain reports expressionEvaluationPeakMemoryBytes for stages such as $project, $lookup and $match, helping you find memory-hungry expressions.
Every percentage above is an "up to" value from MongoDB's internal testing, and the "nearly 2x throughput on large deployments" claim comes with no stated workload or scale. The most reliable way to know whether upgrading pays off is to run your own workload against it in a test environment.
9.0 lets you tune a particular class of query without changing application code, and extends query statistics from reads to writes.
find, distinct and aggregate accept a querySettings document that applies only to that execution and isn't stored on the cluster. If the query shape already has cluster-level settings, the two are merged, and the stored setting wins on conflicts.
A new query setting that overrides internal server parameters for a single query shape. Requires feature compatibility version (FCV) 9.0 or later.
Set a time limit for one query shape through setQuerySettings, without editing every call site. Also requires FCV 9.0 or later.
Statistics now include update, insert and delete, with new fields such as metrics.cursor, metrics.queryExec, metrics.queryPlanner and metrics.writes. Enabled by default, sampling 1% of reads and of writes.
$accumulator, $function and $where, deprecated in 8.0, are re-enabled on a WebAssembly-based engine with stronger sandboxing. Not available on ppc64le.
// $queryStats must be run against the admin database db.getSiblingDB("admin").aggregate([ { $queryStats: {} } ])
The headline security change in 9.0 is Queryable Encryption's support for string queries, plus a set of additions around authentication, auditing and Atlas network connectivity.
mongosh needs the 9.0+ Automatic Encryption Shared Library specified with --cryptSharedLibPathmongocryptd is deprecated — use the Automatic Encryption Shared Library insteaduseInternalAuthzForX509: when true, MONGODB-X509 clients use internal authorization even if LDAP authorization is configureddirectRemote and direct_endpoint record the literal TCP peer, independent of any PROXY protocol header9.0 adds a large set of new server metrics, while Atlas gets improvements to its UI and to how data leaves the platform.
changeStreams.*, repl.network.bytesSent, operation.writeConflictRetry*, query.* and shardingStatistics.*cursor.open.total, cursor.open.pinned, cursor.totalOpened, cursor.lifespanreplSetGetStatus.initialSyncStatus adds phase, totalAttempts and bytesPerSecondMost changes in this group land on Atlas and Enterprise Advanced, but the server also gains a few sharding operations tools.
A managed availability capability for overloaded clusters: it queues transient traffic spikes, keeps short operations moving and long ones stable, and throttles excess requests only as a last resort — buying auto-scaling or operators time to act.
Backups bypass the Ops Manager control plane and use a direct data path, which MongoDB says is faster. Immutable, portable point-in-time restore (PITR) chains in S3 are also offered.
Database- and collection-level restores, improved snapshot management, and customizable maintenance waves.
mongosh adds sh.shardDrainingStatus() and sh.getTransitionToDedicatedConfigServerStatus() to follow shard draining and the move to a dedicated config server.
Detects more inconsistency types, and adds performStrictChunkChecksIfBelowThreshold: below a chunk-count threshold it does a full comparison, at or above it only compares counts.
Gen2 is available on M30+ dedicated clusters on AWS and GCP, with MongoDB citing better price-performance and more flexible storage and IOPS controls.
This group affects how you design data and constraints, and it's also the part that needs the most attention during an upgrade.
Time series collections are stored as a single namespace of compressed buckets and are no longer writable non-materialized views. renameCollection now works on them.
The server validates all ingested BSON and returns an error for invalid BSON.
Validation rules apply to all inserts and updates, and every existing document must satisfy them. Useful when you want to bake the application's expectations about data into the database.
What follows is compiled from the 9.0 release notes. The status of known issues changes with patch releases, so check the latest official release notes before you upgrade.
net.wireObjectCheck, --objcheck / --noobjcheck, and mongocryptdShardCatalogCacheCollectionMetadataMismatch inconsistency typeshardingStatistics.databaseVersionUpdateCounters is now databaseShardingMetadataStatistics; metrics.changeStreams.showExpandedEvents moves under option.. Update any monitoring scripts that reference the old namesqueryKnobs) need FCV 9.0, so don't rush to raise it all at onceShardingTaskExecutorPoolMinSize connections to each config server, which can exhaust them
If that parameter is greater than 1, set ShardingTaskExecutorPoolMinSizeForConfigServers to 1 before upgrading (dedicated config servers); for embedded config servers, contact MongoDB Support
listIndexes reports collation: { locale: "simple" }, which some ODMs (Mongoose, Doctrine ODM, Beanie) read as a definition change; Mongoose's syncIndexes() may then drop and rebuild unchanged indexes
Avoid syncIndexes() at startup and use createIndexes() or diffIndexes(); Mongoose 9.10.4 or 8.24.5 fixes it
initialSyncMethod set to logical, or clear dbPath and restart; Atlas users should contact MongoDB Support
Two things are worth doing around any upgrade: take a backup, and compare against your monitoring baseline. Those map directly onto WAP's backup and monitoring modules. For WAP's support status with 9.0 specifically, go by the WAP documentation. Also note that the Atlas Infinite public preview runs the latest 9.x.
First work out which features belong to your deployment, then validate in a test environment, then back up, upgrade and compare against your baseline. Take each step solidly and an upgrade stays an upgrade, not an adventure.