@mikro-orm/mongodb 7.0.0-dev.29 → 7.0.0-dev.291

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.
package/MongoDriver.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { ObjectId } from 'mongodb';
2
- import { DatabaseDriver, EntityManagerType, ReferenceKind, Utils, } from '@mikro-orm/core';
2
+ import { DatabaseDriver, EntityManagerType, PolymorphicRef, ReferenceKind, Utils, } from '@mikro-orm/core';
3
3
  import { MongoConnection } from './MongoConnection.js';
4
4
  import { MongoPlatform } from './MongoPlatform.js';
5
5
  import { MongoEntityManager } from './MongoEntityManager.js';
6
+ import { MongoMikroORM } from './MongoMikroORM.js';
6
7
  export class MongoDriver extends DatabaseDriver {
7
8
  [EntityManagerType];
8
9
  connection = new MongoConnection(this.config);
@@ -14,6 +15,27 @@ export class MongoDriver extends DatabaseDriver {
14
15
  const EntityManagerClass = this.config.get('entityManager', MongoEntityManager);
15
16
  return new EntityManagerClass(this.config, this, this.metadata, useContext);
16
17
  }
18
+ async *stream(entityName, where, options) {
19
+ if (this.metadata.find(entityName)?.virtual) {
20
+ yield* this.streamVirtual(entityName, where, options);
21
+ return;
22
+ }
23
+ const fields = this.buildFields(entityName, options.populate || [], options.fields, options.exclude);
24
+ where = this.renameFields(entityName, where, true);
25
+ const orderBy = Utils.asArray(options.orderBy).map(orderBy => this.renameFields(entityName, orderBy, true));
26
+ const res = this.getConnection('read').stream(entityName, where, {
27
+ orderBy, limit: options.limit, offset: options.offset, fields, ctx: options.ctx,
28
+ ...this.buildQueryOptions(options),
29
+ });
30
+ for await (const item of res) {
31
+ if (options.rawResults) {
32
+ yield item;
33
+ }
34
+ else {
35
+ yield this.mapResult(item, this.metadata.find(entityName));
36
+ }
37
+ }
38
+ }
17
39
  async find(entityName, where, options = {}) {
18
40
  if (this.metadata.find(entityName)?.virtual) {
19
41
  return this.findVirtual(entityName, where, options);
@@ -36,14 +58,20 @@ export class MongoDriver extends DatabaseDriver {
36
58
  const { orderBy: newOrderBy, where: newWhere } = this.processCursorOptions(meta, options, options.orderBy);
37
59
  const newWhereConverted = this.renameFields(entityName, newWhere, true);
38
60
  const orderBy = Utils.asArray(newOrderBy).map(order => this.renameFields(entityName, order, true));
39
- const res = await this.rethrow(this.getConnection('read').find(entityName, andWhere(where, newWhereConverted), orderBy, options.limit, options.offset, fields, options.ctx, options.logging));
61
+ const res = await this.rethrow(this.getConnection('read').find(entityName, andWhere(where, newWhereConverted), {
62
+ orderBy, limit: options.limit, offset: options.offset, fields, ctx: options.ctx, loggerContext: options.logging,
63
+ ...this.buildQueryOptions(options),
64
+ }));
40
65
  if (isCursorPagination && !first && !!last) {
41
66
  res.reverse();
42
67
  }
43
68
  return res.map(r => this.mapResult(r, this.metadata.find(entityName)));
44
69
  }
45
70
  const orderBy = Utils.asArray(options.orderBy).map(orderBy => this.renameFields(entityName, orderBy, true));
46
- const res = await this.rethrow(this.getConnection('read').find(entityName, where, orderBy, options.limit, options.offset, fields, options.ctx));
71
+ const res = await this.rethrow(this.getConnection('read').find(entityName, where, {
72
+ orderBy, limit: options.limit, offset: options.offset, fields, ctx: options.ctx,
73
+ ...this.buildQueryOptions(options),
74
+ }));
47
75
  return res.map(r => this.mapResult(r, this.metadata.find(entityName)));
48
76
  }
49
77
  async findOne(entityName, where, options = { populate: [], orderBy: {} }) {
@@ -58,7 +86,10 @@ export class MongoDriver extends DatabaseDriver {
58
86
  const fields = this.buildFields(entityName, options.populate || [], options.fields, options.exclude);
59
87
  where = this.renameFields(entityName, where, true);
60
88
  const orderBy = Utils.asArray(options.orderBy).map(orderBy => this.renameFields(entityName, orderBy, true));
61
- const res = await this.rethrow(this.getConnection('read').find(entityName, where, orderBy, 1, undefined, fields, options.ctx, options.logging));
89
+ const res = await this.rethrow(this.getConnection('read').find(entityName, where, {
90
+ orderBy, limit: 1, fields, ctx: options.ctx, loggerContext: options.logging,
91
+ ...this.buildQueryOptions(options),
92
+ }));
62
93
  return this.mapResult(res[0], this.metadata.find(entityName));
63
94
  }
64
95
  async findVirtual(entityName, where, options) {
@@ -70,13 +101,29 @@ export class MongoDriver extends DatabaseDriver {
70
101
  /* v8 ignore next */
71
102
  return super.findVirtual(entityName, where, options);
72
103
  }
73
- async count(entityName, where, options = {}, ctx) {
74
- /* v8 ignore next 3 */
104
+ async *streamVirtual(entityName, where, options) {
105
+ const meta = this.metadata.find(entityName);
106
+ if (meta.expression instanceof Function) {
107
+ const em = this.createEntityManager();
108
+ const stream = await meta.expression(em, where, options, true);
109
+ yield* stream;
110
+ return;
111
+ }
112
+ /* v8 ignore next */
113
+ return super.findVirtual(entityName, where, options);
114
+ }
115
+ async count(entityName, where, options = {}) {
116
+ /* v8 ignore next */
75
117
  if (this.metadata.find(entityName)?.virtual) {
76
118
  return this.countVirtual(entityName, where, options);
77
119
  }
78
120
  where = this.renameFields(entityName, where, true);
79
- return this.rethrow(this.getConnection('read').countDocuments(entityName, where, ctx));
121
+ const queryOpts = this.buildQueryOptions(options);
122
+ return this.rethrow(this.getConnection('read').countDocuments(entityName, where, {
123
+ ctx: options.ctx,
124
+ loggerContext: options.logging,
125
+ ...queryOpts,
126
+ }));
80
127
  }
81
128
  async nativeInsert(entityName, data, options = {}) {
82
129
  this.handleVersionProperty(entityName, data);
@@ -165,10 +212,38 @@ export class MongoDriver extends DatabaseDriver {
165
212
  async aggregate(entityName, pipeline, ctx) {
166
213
  return this.rethrow(this.getConnection('read').aggregate(entityName, pipeline, ctx));
167
214
  }
215
+ async *streamAggregate(entityName, pipeline, ctx) {
216
+ yield* this.getConnection('read').streamAggregate(entityName, pipeline, ctx);
217
+ }
168
218
  getPlatform() {
169
219
  return this.platform;
170
220
  }
171
- renameFields(entityName, data, dotPaths = false, object) {
221
+ buildQueryOptions(options) {
222
+ if (options.collation != null && typeof options.collation === 'string') {
223
+ throw new Error('Collation option for MongoDB must be a CollationOptions object (e.g. { locale: \'en\' }). Use a string only with SQL drivers.');
224
+ }
225
+ const ret = {};
226
+ if (options.collation) {
227
+ ret.collation = options.collation;
228
+ }
229
+ if (options.indexHint != null) {
230
+ ret.indexHint = options.indexHint;
231
+ }
232
+ if (options.maxTimeMS != null) {
233
+ ret.maxTimeMS = options.maxTimeMS;
234
+ }
235
+ if (options.allowDiskUse != null) {
236
+ ret.allowDiskUse = options.allowDiskUse;
237
+ }
238
+ return ret;
239
+ }
240
+ renameFields(entityName, data, dotPaths = false, object, root = true) {
241
+ if (data == null && root) {
242
+ return {};
243
+ }
244
+ if (typeof data !== 'object' || data === null) {
245
+ return data;
246
+ }
172
247
  // copy to new variable to prevent changing the T type or doing as unknown casts
173
248
  const copiedData = Object.assign({}, data); // copy first
174
249
  const meta = this.metadata.find(entityName);
@@ -184,7 +259,7 @@ export class MongoDriver extends DatabaseDriver {
184
259
  for (let i = 0; i < copiedData.$and.length; i++) {
185
260
  const and = copiedData.$and[i];
186
261
  if ('$fulltext' in and) {
187
- /* v8 ignore next 3 */
262
+ /* v8 ignore next */
188
263
  if ('$fulltext' in copiedData) {
189
264
  throw new Error('Cannot merge multiple $fulltext conditions to top level of the query object.');
190
265
  }
@@ -204,13 +279,12 @@ export class MongoDriver extends DatabaseDriver {
204
279
  throw new Error('Full text search is only supported on the top level of the query object.');
205
280
  }
206
281
  Utils.keys(copiedData).forEach(k => {
207
- if (Utils.isGroupOperator(k)) {
208
- /* v8 ignore next 5 */
282
+ if (Utils.isOperator(k)) {
209
283
  if (Array.isArray(copiedData[k])) {
210
- copiedData[k] = copiedData[k].map(v => this.renameFields(entityName, v));
284
+ copiedData[k] = copiedData[k].map(v => this.renameFields(entityName, v, dotPaths, object, false));
211
285
  }
212
286
  else {
213
- copiedData[k] = this.renameFields(entityName, copiedData[k]);
287
+ copiedData[k] = this.renameFields(entityName, copiedData[k], dotPaths, object, false);
214
288
  }
215
289
  return;
216
290
  }
@@ -218,23 +292,44 @@ export class MongoDriver extends DatabaseDriver {
218
292
  const prop = meta.properties[k];
219
293
  let isObjectId = false;
220
294
  if (prop.kind === ReferenceKind.SCALAR) {
221
- isObjectId = prop.type.toLowerCase() === 'objectid';
295
+ isObjectId = prop.type === 'ObjectId';
222
296
  }
223
297
  else if (prop.kind === ReferenceKind.EMBEDDED) {
224
298
  if (copiedData[prop.name] == null) {
225
299
  return;
226
300
  }
227
301
  if (prop.array && Array.isArray(copiedData[prop.name])) {
228
- copiedData[prop.name] = copiedData[prop.name].map((item) => this.renameFields(prop.type, item, dotPaths, true));
302
+ copiedData[prop.name] = copiedData[prop.name].map((item) => this.renameFields(prop.targetMeta.class, item, dotPaths, true, false));
229
303
  }
230
304
  else {
231
- copiedData[prop.name] = this.renameFields(prop.type, copiedData[prop.name], dotPaths, prop.object || object);
305
+ copiedData[prop.name] = this.renameFields(prop.targetMeta.class, copiedData[prop.name], dotPaths, prop.object || object, false);
232
306
  }
233
307
  }
308
+ else if (prop.polymorphic && prop.fieldNames?.length >= 2) {
309
+ // Polymorphic M:1: split into discriminator + FK fields
310
+ const value = copiedData[k];
311
+ delete copiedData[k];
312
+ if (value instanceof PolymorphicRef) {
313
+ copiedData[prop.fieldNames[0]] = value.discriminator;
314
+ const idField = prop.fieldNames[1];
315
+ const targetMeta = this.metadata.find(prop.discriminatorMap[value.discriminator]);
316
+ const hasObjectId = targetMeta && targetMeta.properties[targetMeta.primaryKeys[0]]?.type === 'ObjectId';
317
+ copiedData[idField] = hasObjectId ? this.convertObjectIds(value.id) : value.id;
318
+ }
319
+ else if (Array.isArray(value)) {
320
+ // Tuple format: [discriminator, id]
321
+ copiedData[prop.fieldNames[0]] = value[0];
322
+ copiedData[prop.fieldNames[1]] = value[1] != null ? this.convertObjectIds(value[1]) : value[1];
323
+ }
324
+ else if (value == null) {
325
+ prop.fieldNames.forEach(f => copiedData[f] = null);
326
+ }
327
+ return;
328
+ }
234
329
  else {
235
- const meta2 = this.metadata.find(prop.type);
330
+ const meta2 = this.metadata.find(prop.targetMeta.class);
236
331
  const pk = meta2.properties[meta2.primaryKeys[0]];
237
- isObjectId = pk.type.toLowerCase() === 'objectid';
332
+ isObjectId = pk.type === 'ObjectId';
238
333
  }
239
334
  if (isObjectId) {
240
335
  copiedData[k] = this.convertObjectIds(copiedData[k]);
@@ -253,7 +348,7 @@ export class MongoDriver extends DatabaseDriver {
253
348
  if (data instanceof ObjectId) {
254
349
  return data;
255
350
  }
256
- if (Utils.isString(data) && data.match(/^[0-9a-f]{24}$/i)) {
351
+ if (typeof data === 'string' && data.match(/^[0-9a-f]{24}$/i)) {
257
352
  return new ObjectId(data);
258
353
  }
259
354
  if (Array.isArray(data)) {
@@ -268,21 +363,18 @@ export class MongoDriver extends DatabaseDriver {
268
363
  }
269
364
  buildFilterById(entityName, id) {
270
365
  const meta = this.metadata.find(entityName);
271
- if (meta.properties[meta.primaryKeys[0]].type.toLowerCase() === 'objectid') {
366
+ if (meta.properties[meta.primaryKeys[0]].type === 'ObjectId') {
272
367
  return { _id: new ObjectId(id) };
273
368
  }
274
369
  return { _id: id };
275
370
  }
276
371
  buildFields(entityName, populate, fields, exclude) {
277
- const meta = this.metadata.find(entityName);
278
- if (!meta) {
279
- return fields;
280
- }
281
- const lazyProps = meta.props.filter(prop => prop.lazy && !populate.some(p => p.field === prop.name || p.all));
372
+ const meta = this.metadata.get(entityName);
373
+ const lazyProps = meta.props.filter(prop => prop.lazy && !populate.some(p => this.isPopulated(meta, prop, p)));
282
374
  const ret = [];
283
375
  if (fields) {
284
376
  for (let field of fields) {
285
- /* v8 ignore next 3 */
377
+ /* v8 ignore next */
286
378
  if (Utils.isPlainObject(field)) {
287
379
  continue;
288
380
  }
@@ -290,7 +382,7 @@ export class MongoDriver extends DatabaseDriver {
290
382
  field = field.toString().substring(0, field.toString().indexOf('.'));
291
383
  }
292
384
  let prop = meta.properties[field];
293
- /* v8 ignore start */
385
+ /* v8 ignore next */
294
386
  if (prop) {
295
387
  if (!prop.fieldNames) {
296
388
  continue;
@@ -305,7 +397,6 @@ export class MongoDriver extends DatabaseDriver {
305
397
  else {
306
398
  ret.push(field);
307
399
  }
308
- /* v8 ignore stop */
309
400
  }
310
401
  ret.unshift(...meta.primaryKeys.filter(pk => !fields.includes(pk)));
311
402
  }
@@ -328,4 +419,8 @@ export class MongoDriver extends DatabaseDriver {
328
419
  data[versionProperty.name] ??= update ? { $inc: 1 } : 1;
329
420
  }
330
421
  }
422
+ /** @inheritDoc */
423
+ getORMClass() {
424
+ return MongoMikroORM;
425
+ }
331
426
  }
@@ -1,4 +1,4 @@
1
- import { EntityManager, type EntityName, type EntityRepository, type GetRepository, type TransactionOptions } from '@mikro-orm/core';
1
+ import { EntityManager, type EntityName, type EntityRepository, type GetRepository, type TransactionOptions, type StreamOptions, type Loaded } from '@mikro-orm/core';
2
2
  import type { Collection, Document, TransactionOptions as MongoTransactionOptions } from 'mongodb';
3
3
  import type { MongoDriver } from './MongoDriver.js';
4
4
  import type { MongoEntityRepository } from './MongoEntityRepository.js';
@@ -9,8 +9,16 @@ export declare class MongoEntityManager<Driver extends MongoDriver = MongoDriver
9
9
  /**
10
10
  * Shortcut to driver's aggregate method. Available in MongoDriver only.
11
11
  */
12
- aggregate(entityName: EntityName<any>, pipeline: any[]): Promise<any[]>;
13
- getCollection<T extends Document>(entityName: EntityName<T>): Collection<T>;
12
+ aggregate(entityName: EntityName, pipeline: any[]): Promise<any[]>;
13
+ /**
14
+ * Shortcut to driver's aggregate method. Returns a stream. Available in MongoDriver only.
15
+ */
16
+ streamAggregate<T extends object>(entityName: EntityName, pipeline: any[]): AsyncIterableIterator<T>;
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ stream<Entity extends object, Hint extends string = never, Fields extends string = '*', Excludes extends string = never>(entityName: EntityName<Entity>, options?: StreamOptions<NoInfer<Entity>, Hint, Fields, Excludes>): AsyncIterableIterator<Loaded<Entity, Hint, Fields, Excludes>>;
21
+ getCollection<T extends Document>(entityOrCollectionName: EntityName<T> | string): Collection<T>;
14
22
  /**
15
23
  * @inheritDoc
16
24
  */
@@ -1,4 +1,4 @@
1
- import { EntityManager, Utils } from '@mikro-orm/core';
1
+ import { EntityManager, Utils, } from '@mikro-orm/core';
2
2
  /**
3
3
  * @inheritDoc
4
4
  */
@@ -7,11 +7,25 @@ export class MongoEntityManager extends EntityManager {
7
7
  * Shortcut to driver's aggregate method. Available in MongoDriver only.
8
8
  */
9
9
  async aggregate(entityName, pipeline) {
10
- entityName = Utils.className(entityName);
11
- return this.getDriver().aggregate(entityName, pipeline);
10
+ return this.getDriver().aggregate(entityName, pipeline, this.getTransactionContext());
12
11
  }
13
- getCollection(entityName) {
14
- return this.getConnection().getCollection(entityName);
12
+ /**
13
+ * Shortcut to driver's aggregate method. Returns a stream. Available in MongoDriver only.
14
+ */
15
+ async *streamAggregate(entityName, pipeline) {
16
+ yield* this.getDriver().streamAggregate(entityName, pipeline, this.getTransactionContext());
17
+ }
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+ async *stream(entityName, options = {}) {
22
+ if (!Utils.isEmpty(options.populate)) {
23
+ throw new Error('Populate option is not supported when streaming results in MongoDB');
24
+ }
25
+ yield* super.stream(entityName, options);
26
+ }
27
+ getCollection(entityOrCollectionName) {
28
+ return this.getConnection().getCollection(entityOrCollectionName);
15
29
  }
16
30
  /**
17
31
  * @inheritDoc
@@ -1,7 +1,7 @@
1
1
  import { ExceptionConverter, type Dictionary, type DriverException } from '@mikro-orm/core';
2
2
  export declare class MongoExceptionConverter extends ExceptionConverter {
3
3
  /**
4
- * @link https://gist.github.com/rluvaton/a97a8da46ab6541a3e5702e83b9d357b
4
+ * @see https://gist.github.com/rluvaton/a97a8da46ab6541a3e5702e83b9d357b
5
5
  */
6
6
  convertException(exception: Error & Dictionary): DriverException;
7
7
  }
@@ -1,9 +1,9 @@
1
1
  import { UniqueConstraintViolationException, ExceptionConverter, TableExistsException } from '@mikro-orm/core';
2
- /* v8 ignore start */
3
2
  export class MongoExceptionConverter extends ExceptionConverter {
4
3
  /**
5
- * @link https://gist.github.com/rluvaton/a97a8da46ab6541a3e5702e83b9d357b
4
+ * @see https://gist.github.com/rluvaton/a97a8da46ab6541a3e5702e83b9d357b
6
5
  */
6
+ /* v8 ignore next */
7
7
  convertException(exception) {
8
8
  switch (exception.code) {
9
9
  case 48:
@@ -14,4 +14,3 @@ export class MongoExceptionConverter extends ExceptionConverter {
14
14
  return super.convertException(exception);
15
15
  }
16
16
  }
17
- /* v8 ignore stop */
@@ -1,19 +1,22 @@
1
- import { MikroORM, type Options, type IDatabaseDriver, type EntityManager, type EntityManagerType } from '@mikro-orm/core';
1
+ import { type AnyEntity, type EntityClass, type EntitySchema, MikroORM, type Options, type IDatabaseDriver, type EntityManager, type EntityManagerType, type IMigrator } from '@mikro-orm/core';
2
2
  import { MongoDriver } from './MongoDriver.js';
3
3
  import type { MongoEntityManager } from './MongoEntityManager.js';
4
+ export type MongoOptions<EM extends MongoEntityManager = MongoEntityManager, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> = Options<MongoDriver, EM, Entities>;
5
+ export declare function defineMongoConfig<EM extends MongoEntityManager = MongoEntityManager, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: MongoOptions<EM, Entities>): Options<MongoDriver, EM, Entities>;
4
6
  /**
5
7
  * @inheritDoc
6
8
  */
7
- export declare class MongoMikroORM<EM extends EntityManager = MongoEntityManager> extends MikroORM<MongoDriver, EM> {
8
- private static DRIVER;
9
+ export declare class MongoMikroORM<EM extends MongoEntityManager = MongoEntityManager, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> extends MikroORM<MongoDriver, EM, Entities> {
9
10
  /**
10
11
  * @inheritDoc
11
12
  */
12
- static init<D extends IDatabaseDriver = MongoDriver, EM extends EntityManager = D[typeof EntityManagerType] & EntityManager>(options?: Options<D, EM>): Promise<MikroORM<D, EM>>;
13
+ static init<D extends IDatabaseDriver = MongoDriver, EM extends EntityManager<D> = D[typeof EntityManagerType] & EntityManager<D>, Entities extends (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: Options<D, EM, Entities>): Promise<MikroORM<D, EM, Entities>>;
13
14
  /**
14
15
  * @inheritDoc
15
16
  */
16
- static initSync<D extends IDatabaseDriver = MongoDriver, EM extends EntityManager = D[typeof EntityManagerType] & EntityManager>(options: Options<D, EM>): MikroORM<D, EM>;
17
+ constructor(options: Options<MongoDriver, EM, Entities>);
18
+ /**
19
+ * Gets the Migrator.
20
+ */
21
+ get migrator(): IMigrator;
17
22
  }
18
- export type MongoOptions = Options<MongoDriver>;
19
- export declare function defineMongoConfig(options: MongoOptions): Options<MongoDriver, MongoEntityManager<MongoDriver> & EntityManager<IDatabaseDriver<import("@mikro-orm/core").Connection>>>;
package/MongoMikroORM.js CHANGED
@@ -1,24 +1,28 @@
1
1
  import { defineConfig, MikroORM, } from '@mikro-orm/core';
2
2
  import { MongoDriver } from './MongoDriver.js';
3
+ export function defineMongoConfig(options) {
4
+ return defineConfig({ driver: MongoDriver, ...options });
5
+ }
3
6
  /**
4
7
  * @inheritDoc
5
8
  */
6
9
  export class MongoMikroORM extends MikroORM {
7
- static DRIVER = MongoDriver;
8
10
  /**
9
11
  * @inheritDoc
10
12
  */
11
13
  static async init(options) {
12
- return super.init(options);
14
+ return super.init(defineMongoConfig(options));
13
15
  }
14
16
  /**
15
17
  * @inheritDoc
16
18
  */
17
- static initSync(options) {
18
- return super.initSync(options);
19
+ constructor(options) {
20
+ super(defineMongoConfig(options));
21
+ }
22
+ /**
23
+ * Gets the Migrator.
24
+ */
25
+ get migrator() {
26
+ return this.driver.getPlatform().getExtension('Migrator', '@mikro-orm/migrator', '@mikro-orm/migrations-mongodb', this.em);
19
27
  }
20
- }
21
- /* v8 ignore next 3 */
22
- export function defineMongoConfig(options) {
23
- return defineConfig({ driver: MongoDriver, ...options });
24
28
  }
@@ -1,5 +1,5 @@
1
1
  import { ObjectId } from 'mongodb';
2
- import { Platform, type IPrimaryKey, type Primary, type NamingStrategy, type Constructor, type EntityRepository, type EntityProperty, type PopulateOptions, type EntityMetadata, type IDatabaseDriver, type EntityManager, type Configuration, type MikroORM } from '@mikro-orm/core';
2
+ import { Platform, type IPrimaryKey, type Primary, type NamingStrategy, type Constructor, type EntityRepository, type EntityProperty, type PopulateOptions, type EntityMetadata, type IDatabaseDriver, type EntityManager, type Configuration, type MikroORM, type TransformContext } from '@mikro-orm/core';
3
3
  import { MongoExceptionConverter } from './MongoExceptionConverter.js';
4
4
  import { MongoSchemaGenerator } from './MongoSchemaGenerator.js';
5
5
  export declare class MongoPlatform extends Platform {
@@ -16,12 +16,10 @@ export declare class MongoPlatform extends Platform {
16
16
  getSchemaGenerator(driver: IDatabaseDriver, em?: EntityManager): MongoSchemaGenerator;
17
17
  normalizePrimaryKey<T extends number | string = number | string>(data: Primary<T> | IPrimaryKey | ObjectId): T;
18
18
  denormalizePrimaryKey(data: number | string): IPrimaryKey;
19
- getSerializedPrimaryKeyField(field: string): string;
20
- usesDifferentSerializedPrimaryKey(): boolean;
21
19
  usesImplicitTransactions(): boolean;
22
20
  convertsJsonAutomatically(): boolean;
23
21
  convertJsonToDatabaseValue(value: unknown): unknown;
24
- convertJsonToJSValue(value: unknown, prop: EntityProperty): unknown;
22
+ convertJsonToJSValue(value: unknown, context?: TransformContext): unknown;
25
23
  marshallArray(values: string[]): string;
26
24
  cloneEmbeddable<T>(data: T): T;
27
25
  shouldHaveColumn<T>(prop: EntityProperty<T>, populate: PopulateOptions<T>[], exclude?: string[]): boolean;
package/MongoPlatform.js CHANGED
@@ -32,24 +32,18 @@ export class MongoPlatform extends Platform {
32
32
  /* v8 ignore next */
33
33
  return super.getExtension(extensionName, extensionKey, moduleName, em);
34
34
  }
35
- /* v8 ignore next 3: kept for type inference only */
35
+ /* v8 ignore next: kept for type inference only */
36
36
  getSchemaGenerator(driver, em) {
37
37
  return new MongoSchemaGenerator(em ?? driver);
38
38
  }
39
39
  normalizePrimaryKey(data) {
40
- if (Utils.isObjectID(data)) {
40
+ if (Utils.isObject(data) && data.constructor?.name === 'ObjectId') {
41
41
  return data.toHexString();
42
42
  }
43
43
  return data;
44
44
  }
45
45
  denormalizePrimaryKey(data) {
46
- return new ObjectId(data);
47
- }
48
- getSerializedPrimaryKeyField(field) {
49
- return 'id';
50
- }
51
- usesDifferentSerializedPrimaryKey() {
52
- return true;
46
+ return new ObjectId('' + data);
53
47
  }
54
48
  usesImplicitTransactions() {
55
49
  return false;
@@ -60,7 +54,7 @@ export class MongoPlatform extends Platform {
60
54
  convertJsonToDatabaseValue(value) {
61
55
  return Utils.copy(value);
62
56
  }
63
- convertJsonToJSValue(value, prop) {
57
+ convertJsonToJSValue(value, context) {
64
58
  return value;
65
59
  }
66
60
  marshallArray(values) {
@@ -78,6 +72,9 @@ export class MongoPlatform extends Platform {
78
72
  return prop.kind === ReferenceKind.MANY_TO_MANY && prop.owner;
79
73
  }
80
74
  validateMetadata(meta) {
75
+ if (meta.inheritanceType === 'tpt') {
76
+ throw MetadataError.tptNotSupportedByDriver(meta);
77
+ }
81
78
  const pk = meta.getPrimaryProps()[0];
82
79
  if (pk && pk.fieldNames?.[0] !== '_id') {
83
80
  throw MetadataError.invalidPrimaryKey(meta, pk, '_id');
@@ -1,14 +1,15 @@
1
- import { AbstractSchemaGenerator, type CreateSchemaOptions, type MikroORM } from '@mikro-orm/core';
1
+ import { type CreateSchemaOptions, type MikroORM } from '@mikro-orm/core';
2
+ import { AbstractSchemaGenerator } from '@mikro-orm/core/schema';
2
3
  import type { MongoDriver } from './MongoDriver.js';
3
4
  export declare class MongoSchemaGenerator extends AbstractSchemaGenerator<MongoDriver> {
4
5
  static register(orm: MikroORM): void;
5
- createSchema(options?: MongoCreateSchemaOptions): Promise<void>;
6
- dropSchema(options?: {
6
+ create(options?: MongoCreateSchemaOptions): Promise<void>;
7
+ drop(options?: {
7
8
  dropMigrationsTable?: boolean;
8
9
  }): Promise<void>;
9
- updateSchema(options?: MongoCreateSchemaOptions): Promise<void>;
10
+ update(options?: MongoCreateSchemaOptions): Promise<void>;
10
11
  ensureDatabase(): Promise<boolean>;
11
- refreshDatabase(options?: MongoCreateSchemaOptions): Promise<void>;
12
+ refresh(options?: MongoCreateSchemaOptions): Promise<void>;
12
13
  dropIndexes(options?: {
13
14
  skipIndexes?: {
14
15
  collection: string;
@@ -17,7 +18,9 @@ export declare class MongoSchemaGenerator extends AbstractSchemaGenerator<MongoD
17
18
  collectionsWithFailedIndexes?: string[];
18
19
  }): Promise<void>;
19
20
  ensureIndexes(options?: EnsureIndexesOptions): Promise<void>;
21
+ private mapIndexProperties;
20
22
  private createIndexes;
23
+ private executeQuery;
21
24
  private createUniqueIndexes;
22
25
  private createPropertyIndexes;
23
26
  }