@mikro-orm/mongodb 7.0.0-dev.3 → 7.0.0-dev.300
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/MongoConnection.d.ts +37 -15
- package/MongoConnection.js +163 -92
- package/MongoDriver.d.ts +22 -12
- package/MongoDriver.js +147 -31
- package/MongoEntityManager.d.ts +11 -3
- package/MongoEntityManager.js +19 -5
- package/MongoExceptionConverter.d.ts +1 -1
- package/MongoExceptionConverter.js +2 -3
- package/MongoMikroORM.d.ts +10 -7
- package/MongoMikroORM.js +12 -8
- package/MongoPlatform.d.ts +2 -4
- package/MongoPlatform.js +7 -10
- package/MongoSchemaGenerator.d.ts +8 -5
- package/MongoSchemaGenerator.js +61 -32
- package/README.md +3 -2
- package/index.d.ts +1 -1
- package/package.json +6 -6
- package/tsconfig.build.tsbuildinfo +1 -0
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),
|
|
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,
|
|
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,
|
|
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,20 +101,40 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
70
101
|
/* v8 ignore next */
|
|
71
102
|
return super.findVirtual(entityName, where, options);
|
|
72
103
|
}
|
|
73
|
-
async
|
|
74
|
-
|
|
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
|
-
|
|
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 = {}) {
|
|
129
|
+
this.handleVersionProperty(entityName, data);
|
|
82
130
|
data = this.renameFields(entityName, data);
|
|
83
131
|
return this.rethrow(this.getConnection('write').insertOne(entityName, data, options.ctx));
|
|
84
132
|
}
|
|
85
133
|
async nativeInsertMany(entityName, data, options = {}) {
|
|
86
|
-
data = data.map(
|
|
134
|
+
data = data.map(item => {
|
|
135
|
+
this.handleVersionProperty(entityName, item);
|
|
136
|
+
return this.renameFields(entityName, item);
|
|
137
|
+
});
|
|
87
138
|
const meta = this.metadata.find(entityName);
|
|
88
139
|
/* v8 ignore next */
|
|
89
140
|
const pk = meta?.getPrimaryProps()[0].fieldNames[0] ?? '_id';
|
|
@@ -95,8 +146,9 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
95
146
|
if (Utils.isPrimaryKey(where)) {
|
|
96
147
|
where = this.buildFilterById(entityName, where);
|
|
97
148
|
}
|
|
98
|
-
|
|
149
|
+
this.handleVersionProperty(entityName, data, true);
|
|
99
150
|
data = this.renameFields(entityName, data);
|
|
151
|
+
where = this.renameFields(entityName, where, true);
|
|
100
152
|
options = { ...options };
|
|
101
153
|
const meta = this.metadata.find(entityName);
|
|
102
154
|
/* v8 ignore next */
|
|
@@ -119,7 +171,10 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
119
171
|
}
|
|
120
172
|
return row;
|
|
121
173
|
});
|
|
122
|
-
data = data.map(row =>
|
|
174
|
+
data = data.map(row => {
|
|
175
|
+
this.handleVersionProperty(entityName, row, true);
|
|
176
|
+
return this.renameFields(entityName, row);
|
|
177
|
+
});
|
|
123
178
|
options = { ...options };
|
|
124
179
|
const meta = this.metadata.find(entityName);
|
|
125
180
|
/* v8 ignore next */
|
|
@@ -157,10 +212,38 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
157
212
|
async aggregate(entityName, pipeline, ctx) {
|
|
158
213
|
return this.rethrow(this.getConnection('read').aggregate(entityName, pipeline, ctx));
|
|
159
214
|
}
|
|
215
|
+
async *streamAggregate(entityName, pipeline, ctx) {
|
|
216
|
+
yield* this.getConnection('read').streamAggregate(entityName, pipeline, ctx);
|
|
217
|
+
}
|
|
160
218
|
getPlatform() {
|
|
161
219
|
return this.platform;
|
|
162
220
|
}
|
|
163
|
-
|
|
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
|
+
}
|
|
164
247
|
// copy to new variable to prevent changing the T type or doing as unknown casts
|
|
165
248
|
const copiedData = Object.assign({}, data); // copy first
|
|
166
249
|
const meta = this.metadata.find(entityName);
|
|
@@ -176,7 +259,7 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
176
259
|
for (let i = 0; i < copiedData.$and.length; i++) {
|
|
177
260
|
const and = copiedData.$and[i];
|
|
178
261
|
if ('$fulltext' in and) {
|
|
179
|
-
/* v8 ignore next
|
|
262
|
+
/* v8 ignore next */
|
|
180
263
|
if ('$fulltext' in copiedData) {
|
|
181
264
|
throw new Error('Cannot merge multiple $fulltext conditions to top level of the query object.');
|
|
182
265
|
}
|
|
@@ -196,13 +279,12 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
196
279
|
throw new Error('Full text search is only supported on the top level of the query object.');
|
|
197
280
|
}
|
|
198
281
|
Utils.keys(copiedData).forEach(k => {
|
|
199
|
-
if (Utils.
|
|
200
|
-
/* v8 ignore next 5 */
|
|
282
|
+
if (Utils.isOperator(k)) {
|
|
201
283
|
if (Array.isArray(copiedData[k])) {
|
|
202
|
-
copiedData[k] = copiedData[k].map(v => this.renameFields(entityName, v));
|
|
284
|
+
copiedData[k] = copiedData[k].map(v => this.renameFields(entityName, v, dotPaths, object, false));
|
|
203
285
|
}
|
|
204
286
|
else {
|
|
205
|
-
copiedData[k] = this.renameFields(entityName, copiedData[k]);
|
|
287
|
+
copiedData[k] = this.renameFields(entityName, copiedData[k], dotPaths, object, false);
|
|
206
288
|
}
|
|
207
289
|
return;
|
|
208
290
|
}
|
|
@@ -210,23 +292,44 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
210
292
|
const prop = meta.properties[k];
|
|
211
293
|
let isObjectId = false;
|
|
212
294
|
if (prop.kind === ReferenceKind.SCALAR) {
|
|
213
|
-
isObjectId = prop.type
|
|
295
|
+
isObjectId = prop.type === 'ObjectId';
|
|
214
296
|
}
|
|
215
297
|
else if (prop.kind === ReferenceKind.EMBEDDED) {
|
|
216
298
|
if (copiedData[prop.name] == null) {
|
|
217
299
|
return;
|
|
218
300
|
}
|
|
219
301
|
if (prop.array && Array.isArray(copiedData[prop.name])) {
|
|
220
|
-
copiedData[prop.name] = copiedData[prop.name].map((item) => this.renameFields(prop.
|
|
302
|
+
copiedData[prop.name] = copiedData[prop.name].map((item) => this.renameFields(prop.targetMeta.class, item, dotPaths, true, false));
|
|
221
303
|
}
|
|
222
304
|
else {
|
|
223
|
-
copiedData[prop.name] = this.renameFields(prop.
|
|
305
|
+
copiedData[prop.name] = this.renameFields(prop.targetMeta.class, copiedData[prop.name], dotPaths, prop.object || object, false);
|
|
306
|
+
}
|
|
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);
|
|
224
326
|
}
|
|
327
|
+
return;
|
|
225
328
|
}
|
|
226
329
|
else {
|
|
227
|
-
const meta2 = this.metadata.find(prop.
|
|
330
|
+
const meta2 = this.metadata.find(prop.targetMeta.class);
|
|
228
331
|
const pk = meta2.properties[meta2.primaryKeys[0]];
|
|
229
|
-
isObjectId = pk.type
|
|
332
|
+
isObjectId = pk.type === 'ObjectId';
|
|
230
333
|
}
|
|
231
334
|
if (isObjectId) {
|
|
232
335
|
copiedData[k] = this.convertObjectIds(copiedData[k]);
|
|
@@ -245,7 +348,7 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
245
348
|
if (data instanceof ObjectId) {
|
|
246
349
|
return data;
|
|
247
350
|
}
|
|
248
|
-
if (
|
|
351
|
+
if (typeof data === 'string' && data.match(/^[0-9a-f]{24}$/i)) {
|
|
249
352
|
return new ObjectId(data);
|
|
250
353
|
}
|
|
251
354
|
if (Array.isArray(data)) {
|
|
@@ -260,21 +363,18 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
260
363
|
}
|
|
261
364
|
buildFilterById(entityName, id) {
|
|
262
365
|
const meta = this.metadata.find(entityName);
|
|
263
|
-
if (meta.properties[meta.primaryKeys[0]].type
|
|
366
|
+
if (meta.properties[meta.primaryKeys[0]].type === 'ObjectId') {
|
|
264
367
|
return { _id: new ObjectId(id) };
|
|
265
368
|
}
|
|
266
369
|
return { _id: id };
|
|
267
370
|
}
|
|
268
371
|
buildFields(entityName, populate, fields, exclude) {
|
|
269
|
-
const meta = this.metadata.
|
|
270
|
-
|
|
271
|
-
return fields;
|
|
272
|
-
}
|
|
273
|
-
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)));
|
|
274
374
|
const ret = [];
|
|
275
375
|
if (fields) {
|
|
276
376
|
for (let field of fields) {
|
|
277
|
-
/* v8 ignore next
|
|
377
|
+
/* v8 ignore next */
|
|
278
378
|
if (Utils.isPlainObject(field)) {
|
|
279
379
|
continue;
|
|
280
380
|
}
|
|
@@ -282,7 +382,7 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
282
382
|
field = field.toString().substring(0, field.toString().indexOf('.'));
|
|
283
383
|
}
|
|
284
384
|
let prop = meta.properties[field];
|
|
285
|
-
/* v8 ignore
|
|
385
|
+
/* v8 ignore next */
|
|
286
386
|
if (prop) {
|
|
287
387
|
if (!prop.fieldNames) {
|
|
288
388
|
continue;
|
|
@@ -297,7 +397,6 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
297
397
|
else {
|
|
298
398
|
ret.push(field);
|
|
299
399
|
}
|
|
300
|
-
/* v8 ignore stop */
|
|
301
400
|
}
|
|
302
401
|
ret.unshift(...meta.primaryKeys.filter(pk => !fields.includes(pk)));
|
|
303
402
|
}
|
|
@@ -307,4 +406,21 @@ export class MongoDriver extends DatabaseDriver {
|
|
|
307
406
|
}
|
|
308
407
|
return ret.length > 0 ? ret : undefined;
|
|
309
408
|
}
|
|
409
|
+
handleVersionProperty(entityName, data, update = false) {
|
|
410
|
+
const meta = this.metadata.find(entityName);
|
|
411
|
+
if (!meta?.versionProperty) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
const versionProperty = meta.properties[meta.versionProperty];
|
|
415
|
+
if (versionProperty.runtimeType === 'Date') {
|
|
416
|
+
data[versionProperty.name] ??= new Date();
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
data[versionProperty.name] ??= update ? { $inc: 1 } : 1;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/** @inheritDoc */
|
|
423
|
+
getORMClass() {
|
|
424
|
+
return MongoMikroORM;
|
|
425
|
+
}
|
|
310
426
|
}
|
package/MongoEntityManager.d.ts
CHANGED
|
@@ -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
|
|
13
|
-
|
|
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
|
*/
|
package/MongoEntityManager.js
CHANGED
|
@@ -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
|
|
11
|
-
return this.getDriver().aggregate(entityName, pipeline);
|
|
10
|
+
return this.getDriver().aggregate(entityName, pipeline, this.getTransactionContext());
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
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 */
|
package/MongoMikroORM.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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
|
}
|
package/MongoPlatform.d.ts
CHANGED
|
@@ -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,
|
|
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
|
|
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.
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
6
|
-
|
|
6
|
+
create(options?: MongoCreateSchemaOptions): Promise<void>;
|
|
7
|
+
drop(options?: {
|
|
7
8
|
dropMigrationsTable?: boolean;
|
|
8
9
|
}): Promise<void>;
|
|
9
|
-
|
|
10
|
+
update(options?: MongoCreateSchemaOptions): Promise<void>;
|
|
10
11
|
ensureDatabase(): Promise<boolean>;
|
|
11
|
-
|
|
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
|
}
|