@atscript/db-mongo 0.1.83 → 0.1.84
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/dist/index.cjs +57 -15
- package/dist/index.d.cts +9 -3
- package/dist/index.d.mts +9 -3
- package/dist/index.mjs +57 -15
- package/package.json +3 -2
package/dist/index.cjs
CHANGED
|
@@ -1278,9 +1278,17 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1278
1278
|
createValidator: (opts) => this._table.createValidator(opts)
|
|
1279
1279
|
};
|
|
1280
1280
|
}
|
|
1281
|
-
async nativePatch(filter, patch, ops) {
|
|
1282
|
-
const mongoFilter =
|
|
1283
|
-
const
|
|
1281
|
+
async nativePatch(filter, patch, ops, expectedVersion) {
|
|
1282
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "nativePatch");
|
|
1283
|
+
const versionColumn = this._table.versionColumn;
|
|
1284
|
+
const effectiveOps = versionColumn !== void 0 ? {
|
|
1285
|
+
...ops,
|
|
1286
|
+
inc: {
|
|
1287
|
+
...ops?.inc,
|
|
1288
|
+
[versionColumn]: 1
|
|
1289
|
+
}
|
|
1290
|
+
} : ops;
|
|
1291
|
+
const { updateFilter, updateOptions } = new CollectionPatcher(this.getPatcherContext(), patch, effectiveOps).preparePatch();
|
|
1284
1292
|
this._log("updateOne (patch)", mongoFilter, updateFilter);
|
|
1285
1293
|
const result = await this.collection.updateOne(mongoFilter, updateFilter, {
|
|
1286
1294
|
...updateOptions,
|
|
@@ -1477,6 +1485,18 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1477
1485
|
}
|
|
1478
1486
|
}
|
|
1479
1487
|
/**
|
|
1488
|
+
* Builds a Mongo filter for CAS-aware writes. Throws when `expectedVersion`
|
|
1489
|
+
* is supplied for a non-versioned table — fail loud at the adapter boundary
|
|
1490
|
+
* rather than silently dropping the CAS predicate.
|
|
1491
|
+
*/
|
|
1492
|
+
_buildCasFilter(filter, expectedVersion, op) {
|
|
1493
|
+
const versionColumn = this._table.versionColumn;
|
|
1494
|
+
if (expectedVersion !== void 0 && versionColumn === void 0) throw new Error(`${op}: expectedVersion requires versionColumn`);
|
|
1495
|
+
const mongoFilter = require_mongo_filter.buildMongoFilter(filter);
|
|
1496
|
+
if (expectedVersion !== void 0 && versionColumn !== void 0) mongoFilter[versionColumn] = expectedVersion;
|
|
1497
|
+
return mongoFilter;
|
|
1498
|
+
}
|
|
1499
|
+
/**
|
|
1480
1500
|
* Wraps an async operation to catch MongoDB duplicate key errors
|
|
1481
1501
|
* (code 11000) and rethrow as structured `DbError`.
|
|
1482
1502
|
*/
|
|
@@ -1492,6 +1512,8 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1492
1512
|
}
|
|
1493
1513
|
}
|
|
1494
1514
|
async insertOne(data) {
|
|
1515
|
+
const versionColumn = this._table.versionColumn;
|
|
1516
|
+
if (versionColumn !== void 0 && !(versionColumn in data)) data[versionColumn] = 0;
|
|
1495
1517
|
if (this._incrementFields.size > 0) {
|
|
1496
1518
|
const fields = this._fieldsNeedingIncrement(data);
|
|
1497
1519
|
if (fields.length > 0) {
|
|
@@ -1504,6 +1526,10 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1504
1526
|
return { insertedId: this._resolveInsertedId(data, result.insertedId) };
|
|
1505
1527
|
}
|
|
1506
1528
|
async insertMany(data) {
|
|
1529
|
+
const versionColumn = this._table.versionColumn;
|
|
1530
|
+
if (versionColumn !== void 0) {
|
|
1531
|
+
for (const item of data) if (!(versionColumn in item)) item[versionColumn] = 0;
|
|
1532
|
+
}
|
|
1507
1533
|
if (this._incrementFields.size > 0) {
|
|
1508
1534
|
const allFields = /* @__PURE__ */ new Set();
|
|
1509
1535
|
for (const item of data) for (const f of this._fieldsNeedingIncrement(item)) allFields.add(f);
|
|
@@ -1544,9 +1570,9 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1544
1570
|
...this._getSessionOpts()
|
|
1545
1571
|
});
|
|
1546
1572
|
}
|
|
1547
|
-
async updateOne(filter, data, ops) {
|
|
1548
|
-
const mongoFilter =
|
|
1549
|
-
const updateDoc = buildMongoUpdateDoc(data, ops);
|
|
1573
|
+
async updateOne(filter, data, ops, expectedVersion) {
|
|
1574
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "updateOne");
|
|
1575
|
+
const updateDoc = buildMongoUpdateDoc(data, ops, this._table.versionColumn);
|
|
1550
1576
|
this._log("updateOne", mongoFilter, updateDoc);
|
|
1551
1577
|
const result = await this.collection.updateOne(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1552
1578
|
return {
|
|
@@ -1554,10 +1580,18 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1554
1580
|
modifiedCount: result.modifiedCount
|
|
1555
1581
|
};
|
|
1556
1582
|
}
|
|
1557
|
-
async replaceOne(filter, data) {
|
|
1558
|
-
const mongoFilter =
|
|
1583
|
+
async replaceOne(filter, data, expectedVersion) {
|
|
1584
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "replaceOne");
|
|
1585
|
+
const versionColumn = this._table.versionColumn;
|
|
1559
1586
|
this._log("replaceOne", mongoFilter, data);
|
|
1560
|
-
|
|
1587
|
+
let result;
|
|
1588
|
+
if (versionColumn !== void 0) {
|
|
1589
|
+
const pipeline = [{ $replaceWith: {
|
|
1590
|
+
...data,
|
|
1591
|
+
[versionColumn]: { $add: [`$${versionColumn}`, 1] }
|
|
1592
|
+
} }];
|
|
1593
|
+
result = await this._wrapDuplicateKeyError(() => this.collection.updateOne(mongoFilter, pipeline, this._getSessionOpts()));
|
|
1594
|
+
} else result = await this._wrapDuplicateKeyError(() => this.collection.replaceOne(mongoFilter, data, this._getSessionOpts()));
|
|
1561
1595
|
return {
|
|
1562
1596
|
matchedCount: result.matchedCount,
|
|
1563
1597
|
modifiedCount: result.modifiedCount
|
|
@@ -1569,8 +1603,9 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1569
1603
|
return { deletedCount: (await this.collection.deleteOne(mongoFilter, this._getSessionOpts())).deletedCount };
|
|
1570
1604
|
}
|
|
1571
1605
|
async updateMany(filter, data, ops) {
|
|
1606
|
+
const versionColumn = this._table.versionColumn;
|
|
1572
1607
|
const mongoFilter = require_mongo_filter.buildMongoFilter(filter);
|
|
1573
|
-
const updateDoc = buildMongoUpdateDoc(data, ops);
|
|
1608
|
+
const updateDoc = buildMongoUpdateDoc(data, ops, versionColumn);
|
|
1574
1609
|
this._log("updateMany", mongoFilter, updateDoc);
|
|
1575
1610
|
const result = await this.collection.updateMany(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1576
1611
|
return {
|
|
@@ -1580,8 +1615,9 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1580
1615
|
}
|
|
1581
1616
|
async replaceMany(filter, data) {
|
|
1582
1617
|
const mongoFilter = require_mongo_filter.buildMongoFilter(filter);
|
|
1583
|
-
|
|
1584
|
-
|
|
1618
|
+
const updateDoc = buildMongoUpdateDoc(data, void 0, this._table.versionColumn);
|
|
1619
|
+
this._log("replaceMany", mongoFilter, updateDoc);
|
|
1620
|
+
const result = await this.collection.updateMany(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1585
1621
|
return {
|
|
1586
1622
|
matchedCount: result.matchedCount,
|
|
1587
1623
|
modifiedCount: result.modifiedCount
|
|
@@ -1781,9 +1817,11 @@ var MongoAdapter = class MongoAdapter extends _atscript_db.BaseDbAdapter {
|
|
|
1781
1817
|
/**
|
|
1782
1818
|
* Builds a MongoDB update document from a data object that may contain
|
|
1783
1819
|
* field ops (`{ $inc: N }`, `{ $dec: N }`, `{ $mul: N }`).
|
|
1784
|
-
* Regular fields go into `$set`, ops go into `$inc` / `$mul`.
|
|
1820
|
+
* Regular fields go into `$set`, ops go into `$inc` / `$mul`. When
|
|
1821
|
+
* `versionColumn` is supplied, an auto-bump (`$inc: { <col>: 1 }`) is merged
|
|
1822
|
+
* in so versioned tables increment monotonically on every successful update.
|
|
1785
1823
|
*/
|
|
1786
|
-
function buildMongoUpdateDoc(data, ops) {
|
|
1824
|
+
function buildMongoUpdateDoc(data, ops, versionColumn) {
|
|
1787
1825
|
const updateDoc = {};
|
|
1788
1826
|
let hasData = false;
|
|
1789
1827
|
for (const _ in data) {
|
|
@@ -1791,7 +1829,11 @@ function buildMongoUpdateDoc(data, ops) {
|
|
|
1791
1829
|
break;
|
|
1792
1830
|
}
|
|
1793
1831
|
if (hasData) updateDoc.$set = data;
|
|
1794
|
-
if (ops?.inc
|
|
1832
|
+
if (ops?.inc || versionColumn !== void 0) {
|
|
1833
|
+
const inc = { ...ops?.inc };
|
|
1834
|
+
if (versionColumn !== void 0) inc[versionColumn] = 1;
|
|
1835
|
+
updateDoc.$inc = inc;
|
|
1836
|
+
}
|
|
1795
1837
|
if (ops?.mul) updateDoc.$mul = ops.mul;
|
|
1796
1838
|
return updateDoc;
|
|
1797
1839
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -254,7 +254,7 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
254
254
|
loadRelations(rows: Array<Record<string, unknown>>, withRelations: WithRelation[], relations: ReadonlyMap<string, TDbRelation>, foreignKeys: ReadonlyMap<string, TDbForeignKey>, tableResolver?: TTableResolver): Promise<void>;
|
|
255
255
|
/** Returns the context object used by CollectionPatcher. */
|
|
256
256
|
getPatcherContext(): TCollectionPatcherContext;
|
|
257
|
-
nativePatch(filter: FilterExpr, patch: unknown, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
257
|
+
nativePatch(filter: FilterExpr, patch: unknown, ops?: TFieldOps, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
258
258
|
onBeforeFlatten(_type: unknown): void;
|
|
259
259
|
onFieldScanned(field: string, _type: unknown, metadata: TMetadataMap<AtscriptMetadata>): void;
|
|
260
260
|
getMetadataOverrides(meta: TableMetadata): TMetadataOverrides;
|
|
@@ -283,6 +283,12 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
283
283
|
}>;
|
|
284
284
|
collectionExists(): Promise<boolean>;
|
|
285
285
|
ensureCollectionExists(): Promise<void>;
|
|
286
|
+
/**
|
|
287
|
+
* Builds a Mongo filter for CAS-aware writes. Throws when `expectedVersion`
|
|
288
|
+
* is supplied for a non-versioned table — fail loud at the adapter boundary
|
|
289
|
+
* rather than silently dropping the CAS predicate.
|
|
290
|
+
*/
|
|
291
|
+
private _buildCasFilter;
|
|
286
292
|
/**
|
|
287
293
|
* Wraps an async operation to catch MongoDB duplicate key errors
|
|
288
294
|
* (code 11000) and rethrow as structured `DbError`.
|
|
@@ -293,8 +299,8 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
293
299
|
findOne(query: DbQuery): Promise<Record<string, unknown> | null>;
|
|
294
300
|
findMany(query: DbQuery): Promise<Array<Record<string, unknown>>>;
|
|
295
301
|
count(query: DbQuery): Promise<number>;
|
|
296
|
-
updateOne(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
297
|
-
replaceOne(filter: FilterExpr, data: Record<string, unknown
|
|
302
|
+
updateOne(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
303
|
+
replaceOne(filter: FilterExpr, data: Record<string, unknown>, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
298
304
|
deleteOne(filter: FilterExpr): Promise<TDbDeleteResult>;
|
|
299
305
|
updateMany(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
300
306
|
replaceMany(filter: FilterExpr, data: Record<string, unknown>): Promise<TDbUpdateResult>;
|
package/dist/index.d.mts
CHANGED
|
@@ -254,7 +254,7 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
254
254
|
loadRelations(rows: Array<Record<string, unknown>>, withRelations: WithRelation[], relations: ReadonlyMap<string, TDbRelation>, foreignKeys: ReadonlyMap<string, TDbForeignKey>, tableResolver?: TTableResolver): Promise<void>;
|
|
255
255
|
/** Returns the context object used by CollectionPatcher. */
|
|
256
256
|
getPatcherContext(): TCollectionPatcherContext;
|
|
257
|
-
nativePatch(filter: FilterExpr, patch: unknown, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
257
|
+
nativePatch(filter: FilterExpr, patch: unknown, ops?: TFieldOps, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
258
258
|
onBeforeFlatten(_type: unknown): void;
|
|
259
259
|
onFieldScanned(field: string, _type: unknown, metadata: TMetadataMap<AtscriptMetadata>): void;
|
|
260
260
|
getMetadataOverrides(meta: TableMetadata): TMetadataOverrides;
|
|
@@ -283,6 +283,12 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
283
283
|
}>;
|
|
284
284
|
collectionExists(): Promise<boolean>;
|
|
285
285
|
ensureCollectionExists(): Promise<void>;
|
|
286
|
+
/**
|
|
287
|
+
* Builds a Mongo filter for CAS-aware writes. Throws when `expectedVersion`
|
|
288
|
+
* is supplied for a non-versioned table — fail loud at the adapter boundary
|
|
289
|
+
* rather than silently dropping the CAS predicate.
|
|
290
|
+
*/
|
|
291
|
+
private _buildCasFilter;
|
|
286
292
|
/**
|
|
287
293
|
* Wraps an async operation to catch MongoDB duplicate key errors
|
|
288
294
|
* (code 11000) and rethrow as structured `DbError`.
|
|
@@ -293,8 +299,8 @@ declare class MongoAdapter extends BaseDbAdapter {
|
|
|
293
299
|
findOne(query: DbQuery): Promise<Record<string, unknown> | null>;
|
|
294
300
|
findMany(query: DbQuery): Promise<Array<Record<string, unknown>>>;
|
|
295
301
|
count(query: DbQuery): Promise<number>;
|
|
296
|
-
updateOne(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
297
|
-
replaceOne(filter: FilterExpr, data: Record<string, unknown
|
|
302
|
+
updateOne(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
303
|
+
replaceOne(filter: FilterExpr, data: Record<string, unknown>, expectedVersion?: number): Promise<TDbUpdateResult>;
|
|
298
304
|
deleteOne(filter: FilterExpr): Promise<TDbDeleteResult>;
|
|
299
305
|
updateMany(filter: FilterExpr, data: Record<string, unknown>, ops?: TFieldOps): Promise<TDbUpdateResult>;
|
|
300
306
|
replaceMany(filter: FilterExpr, data: Record<string, unknown>): Promise<TDbUpdateResult>;
|
package/dist/index.mjs
CHANGED
|
@@ -1277,9 +1277,17 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1277
1277
|
createValidator: (opts) => this._table.createValidator(opts)
|
|
1278
1278
|
};
|
|
1279
1279
|
}
|
|
1280
|
-
async nativePatch(filter, patch, ops) {
|
|
1281
|
-
const mongoFilter =
|
|
1282
|
-
const
|
|
1280
|
+
async nativePatch(filter, patch, ops, expectedVersion) {
|
|
1281
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "nativePatch");
|
|
1282
|
+
const versionColumn = this._table.versionColumn;
|
|
1283
|
+
const effectiveOps = versionColumn !== void 0 ? {
|
|
1284
|
+
...ops,
|
|
1285
|
+
inc: {
|
|
1286
|
+
...ops?.inc,
|
|
1287
|
+
[versionColumn]: 1
|
|
1288
|
+
}
|
|
1289
|
+
} : ops;
|
|
1290
|
+
const { updateFilter, updateOptions } = new CollectionPatcher(this.getPatcherContext(), patch, effectiveOps).preparePatch();
|
|
1283
1291
|
this._log("updateOne (patch)", mongoFilter, updateFilter);
|
|
1284
1292
|
const result = await this.collection.updateOne(mongoFilter, updateFilter, {
|
|
1285
1293
|
...updateOptions,
|
|
@@ -1476,6 +1484,18 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1476
1484
|
}
|
|
1477
1485
|
}
|
|
1478
1486
|
/**
|
|
1487
|
+
* Builds a Mongo filter for CAS-aware writes. Throws when `expectedVersion`
|
|
1488
|
+
* is supplied for a non-versioned table — fail loud at the adapter boundary
|
|
1489
|
+
* rather than silently dropping the CAS predicate.
|
|
1490
|
+
*/
|
|
1491
|
+
_buildCasFilter(filter, expectedVersion, op) {
|
|
1492
|
+
const versionColumn = this._table.versionColumn;
|
|
1493
|
+
if (expectedVersion !== void 0 && versionColumn === void 0) throw new Error(`${op}: expectedVersion requires versionColumn`);
|
|
1494
|
+
const mongoFilter = buildMongoFilter(filter);
|
|
1495
|
+
if (expectedVersion !== void 0 && versionColumn !== void 0) mongoFilter[versionColumn] = expectedVersion;
|
|
1496
|
+
return mongoFilter;
|
|
1497
|
+
}
|
|
1498
|
+
/**
|
|
1479
1499
|
* Wraps an async operation to catch MongoDB duplicate key errors
|
|
1480
1500
|
* (code 11000) and rethrow as structured `DbError`.
|
|
1481
1501
|
*/
|
|
@@ -1491,6 +1511,8 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1491
1511
|
}
|
|
1492
1512
|
}
|
|
1493
1513
|
async insertOne(data) {
|
|
1514
|
+
const versionColumn = this._table.versionColumn;
|
|
1515
|
+
if (versionColumn !== void 0 && !(versionColumn in data)) data[versionColumn] = 0;
|
|
1494
1516
|
if (this._incrementFields.size > 0) {
|
|
1495
1517
|
const fields = this._fieldsNeedingIncrement(data);
|
|
1496
1518
|
if (fields.length > 0) {
|
|
@@ -1503,6 +1525,10 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1503
1525
|
return { insertedId: this._resolveInsertedId(data, result.insertedId) };
|
|
1504
1526
|
}
|
|
1505
1527
|
async insertMany(data) {
|
|
1528
|
+
const versionColumn = this._table.versionColumn;
|
|
1529
|
+
if (versionColumn !== void 0) {
|
|
1530
|
+
for (const item of data) if (!(versionColumn in item)) item[versionColumn] = 0;
|
|
1531
|
+
}
|
|
1506
1532
|
if (this._incrementFields.size > 0) {
|
|
1507
1533
|
const allFields = /* @__PURE__ */ new Set();
|
|
1508
1534
|
for (const item of data) for (const f of this._fieldsNeedingIncrement(item)) allFields.add(f);
|
|
@@ -1543,9 +1569,9 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1543
1569
|
...this._getSessionOpts()
|
|
1544
1570
|
});
|
|
1545
1571
|
}
|
|
1546
|
-
async updateOne(filter, data, ops) {
|
|
1547
|
-
const mongoFilter =
|
|
1548
|
-
const updateDoc = buildMongoUpdateDoc(data, ops);
|
|
1572
|
+
async updateOne(filter, data, ops, expectedVersion) {
|
|
1573
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "updateOne");
|
|
1574
|
+
const updateDoc = buildMongoUpdateDoc(data, ops, this._table.versionColumn);
|
|
1549
1575
|
this._log("updateOne", mongoFilter, updateDoc);
|
|
1550
1576
|
const result = await this.collection.updateOne(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1551
1577
|
return {
|
|
@@ -1553,10 +1579,18 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1553
1579
|
modifiedCount: result.modifiedCount
|
|
1554
1580
|
};
|
|
1555
1581
|
}
|
|
1556
|
-
async replaceOne(filter, data) {
|
|
1557
|
-
const mongoFilter =
|
|
1582
|
+
async replaceOne(filter, data, expectedVersion) {
|
|
1583
|
+
const mongoFilter = this._buildCasFilter(filter, expectedVersion, "replaceOne");
|
|
1584
|
+
const versionColumn = this._table.versionColumn;
|
|
1558
1585
|
this._log("replaceOne", mongoFilter, data);
|
|
1559
|
-
|
|
1586
|
+
let result;
|
|
1587
|
+
if (versionColumn !== void 0) {
|
|
1588
|
+
const pipeline = [{ $replaceWith: {
|
|
1589
|
+
...data,
|
|
1590
|
+
[versionColumn]: { $add: [`$${versionColumn}`, 1] }
|
|
1591
|
+
} }];
|
|
1592
|
+
result = await this._wrapDuplicateKeyError(() => this.collection.updateOne(mongoFilter, pipeline, this._getSessionOpts()));
|
|
1593
|
+
} else result = await this._wrapDuplicateKeyError(() => this.collection.replaceOne(mongoFilter, data, this._getSessionOpts()));
|
|
1560
1594
|
return {
|
|
1561
1595
|
matchedCount: result.matchedCount,
|
|
1562
1596
|
modifiedCount: result.modifiedCount
|
|
@@ -1568,8 +1602,9 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1568
1602
|
return { deletedCount: (await this.collection.deleteOne(mongoFilter, this._getSessionOpts())).deletedCount };
|
|
1569
1603
|
}
|
|
1570
1604
|
async updateMany(filter, data, ops) {
|
|
1605
|
+
const versionColumn = this._table.versionColumn;
|
|
1571
1606
|
const mongoFilter = buildMongoFilter(filter);
|
|
1572
|
-
const updateDoc = buildMongoUpdateDoc(data, ops);
|
|
1607
|
+
const updateDoc = buildMongoUpdateDoc(data, ops, versionColumn);
|
|
1573
1608
|
this._log("updateMany", mongoFilter, updateDoc);
|
|
1574
1609
|
const result = await this.collection.updateMany(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1575
1610
|
return {
|
|
@@ -1579,8 +1614,9 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1579
1614
|
}
|
|
1580
1615
|
async replaceMany(filter, data) {
|
|
1581
1616
|
const mongoFilter = buildMongoFilter(filter);
|
|
1582
|
-
|
|
1583
|
-
|
|
1617
|
+
const updateDoc = buildMongoUpdateDoc(data, void 0, this._table.versionColumn);
|
|
1618
|
+
this._log("replaceMany", mongoFilter, updateDoc);
|
|
1619
|
+
const result = await this.collection.updateMany(mongoFilter, updateDoc, this._getSessionOpts());
|
|
1584
1620
|
return {
|
|
1585
1621
|
matchedCount: result.matchedCount,
|
|
1586
1622
|
modifiedCount: result.modifiedCount
|
|
@@ -1780,9 +1816,11 @@ var MongoAdapter = class MongoAdapter extends BaseDbAdapter {
|
|
|
1780
1816
|
/**
|
|
1781
1817
|
* Builds a MongoDB update document from a data object that may contain
|
|
1782
1818
|
* field ops (`{ $inc: N }`, `{ $dec: N }`, `{ $mul: N }`).
|
|
1783
|
-
* Regular fields go into `$set`, ops go into `$inc` / `$mul`.
|
|
1819
|
+
* Regular fields go into `$set`, ops go into `$inc` / `$mul`. When
|
|
1820
|
+
* `versionColumn` is supplied, an auto-bump (`$inc: { <col>: 1 }`) is merged
|
|
1821
|
+
* in so versioned tables increment monotonically on every successful update.
|
|
1784
1822
|
*/
|
|
1785
|
-
function buildMongoUpdateDoc(data, ops) {
|
|
1823
|
+
function buildMongoUpdateDoc(data, ops, versionColumn) {
|
|
1786
1824
|
const updateDoc = {};
|
|
1787
1825
|
let hasData = false;
|
|
1788
1826
|
for (const _ in data) {
|
|
@@ -1790,7 +1828,11 @@ function buildMongoUpdateDoc(data, ops) {
|
|
|
1790
1828
|
break;
|
|
1791
1829
|
}
|
|
1792
1830
|
if (hasData) updateDoc.$set = data;
|
|
1793
|
-
if (ops?.inc
|
|
1831
|
+
if (ops?.inc || versionColumn !== void 0) {
|
|
1832
|
+
const inc = { ...ops?.inc };
|
|
1833
|
+
if (versionColumn !== void 0) inc[versionColumn] = 1;
|
|
1834
|
+
updateDoc.$inc = inc;
|
|
1835
|
+
}
|
|
1794
1836
|
if (ops?.mul) updateDoc.$mul = ops.mul;
|
|
1795
1837
|
return updateDoc;
|
|
1796
1838
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atscript/db-mongo",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.84",
|
|
4
4
|
"description": "Mongodb plugin for atscript.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"atscript",
|
|
@@ -49,13 +49,14 @@
|
|
|
49
49
|
"@atscript/core": "^0.1.59",
|
|
50
50
|
"@atscript/typescript": "^0.1.59",
|
|
51
51
|
"mongodb": "^6.17.0",
|
|
52
|
+
"mongodb-memory-server-core": "^10.0.0",
|
|
52
53
|
"unplugin-atscript": "^0.1.59"
|
|
53
54
|
},
|
|
54
55
|
"peerDependencies": {
|
|
55
56
|
"@atscript/core": "^0.1.59",
|
|
56
57
|
"@atscript/typescript": "^0.1.59",
|
|
57
58
|
"mongodb": "^6.17.0",
|
|
58
|
-
"@atscript/db": "^0.1.
|
|
59
|
+
"@atscript/db": "^0.1.84"
|
|
59
60
|
},
|
|
60
61
|
"scripts": {
|
|
61
62
|
"postinstall": "asc -f dts",
|