mongoose 8.20.0 → 9.0.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/eslint.config.mjs +198 -0
  2. package/lib/aggregate.js +17 -73
  3. package/lib/cast/bigint.js +1 -1
  4. package/lib/cast/double.js +1 -1
  5. package/lib/cast/uuid.js +5 -48
  6. package/lib/cast.js +2 -2
  7. package/lib/connection.js +0 -1
  8. package/lib/cursor/aggregationCursor.js +14 -24
  9. package/lib/cursor/queryCursor.js +7 -14
  10. package/lib/document.js +125 -121
  11. package/lib/drivers/node-mongodb-native/connection.js +3 -10
  12. package/lib/error/objectParameter.js +1 -2
  13. package/lib/error/validation.js +0 -8
  14. package/lib/helpers/clone.js +1 -1
  15. package/lib/helpers/common.js +1 -1
  16. package/lib/helpers/indexes/isIndexEqual.js +0 -1
  17. package/lib/helpers/model/applyDefaultsToPOJO.js +2 -2
  18. package/lib/helpers/model/applyHooks.js +43 -53
  19. package/lib/helpers/model/applyMethods.js +2 -2
  20. package/lib/helpers/model/applyStaticHooks.js +1 -48
  21. package/lib/helpers/model/castBulkWrite.js +1 -1
  22. package/lib/helpers/parallelLimit.js +18 -36
  23. package/lib/helpers/pluralize.js +3 -3
  24. package/lib/helpers/populate/assignRawDocsToIdStructure.js +1 -8
  25. package/lib/helpers/populate/createPopulateQueryFilter.js +1 -1
  26. package/lib/helpers/populate/getModelsMapForPopulate.js +17 -9
  27. package/lib/helpers/populate/getSchemaTypes.js +5 -5
  28. package/lib/helpers/query/cast$expr.js +8 -10
  29. package/lib/helpers/query/castFilterPath.js +1 -1
  30. package/lib/helpers/query/castUpdate.js +14 -12
  31. package/lib/helpers/query/getEmbeddedDiscriminatorPath.js +1 -1
  32. package/lib/helpers/schema/applyPlugins.js +1 -1
  33. package/lib/helpers/schema/getIndexes.js +1 -7
  34. package/lib/helpers/timestamps/setupTimestamps.js +3 -6
  35. package/lib/helpers/updateValidators.js +57 -111
  36. package/lib/model.js +419 -607
  37. package/lib/mongoose.js +41 -13
  38. package/lib/plugins/saveSubdocs.js +24 -51
  39. package/lib/plugins/sharding.js +5 -4
  40. package/lib/plugins/validateBeforeSave.js +3 -13
  41. package/lib/query.js +101 -145
  42. package/lib/queryHelpers.js +2 -2
  43. package/lib/schema/array.js +41 -84
  44. package/lib/schema/documentArray.js +57 -94
  45. package/lib/schema/documentArrayElement.js +16 -11
  46. package/lib/schema/string.js +1 -1
  47. package/lib/schema/subdocument.js +22 -28
  48. package/lib/schema/uuid.js +0 -21
  49. package/lib/schema.js +81 -39
  50. package/lib/schemaType.js +39 -57
  51. package/lib/types/array/index.js +2 -2
  52. package/lib/types/array/methods/index.js +4 -4
  53. package/lib/types/arraySubdocument.js +1 -1
  54. package/lib/types/buffer.js +10 -10
  55. package/lib/types/decimal128.js +1 -1
  56. package/lib/types/documentArray/index.js +1 -1
  57. package/lib/types/documentArray/methods/index.js +5 -3
  58. package/lib/types/double.js +1 -1
  59. package/lib/types/objectid.js +1 -1
  60. package/lib/types/subdocument.js +15 -43
  61. package/lib/types/uuid.js +1 -1
  62. package/lib/utils.js +1 -8
  63. package/lib/validOptions.js +3 -3
  64. package/package.json +11 -24
  65. package/types/connection.d.ts +20 -11
  66. package/types/document.d.ts +95 -26
  67. package/types/index.d.ts +143 -39
  68. package/types/inferhydrateddoctype.d.ts +115 -0
  69. package/types/inferrawdoctype.d.ts +99 -75
  70. package/types/inferschematype.d.ts +17 -3
  71. package/types/middlewares.d.ts +0 -2
  72. package/types/models.d.ts +131 -199
  73. package/types/mongooseoptions.d.ts +6 -5
  74. package/types/pipelinestage.d.ts +1 -1
  75. package/types/query.d.ts +71 -139
  76. package/types/schemaoptions.d.ts +1 -1
  77. package/types/schematypes.d.ts +14 -10
  78. package/types/types.d.ts +3 -4
  79. package/types/utility.d.ts +68 -48
  80. package/types/validation.d.ts +18 -14
  81. package/browser.js +0 -8
  82. package/dist/browser.umd.js +0 -2
  83. package/lib/browser.js +0 -141
  84. package/lib/browserDocument.js +0 -101
  85. package/lib/documentProvider.js +0 -30
  86. package/lib/drivers/browser/binary.js +0 -14
  87. package/lib/drivers/browser/decimal128.js +0 -7
  88. package/lib/drivers/browser/index.js +0 -13
  89. package/lib/drivers/browser/objectid.js +0 -29
  90. package/lib/helpers/promiseOrCallback.js +0 -54
