Mongoose 243,355 is the object-document mapper most Node.js 2,131 teams reach for, and the "M" people usually mean when they say MERN. Version 9.10.1 sits on top of the mongodb driver ~7.6 that The Node.js Driver used directly: every model call ends up as the same wire command, so nothing here replaces what you know about filters, update operators or aggregation. What it adds is a schema written in JavaScript, casting, validation, lifecycle hooks and populate.
The running example is the Bookshelf API of The Bookshelf API, built behind a deliberately small data-layer contract — books.list({ limit, offset, q, genre, authorId, sort }) -> { total, items }, ids as opaque strings, every read returning plain objects — with an in-memory implementation and a one-line switch in src/data/index.js. By the end of this section that switch points at a Mongoose store and all 29 tests still pass untouched. Writing an ODM layer behind an interface is the difference between using Mongoose and marrying it.
Everything below was run against MongoDB 8.3.11 1,815 on Node.js 25.8.0, with npm 2,036 install mongoose adding 19 packages: the driver's tree plus kareem (hooks), mquery, mpath and sift.