@@ -4,8 +4,8 @@
4
4
 
5
5
  'use strict';
6
6
 
7
- const Binary = require('bson').Binary;
8
- const UUID = require('bson').UUID;
7
+ const Binary = require('mongodb/lib/bson').Binary;
8
+ const UUID = require('mongodb/lib/bson').UUID;
9
9
  const utils = require('../utils');
10
10
 
11
11
  /**
@@ -169,14 +169,14 @@ utils.each(
169
169
  *
170
170
  * #### SubTypes:
171
171
  *
172
- * const bson = require('bson')
173
- * bson.BSON_BINARY_SUBTYPE_DEFAULT
174
- * bson.BSON_BINARY_SUBTYPE_FUNCTION
175
- * bson.BSON_BINARY_SUBTYPE_BYTE_ARRAY
176
- * bson.BSON_BINARY_SUBTYPE_UUID
177
- * bson.BSON_BINARY_SUBTYPE_MD5
178
- * bson.BSON_BINARY_SUBTYPE_USER_DEFINED
179
- * doc.buffer.toObject(bson.BSON_BINARY_SUBTYPE_USER_DEFINED);
172
+ * const mongodb = require('mongodb')
173
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_DEFAULT
174
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_FUNCTION
175
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_BYTE_ARRAY
176
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_UUID
177
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_MD5
178
+ * mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED
179
+ * doc.buffer.toObject(mongodb.BSON.BSON_BINARY_SUBTYPE_USER_DEFINED);
180
180
  *
181
181
  * @see bsonspec https://bsonspec.org/#/specification
182
182
  * @param {Hex} [subtype]
@@ -10,4 +10,4 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- module.exports = require('bson').Decimal128;
13
+ module.exports = require('mongodb/lib/bson').Decimal128;
@@ -61,7 +61,7 @@ function MongooseDocumentArray(values, path, doc, schematype) {
61
61
  while (internals[arraySchemaSymbol] != null &&
62
62
  internals[arraySchemaSymbol].$isMongooseArray &&
63
63
  !internals[arraySchemaSymbol].$isMongooseDocumentArray) {
64
- internals[arraySchemaSymbol] = internals[arraySchemaSymbol].casterConstructor;
64
+ internals[arraySchemaSymbol] = internals[arraySchemaSymbol].embeddedSchemaType;
65
65
  }
66
66
  }
67
67
 
@@ -59,7 +59,7 @@ const methods = {
59
59
  if (this[arraySchemaSymbol] == null) {
60
60
  return value;
61
61
  }
62
- let Constructor = this[arraySchemaSymbol].casterConstructor;
62
+ let Constructor = this[arraySchemaSymbol].Constructor;
63
63
  const isInstance = Constructor.$isMongooseDocumentArray ?
64
64
  utils.isMongooseDocumentArray(value) :
65
65
  value instanceof Constructor;
@@ -143,7 +143,9 @@ const methods = {
143
143
  if (idSchemaType) {
144
144
  try {
145
145
  castedId = idSchemaType.cast(id);
146
- } catch (_err) {}
146
+ } catch {
147
+ // ignore error
148
+ }
147
149
  }
148
150
 
149
151
  let _id;
@@ -292,7 +294,7 @@ const methods = {
292
294
  */
293
295
 
294
296
  create(obj) {
295
- let Constructor = this[arraySchemaSymbol].casterConstructor;
297
+ let Constructor = this[arraySchemaSymbol].Constructor;
296
298
  if (obj &&
297
299
  Constructor.discriminators &&
298
300
  Constructor.schema &&
@@ -10,4 +10,4 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- module.exports = require('bson').Double;
13
+ module.exports = require('mongodb/lib/bson').Double;
@@ -10,7 +10,7 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- const ObjectId = require('bson').ObjectId;
13
+ const ObjectId = require('mongodb/lib/bson').ObjectId;
14
14
  const objectIdSymbol = require('../helpers/symbols').objectIdSymbol;
15
15
 
16
16
  /**
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  const Document = require('../document');
4
- const immediate = require('../helpers/immediate');
5
4
  const internalToObjectOptions = require('../options').internalToObjectOptions;
6
5
  const util = require('util');
7
6
  const utils = require('../utils');
@@ -15,11 +14,7 @@ module.exports = Subdocument;
15
14
  * @api private
16
15
  */
17
16
 
18
- function Subdocument(value, fields, parent, skipId, options) {
19
- if (typeof skipId === 'object' && skipId != null && options == null) {
20
- options = skipId;
21
- skipId = undefined;
22
- }
17
+ function Subdocument(value, fields, parent, options) {
23
18
  if (parent != null) {
24
19
  // If setting a nested path, should copy isNew from parent re: gh-7048
25
20
  const parentOptions = { isNew: parent.isNew };
@@ -45,7 +40,7 @@ function Subdocument(value, fields, parent, skipId, options) {
45
40
  delete documentOptions.path;
46
41
  }
47
42
 
48
- Document.call(this, value, fields, skipId, documentOptions);
43
+ Document.call(this, value, fields, documentOptions);
49
44
 
50
45
  delete this.$__.priorDoc;
51
46
  }
@@ -94,14 +89,7 @@ Subdocument.prototype.save = async function save(options) {
94
89
  'if you\'re sure this behavior is right for your app.');
95
90
  }
96
91
 
97
- return new Promise((resolve, reject) => {
98
- this.$__save((err) => {
99
- if (err != null) {
100
- return reject(err);
101
- }
102
- resolve(this);
103
- });
104
- });
92
+ return await this.$__save();
105
93
  };
106
94
 
107
95
  /**
@@ -164,8 +152,15 @@ Subdocument.prototype.$__pathRelativeToParent = function(p) {
164
152
  * @api private
165
153
  */
166
154
 
167
- Subdocument.prototype.$__save = function(fn) {
168
- return immediate(() => fn(null, this));
155
+ Subdocument.prototype.$__save = async function $__save() {
156
+ try {
157
+ await this._execDocumentPreHooks('save');
158
+ } catch (error) {
159
+ await this._execDocumentPostHooks('save', error);
160
+ return;
161
+ }
162
+
163
+ await this._execDocumentPostHooks('save');
169
164
  };
170
165
 
171
166
  /*!
@@ -286,7 +281,7 @@ Subdocument.prototype.ownerDocument = function() {
286
281
  return this.$__.ownerDocument;
287
282
  }
288
283
 
289
- let parent = this; // eslint-disable-line consistent-this
284
+ let parent = this;
290
285
  const paths = [];
291
286
  const seenDocs = new Set([parent]);
292
287
 
@@ -318,7 +313,7 @@ Subdocument.prototype.ownerDocument = function() {
318
313
  */
319
314
 
320
315
  Subdocument.prototype.$__fullPathWithIndexes = function() {
321
- let parent = this; // eslint-disable-line consistent-this
316
+ let parent = this;
322
317
  const paths = [];
323
318
  const seenDocs = new Set([parent]);
324
319
 
@@ -361,22 +356,6 @@ Subdocument.prototype.parent = function() {
361
356
 
362
357
  Subdocument.prototype.$parent = Subdocument.prototype.parent;
363
358
 
364
- /**
365
- * no-op for hooks
366
- * @param {Function} cb
367
- * @method $__deleteOne
368
- * @memberOf Subdocument
369
- * @instance
370
- * @api private
371
- */
372
-
373
- Subdocument.prototype.$__deleteOne = function(cb) {
374
- if (cb == null) {
375
- return;
376
- }
377
- return cb(null, this);
378
- };
379
-
380
359
  /**
381
360
  * ignore
382
361
  * @method $__removeFromParent
@@ -393,14 +372,9 @@ Subdocument.prototype.$__removeFromParent = function() {
393
372
  * Null-out this subdoc
394
373
  *
395
374
  * @param {Object} [options]
396
- * @param {Function} [callback] optional callback for compatibility with Document.prototype.remove
397
375
  */
398
376
 
399
- Subdocument.prototype.deleteOne = function(options, callback) {
400
- if (typeof options === 'function') {
401
- callback = options;
402
- options = null;
403
- }
377
+ Subdocument.prototype.deleteOne = function deleteOne(options) {
404
378
  registerRemoveListener(this);
405
379
 
406
380
  // If removing entire doc, no need to remove subdoc
@@ -411,8 +385,6 @@ Subdocument.prototype.deleteOne = function(options, callback) {
411
385
  owner.$__.removedSubdocs = owner.$__.removedSubdocs || [];
412
386
  owner.$__.removedSubdocs.push(this);
413
387
  }
414
-
415
- return this.$__deleteOne(callback);
416
388
  };
417
389
 
418
390
  /*!
package/lib/types/uuid.js CHANGED
@@ -10,4 +10,4 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- module.exports = require('bson').UUID;
13
+ module.exports = require('mongodb/lib/bson').UUID;
package/lib/utils.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * Module dependencies.
5
5
  */
6
6
 
7
- const UUID = require('bson').UUID;
7
+ const UUID = require('mongodb/lib/bson').UUID;
8
8
  const ms = require('ms');
9
9
  const mpath = require('mpath');
10
10
  const ObjectId = require('./types/objectid');
@@ -18,7 +18,6 @@ const isBsonType = require('./helpers/isBsonType');
18
18
  const isPOJO = require('./helpers/isPOJO');
19
19
  const getFunctionName = require('./helpers/getFunctionName');
20
20
  const isMongooseObject = require('./helpers/isMongooseObject');
21
- const promiseOrCallback = require('./helpers/promiseOrCallback');
22
21
  const schemaMerge = require('./helpers/schema/merge');
23
22
  const specialProperties = require('./helpers/specialProperties');
24
23
  const { trustedSymbol } = require('./helpers/query/trusted');
@@ -197,12 +196,6 @@ exports.last = function(arr) {
197
196
  return void 0;
198
197
  };
199
198
 
200
- /*!
201
- * ignore
202
- */
203
-
204
- exports.promiseOrCallback = promiseOrCallback;
205
-
206
199
  /*!
207
200
  * ignore
208
201
  */
@@ -19,7 +19,6 @@ const VALID_OPTIONS = Object.freeze([
19
19
  'debug',
20
20
  'forceRepopulate',
21
21
  'id',
22
- 'timestamps.createdAt.immutable',
23
22
  'maxTimeMS',
24
23
  'objectIdGetter',
25
24
  'overwriteModels',
@@ -29,14 +28,15 @@ const VALID_OPTIONS = Object.freeze([
29
28
  'sanitizeProjection',
30
29
  'selectPopulatedPaths',
31
30
  'setDefaultsOnInsert',
32
- 'skipOriginalStackTraces',
33
31
  'strict',
34
32
  'strictPopulate',
35
33
  'strictQuery',
34
+ 'timestamps.createdAt.immutable',
36
35
  'toJSON',
37
36
  'toObject',
38
37
  'transactionAsyncLocalStorage',
39
- 'translateAliases'
38
+ 'translateAliases',
39
+ 'updatePipeline'
40
40
  ]);
41
41
 
42
42
  module.exports = VALID_OPTIONS;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mongoose",
3
3
  "description": "Mongoose MongoDB ODM",
4
- "version": "8.20.0",
4
+ "version": "9.0.0-rc1",
5
5
  "author": "Guillermo Rauch <guillermo@learnboost.com>",
6
6
  "keywords": [
7
7
  "mongodb",
@@ -20,33 +20,24 @@
20
20
  "type": "commonjs",
21
21
  "license": "MIT",
22
22
  "dependencies": {
23
- "bson": "^6.10.4",
24
- "kareem": "2.6.3",
25
- "mongodb": "~6.20.0",
23
+ "kareem": "3.0.0",
24
+ "mongodb": "~7.0",
26
25
  "mpath": "0.9.0",
27
- "mquery": "5.0.0",
26
+ "mquery": "6.0.0",
28
27
  "ms": "2.1.3",
29
28
  "sift": "17.1.3"
30
29
  },
31
30
  "devDependencies": {
32
31
  "@ark/attest": "0.53.0",
33
- "@babel/core": "7.28.5",
34
- "@babel/preset-env": "7.28.5",
35
32
  "@mongodb-js/mongodb-downloader": "^1.0.0",
36
- "@typescript-eslint/eslint-plugin": "^8.19.1",
37
- "@typescript-eslint/parser": "^8.19.1",
38
33
  "acquit": "1.4.0",
39
34
  "acquit-ignore": "0.2.1",
40
35
  "acquit-require": "0.1.1",
41
36
  "ajv": "8.17.1",
42
- "assert-browserify": "2.0.0",
43
- "babel-loader": "8.2.5",
44
37
  "broken-link-checker": "^0.7.8",
45
- "buffer": "^5.6.0",
46
38
  "cheerio": "1.1.2",
47
- "crypto-browserify": "3.12.1",
48
39
  "dox": "1.0.0",
49
- "eslint": "8.57.1",
40
+ "eslint": "9.25.1",
50
41
  "eslint-plugin-markdown": "^5.1.0",
51
42
  "eslint-plugin-mocha-no-only": "1.2.0",
52
43
  "express": "^4.19.2",
@@ -61,16 +52,15 @@
61
52
  "moment": "2.30.1",
62
53
  "mongodb-memory-server": "10.3.0",
63
54
  "mongodb-runner": "^6.0.0",
55
+ "mongodb-client-encryption": "~7.0",
64
56
  "ncp": "^2.0.0",
65
57
  "nyc": "15.1.0",
66
58
  "pug": "3.0.3",
67
- "q": "1.5.1",
68
59
  "sinon": "21.0.0",
69
- "stream-browserify": "3.0.0",
70
60
  "tsd": "0.33.0",
71
61
  "typescript": "5.9.3",
72
- "uuid": "11.1.0",
73
- "webpack": "5.102.1"
62
+ "typescript-eslint": "^8.31.1",
63
+ "uuid": "11.1.0"
74
64
  },
75
65
  "directories": {
76
66
  "lib": "./lib/mongoose"
@@ -96,8 +86,6 @@
96
86
  "lint-js": "eslint . --ext .js --ext .cjs",
97
87
  "lint-ts": "eslint . --ext .ts",
98
88
  "lint-md": "markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#benchmarks\"",
99
- "build-browser": "(rm ./dist/* || true) && node ./scripts/build-browser.js",
100
- "prepublishOnly": "npm run build-browser",
101
89
  "release": "git pull && git push origin master --tags && npm publish",
102
90
  "release-5x": "git pull origin 5.x && git push origin 5.x && git push origin 5.x --tags && npm publish --tag 5x",
103
91
  "release-6x": "git pull origin 6.x && git push origin 6.x && git push origin 6.x --tags && npm publish --tag 6x",
@@ -107,7 +95,7 @@
107
95
  "test": "mocha --exit ./test/*.test.js",
108
96
  "test-deno": "deno run --allow-env --allow-read --allow-net --allow-run --allow-sys --allow-write ./test/deno.mjs",
109
97
  "test-rs": "START_REPLICA_SET=1 mocha --timeout 30000 --exit ./test/*.test.js",
110
- "test-tsd": "node ./test/types/check-types-filename && tsd",
98
+ "test-tsd": "node ./test/types/check-types-filename && tsd --full",
111
99
  "setup-test-encryption": "node scripts/setup-encryption-tests.js",
112
100
  "test-encryption": "mocha --exit ./test/encryption/*.test.js",
113
101
  "tdd": "mocha ./test/*.test.js --inspect --watch --recursive --watch-files ./**/*.{js,ts}",
@@ -118,7 +106,7 @@
118
106
  "main": "./index.js",
119
107
  "types": "./types/index.d.ts",
120
108
  "engines": {
121
- "node": ">=16.20.1"
109
+ "node": ">=20.19.0"
122
110
  },
123
111
  "bugs": {
124
112
  "url": "https://github.com/Automattic/mongoose/issues/new"
@@ -128,7 +116,6 @@
128
116
  "url": "git://github.com/Automattic/mongoose.git"
129
117
  },
130
118
  "homepage": "https://mongoosejs.com",
131
- "browser": "./dist/browser.umd.js",
132
119
  "config": {
133
120
  "mongodbMemoryServer": {
134
121
  "disablePostinstall": true
@@ -148,7 +135,7 @@
148
135
  "noImplicitAny": false,
149
136
  "strictNullChecks": true,
150
137
  "module": "commonjs",
151
- "target": "ES2017"
138
+ "target": "ES2022"
152
139
  }
153
140
  }
154
141
  }
@@ -186,16 +186,25 @@ declare module 'mongoose' {
186
186
  collection?: string,
187
187
  options?: CompileModelOptions
188
188
  ): Model<
189
- InferSchemaType<TSchema>,
190
- ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>,
191
- ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
192
- {},
193
- HydratedDocument<
194
- InferSchemaType<TSchema>,
195
- ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
196
- ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>
197
- >,
198
- TSchema> & ObtainSchemaGeneric<TSchema, 'TStaticMethods'>;
189
+ InferSchemaType<TSchema>,
190
+ ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>,
191
+ ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
192
+ ObtainSchemaGeneric<TSchema, 'TVirtuals'>,
193
+ // If first schema generic param is set, that means we have an explicit raw doc type,
194
+ // so user should also specify a hydrated doc type if the auto inferred one isn't correct.
195
+ IsItRecordAndNotAny<ObtainSchemaGeneric<TSchema, 'EnforcedDocType'>> extends true
196
+ ? ObtainSchemaGeneric<TSchema, 'THydratedDocumentType'>
197
+ : HydratedDocument<
198
+ InferSchemaType<TSchema>,
199
+ ObtainSchemaGeneric<TSchema, 'TVirtuals'> & ObtainSchemaGeneric<TSchema, 'TInstanceMethods'>,
200
+ ObtainSchemaGeneric<TSchema, 'TQueryHelpers'>,
201
+ ObtainSchemaGeneric<TSchema, 'TVirtuals'>,
202
+ InferSchemaType<TSchema>,
203
+ ObtainSchemaGeneric<TSchema, 'TSchemaOptions'>
204
+ >,
205
+ TSchema,
206
+ ObtainSchemaGeneric<TSchema, 'TLeanResultType'>
207
+ > & ObtainSchemaGeneric<TSchema, 'TStaticMethods'>;
199
208
  model<T, U, TQueryHelpers = {}>(
200
209
  name: string,
201
210
  schema?: Schema<T, any, any, TQueryHelpers, any, any, any>,
@@ -273,7 +282,7 @@ declare module 'mongoose' {
273
282
  transaction<ReturnType = unknown>(fn: (session: mongodb.ClientSession) => Promise<ReturnType>, options?: mongodb.TransactionOptions): Promise<ReturnType>;
274
283
 
275
284
  /** Switches to a different database using the same connection pool. */
276
- useDb(name: string, options?: { useCache?: boolean, noListener?: boolean }): Connection;
285
+ useDb(name: string, options?: { useCache?: boolean }): Connection;
277
286
 
278
287
  /** The username specified in the URI */
279
288
  readonly user: string;
@@ -166,9 +166,6 @@ declare module 'mongoose' {
166
166
  */
167
167
  getChanges(): UpdateQuery<this>;
168
168
 
169
- /** The string version of this documents _id. */
170
- id?: any;
171
-
172
169
  /** Signal that we desire an increment of this documents version. */
173
170
  increment(): this;
174
171
 
@@ -256,33 +253,105 @@ declare module 'mongoose' {
256
253
  set(value: string | Record<string, any>): this;
257
254
 
258
255
  /** The return value of this method is used in calls to JSON.stringify(doc). */
259
- toJSON(options: ToObjectOptions & { versionKey: false, virtuals: true, flattenObjectIds: true }): Omit<ObjectIdToString<FlattenMaps<Require_id<DocType & TVirtuals>>>, '__v'>;
260
- toJSON(options: ToObjectOptions & { virtuals: true, flattenObjectIds: true }): ObjectIdToString<FlattenMaps<Default__v<Require_id<DocType & TVirtuals>, ResolveSchemaOptions<TSchemaOptions>>>>;
256
+ // Consistently handle combinations of flattenMaps, flattenObjectIds, virtuals, and versionKey
257
+
258
+ // All combinations, including with and without TVirtuals when virtuals is true/false,
259
+ // and proper nesting/order: flattenMaps -> ObjectIdToString -> Omit<..., '__v'> when needed.
260
+
261
+ // flattenMaps: false (default) cases
262
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: true, versionKey: false }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
263
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Require_id<DocType & TVirtuals>>;
264
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: true, versionKey: false }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
265
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: true }): Require_id<DocType & TVirtuals>;
266
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: false, versionKey: false }): ObjectIdToString<Omit<Require_id<DocType>, '__v'>>;
267
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: false }): ObjectIdToString<Require_id<DocType>>;
268
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: false, versionKey: false }): Omit<Require_id<DocType>, '__v'>;
269
+ toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: false }): Require_id<DocType>;
270
+
271
+ // flattenMaps: true cases
272
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true, versionKey: false }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>>;
273
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<FlattenMaps<Require_id<DocType & TVirtuals>>>;
274
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: true, versionKey: false }): Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>;
275
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: true }): FlattenMaps<Require_id<DocType & TVirtuals>>;
276
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: false, versionKey: false }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType>>, '__v'>>;
277
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: false }): ObjectIdToString<FlattenMaps<Require_id<DocType>>>;
278
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: false, versionKey: false }): Omit<FlattenMaps<Require_id<DocType>>, '__v'>;
279
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: false }): FlattenMaps<Require_id<DocType>>;
280
+
281
+ // Handle "at least" short cross-combinations
282
+ // (Some permutations above will catch these, but make some explicit for clarity)
283
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<FlattenMaps<Require_id<DocType & TVirtuals>>>;
284
+ toJSON(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true }): ObjectIdToString<FlattenMaps<Require_id<DocType>>>;
285
+ toJSON(options: ToObjectOptions & { flattenObjectIds: true, virtuals: true }): ObjectIdToString<Require_id<DocType & TVirtuals>>;
286
+ toJSON(options: ToObjectOptions & { flattenObjectIds: true }): ObjectIdToString<Require_id<DocType>>;
287
+ toJSON(options: ToObjectOptions & { flattenMaps: true, virtuals: true }): FlattenMaps<Require_id<DocType & TVirtuals>>;
288
+ toJSON(options: ToObjectOptions & { flattenMaps: true }): FlattenMaps<Require_id<DocType>>;
289
+
290
+ // Handle versionKey: false (regardless of the others - most specific overloads should come first)
291
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>>;
292
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenMaps: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
293
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenMaps: true, virtuals: true }): Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>;
294
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
261
295
  toJSON(options: ToObjectOptions & { versionKey: false, virtuals: true }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
262
- toJSON(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true }): ObjectIdToString<FlattenMaps<Omit<Require_id<DocType>, '__v'>>>;
263
- toJSON(options: ToObjectOptions & { virtuals: true }): Default__v<Require_id<DocType & TVirtuals>, ResolveSchemaOptions<TSchemaOptions>>;
264
- toJSON(options: ToObjectOptions & { versionKey: false }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
265
- toJSON(options?: ToObjectOptions & { flattenMaps?: true, flattenObjectIds?: false }): FlattenMaps<Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>>;
266
- toJSON(options: ToObjectOptions & { flattenObjectIds: false }): FlattenMaps<Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>>;
267
- toJSON(options: ToObjectOptions & { flattenObjectIds: true }): ObjectIdToString<FlattenMaps<Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>>>;
268
- toJSON(options: ToObjectOptions & { flattenMaps: false }): Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>;
269
- toJSON(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true }): ObjectIdToString<Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>>;
270
-
271
- toJSON<T = Default__v<Require_id<DocType>, TSchemaOptions>>(options?: ToObjectOptions & { flattenMaps?: true, flattenObjectIds?: false }): FlattenMaps<T>;
272
- toJSON<T = Default__v<Require_id<DocType>, TSchemaOptions>>(options: ToObjectOptions & { flattenObjectIds: false }): FlattenMaps<T>;
273
- toJSON<T = Default__v<Require_id<DocType>, TSchemaOptions>>(options: ToObjectOptions & { flattenObjectIds: true }): ObjectIdToString<FlattenMaps<T>>;
274
- toJSON<T = Default__v<Require_id<DocType>, TSchemaOptions>>(options: ToObjectOptions & { flattenMaps: false }): T;
275
- toJSON<T = Default__v<Require_id<DocType>, TSchemaOptions>>(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true }): ObjectIdToString<T>;
296
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenMaps: true, flattenObjectIds: true }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType>>, '__v'>>;
297
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true }): ObjectIdToString<Omit<Require_id<DocType>, '__v'>>;
298
+ toJSON(options: ToObjectOptions & { versionKey: false, flattenMaps: true }): Omit<FlattenMaps<Require_id<DocType>>, '__v'>;
299
+ toJSON(options: ToObjectOptions & { versionKey: false }): Omit<Require_id<DocType>, '__v'>;
300
+
301
+ // Handle virtuals: true
302
+ toJSON(options: ToObjectOptions & { virtuals: true }): Require_id<DocType & TVirtuals>;
303
+
304
+ // Default - no special options
305
+ toJSON(options?: ToObjectOptions): Default__v<Require_id<DocType>, TSchemaOptions>;
306
+
307
+ toJSON<T>(options?: ToObjectOptions): Default__v<Require_id<T>, ResolveSchemaOptions<TSchemaOptions>>;
276
308
 
277
309
  /** Converts this document into a plain-old JavaScript object ([POJO](https://masteringjs.io/tutorials/fundamentals/pojo)). */
278
- toObject(options: ToObjectOptions & { versionKey: false, virtuals: true, flattenObjectIds: true }): Omit<ObjectIdToString<Require_id<DocType & TVirtuals>>, '__v'>;
279
- toObject(options: ToObjectOptions & { virtuals: true, flattenObjectIds: true }): ObjectIdToString<Default__v<Require_id<DocType & TVirtuals>, ResolveSchemaOptions<TSchemaOptions>>>;
280
- toObject(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true }): Omit<ObjectIdToString<Require_id<DocType & TVirtuals>>, '__v'>;
310
+ // flattenMaps: false (default) cases
311
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: true, versionKey: false }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
312
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Require_id<DocType & TVirtuals>>;
313
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: true, versionKey: false }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
314
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: true }): Require_id<DocType & TVirtuals>;
315
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: false, versionKey: false }): ObjectIdToString<Omit<Require_id<DocType>, '__v'>>;
316
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: true, virtuals: false }): ObjectIdToString<Require_id<DocType>>;
317
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: false, versionKey: false }): Omit<Require_id<DocType>, '__v'>;
318
+ toObject(options: ToObjectOptions & { flattenMaps: false, flattenObjectIds: false, virtuals: false }): Require_id<DocType>;
319
+
320
+ // flattenMaps: true cases
321
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true, versionKey: false }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>>;
322
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<FlattenMaps<Require_id<DocType & TVirtuals>>>;
323
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: true, versionKey: false }): Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>;
324
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: true }): FlattenMaps<Require_id<DocType & TVirtuals>>;
325
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: false, versionKey: false }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType>>, '__v'>>;
326
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: false }): ObjectIdToString<FlattenMaps<Require_id<DocType>>>;
327
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: false, versionKey: false }): Omit<FlattenMaps<Require_id<DocType>>, '__v'>;
328
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: false, virtuals: false }): FlattenMaps<Require_id<DocType>>;
329
+
330
+ // Handle "at least" short cross-combinations
331
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<FlattenMaps<Require_id<DocType & TVirtuals>>>;
332
+ toObject(options: ToObjectOptions & { flattenMaps: true, flattenObjectIds: true }): ObjectIdToString<FlattenMaps<Require_id<DocType>>>;
333
+ toObject(options: ToObjectOptions & { flattenObjectIds: true, virtuals: true }): ObjectIdToString<Require_id<DocType & TVirtuals>>;
334
+ toObject(options: ToObjectOptions & { flattenObjectIds: true }): ObjectIdToString<Require_id<DocType>>;
335
+ toObject(options: ToObjectOptions & { flattenMaps: true, virtuals: true }): FlattenMaps<Require_id<DocType & TVirtuals>>;
336
+ toObject(options: ToObjectOptions & { flattenMaps: true }): FlattenMaps<Require_id<DocType>>;
337
+
338
+ // Handle versionKey: false (regardless of the others - most specific overloads should come first)
339
+ toObject(options: ToObjectOptions & { versionKey: false, flattenMaps: true, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>>;
340
+ toObject(options: ToObjectOptions & { versionKey: false, flattenMaps: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
341
+ toObject(options: ToObjectOptions & { versionKey: false, flattenMaps: true, virtuals: true }): Omit<FlattenMaps<Require_id<DocType & TVirtuals>>, '__v'>;
342
+ toObject(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true, virtuals: true }): ObjectIdToString<Omit<Require_id<DocType & TVirtuals>, '__v'>>;
281
343
  toObject(options: ToObjectOptions & { versionKey: false, virtuals: true }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
282
- toObject(options: ToObjectOptions & { virtuals: true }): Default__v<Require_id<DocType & TVirtuals>, ResolveSchemaOptions<TSchemaOptions>>;
283
- toObject(options: ToObjectOptions & { versionKey: false }): Omit<Require_id<DocType & TVirtuals>, '__v'>;
284
- toObject(options: ToObjectOptions & { flattenObjectIds: true }): ObjectIdToString<Default__v<Require_id<DocType & TVirtuals>, ResolveSchemaOptions<TSchemaOptions>>>;
285
- toObject(options?: ToObjectOptions): Default__v<Require_id<DocType>, ResolveSchemaOptions<TSchemaOptions>>;
344
+ toObject(options: ToObjectOptions & { versionKey: false, flattenMaps: true, flattenObjectIds: true }): ObjectIdToString<Omit<FlattenMaps<Require_id<DocType>>, '__v'>>;
345
+ toObject(options: ToObjectOptions & { versionKey: false, flattenObjectIds: true }): ObjectIdToString<Omit<Require_id<DocType>, '__v'>>;
346
+ toObject(options: ToObjectOptions & { versionKey: false, flattenMaps: true }): Omit<FlattenMaps<Require_id<DocType>>, '__v'>;
347
+ toObject(options: ToObjectOptions & { versionKey: false }): Omit<Require_id<DocType>, '__v'>;
348
+
349
+ // Handle virtuals: true
350
+ toObject(options: ToObjectOptions & { virtuals: true }): Require_id<DocType & TVirtuals>;
351
+
352
+ // Default - no special options
353
+ toObject(options?: ToObjectOptions): Default__v<Require_id<DocType>, TSchemaOptions>;
354
+
286
355
  toObject<T>(options?: ToObjectOptions): Default__v<Require_id<T>, ResolveSchemaOptions<TSchemaOptions>>;
287
356
 
288
357
  /** Clears the modified state on the specified path. */