cry-db 2.4.31 → 2.4.33
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/README.md +90 -0
- package/dist/mongo.d.mts +147 -3
- package/dist/mongo.d.mts.map +1 -1
- package/dist/mongo.mjs +543 -48
- package/dist/mongo.mjs.map +1 -1
- package/dist/types.d.mts +11 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +37 -36
package/README.md
CHANGED
|
@@ -78,6 +78,95 @@ await users.save({ $set: { age: 31 } }, userId);
|
|
|
78
78
|
await users.upsert({ email: 'a@b.c' }, { $set: { name: 'Alice' } });
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
### Bracket-by-`_id` array paths
|
|
82
|
+
|
|
83
|
+
Update array elements by their `_id` instead of by position. The path
|
|
84
|
+
`arr[<id>]` is shorthand for "the element of `arr` whose `_id` is `<id>`",
|
|
85
|
+
resolved server-side against the live document — no race window where a
|
|
86
|
+
concurrent reorder, insert, or delete shifts indices between client read
|
|
87
|
+
and server write.
|
|
88
|
+
|
|
89
|
+
Supported in every write method: `updateOne`, `save`, `update`, `upsert`,
|
|
90
|
+
`upsertBatch`, and `updateCollections`. Top-level shorthand (no `$set`
|
|
91
|
+
wrapper) is normalized into `$set` automatically; `key: undefined` becomes
|
|
92
|
+
`$unset` as usual.
|
|
93
|
+
|
|
94
|
+
#### Syntax
|
|
95
|
+
|
|
96
|
+
| Form | Quoted variants |
|
|
97
|
+
|---|---|
|
|
98
|
+
| `arr[<id>]` | `arr['<id>']`, `arr["<id>"]` |
|
|
99
|
+
|
|
100
|
+
Quoted and unquoted forms are equivalent. Use quotes when an `_id` contains
|
|
101
|
+
characters that could conflict with dot-notation (rare).
|
|
102
|
+
|
|
103
|
+
#### Four operations
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
// 1. Update sub-field of element with _id === 'p2'
|
|
107
|
+
// (translated to $set + arrayFilters [{ f0._id: 'p2' }])
|
|
108
|
+
await items.updateOne(
|
|
109
|
+
{ _id: 'r1' },
|
|
110
|
+
{ 'postavke[p2].kolicina': 99 },
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
// 2. Unset sub-field of element with _id === 'p2'
|
|
114
|
+
// (key: undefined → $unset → mongo $unset on the matched element)
|
|
115
|
+
await items.updateOne(
|
|
116
|
+
{ _id: 'r1' },
|
|
117
|
+
{ 'postavke[p2].navodilo': undefined },
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
// 3. Insert / replace an element by _id (terminal bracket + array value)
|
|
121
|
+
// Idempotent — re-sending the same _id replaces in place, no duplicates.
|
|
122
|
+
// Each element MUST carry its own `_id`.
|
|
123
|
+
await items.updateOne(
|
|
124
|
+
{ _id: 'r1' },
|
|
125
|
+
{ "postavke['p0']": [{ _id: 'p0', value: 0 }] },
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// 4. Remove an element by _id (terminal bracket + undefined)
|
|
129
|
+
// Translated to $pull (or merged into the same pipeline as inserts above).
|
|
130
|
+
await items.updateOne(
|
|
131
|
+
{ _id: 'r1' },
|
|
132
|
+
{ "postavke['p1']": undefined },
|
|
133
|
+
);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Single-element insert/remove uses an array of one element on the value side
|
|
137
|
+
(form 3). Multiple terminal-bracket inserts against the same parent field
|
|
138
|
+
are merged into one atomic stage.
|
|
139
|
+
|
|
140
|
+
#### Combining operations
|
|
141
|
+
|
|
142
|
+
Sub-field updates (form 1/2) and terminal-bracket inserts/removes (form 3/4)
|
|
143
|
+
can both appear in a single update with one exception:
|
|
144
|
+
|
|
145
|
+
| In the same update | Result |
|
|
146
|
+
|---|---|
|
|
147
|
+
| Sub-field updates only (1, 2) | Single doc update with `arrayFilters`. |
|
|
148
|
+
| Terminal removes only (4) | `$pull` added to the doc; `arrayFilters` still allowed for any sub-field updates. |
|
|
149
|
+
| Terminal inserts (3), with or without removes (4) | Aggregation pipeline with a unified `$filter + $concatArrays` stage per parent field. Inserts are idempotent (re-inserting the same `_id` replaces the element). |
|
|
150
|
+
| Terminal inserts **and** sub-field updates against the same array | **Throws.** Pipeline form does not support `arrayFilters`; split into two calls. |
|
|
151
|
+
|
|
152
|
+
#### Nested brackets
|
|
153
|
+
|
|
154
|
+
Sub-field paths can chain brackets to address elements in nested arrays:
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
await items.updateOne(
|
|
158
|
+
{ _id: 'r5' },
|
|
159
|
+
{ 'terapije[t1].postavke[sp2].kolicina': 99 },
|
|
160
|
+
);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Multiple paths into the same element share one `arrayFilters` entry
|
|
164
|
+
(deduplicated by `(parentPath, _id)`).
|
|
165
|
+
|
|
166
|
+
Terminal-bracket inserts/removes are **not** supported under a nested-bracket
|
|
167
|
+
parent (e.g. `terapije[t1].postavke['new']: [...]`). Add the inner element
|
|
168
|
+
in a separate call, or rewrite the whole `terapije[t1].postavke` array.
|
|
169
|
+
|
|
81
170
|
### Delete
|
|
82
171
|
|
|
83
172
|
```ts
|
|
@@ -275,6 +364,7 @@ Options passed to query methods:
|
|
|
275
364
|
users.distinct<string>('status'); // distinct field values (sorted)
|
|
276
365
|
users.findNewer(timestamp, query, opts); // find records newer than timestamp
|
|
277
366
|
mongo.findNewerMany([{ collection, timestamp }]); // batch findNewer across collections
|
|
367
|
+
mongo.findNewerMany([{ collection, timestamp, specId }]); // specId optional — disambiguates duplicate-collection specs
|
|
278
368
|
mongo.findByIdsInManyCollections([{ collection, ids }]); // batch findByIds across collections
|
|
279
369
|
users.isUnique('email', 'a@b.c', excludeId); // uniqueness check
|
|
280
370
|
users.aggregate(pipeline); // aggregation pipeline
|
package/dist/mongo.d.mts
CHANGED
|
@@ -70,18 +70,32 @@ export declare class Mongo extends Db {
|
|
|
70
70
|
find<T>(collection: string, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
71
71
|
findAll<T>(collection: string, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
72
72
|
findNewer<T>(collection: string, timestamp: Timestamp | number | string | Date, query?: QuerySpec<T>, opts?: QueryOpts): Promise<T[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Batched delta read across multiple collection specs.
|
|
75
|
+
*
|
|
76
|
+
* Response keying: each spec's results land at `spec.specId ?? spec.collection`
|
|
77
|
+
* in the returned `Record`. Specs without `specId` collide if they share a
|
|
78
|
+
* `collection` (existing behavior — last spec wins). Pass `specId` to
|
|
79
|
+
* disambiguate, e.g. when sending a positive-query spec and a scope-exit
|
|
80
|
+
* spec for the same collection in one batch.
|
|
81
|
+
*/
|
|
73
82
|
findNewerMany<T>(spec?: GetNewerSpec<T>[], defaultOpts?: QueryOpts): Promise<Record<string, any[]>>;
|
|
74
83
|
/**
|
|
75
84
|
* Streaming variant of findNewerMany.
|
|
76
85
|
* Instead of collecting all results into memory, iterates each collection's
|
|
77
86
|
* cursor and calls onChunk for each batch of documents.
|
|
78
87
|
*
|
|
79
|
-
* @param spec - Array of collection specs with timestamps and queries
|
|
80
|
-
*
|
|
88
|
+
* @param spec - Array of collection specs with timestamps and queries.
|
|
89
|
+
* Each spec may set `specId` to disambiguate multiple specs against the
|
|
90
|
+
* same collection (forwarded as the third arg to `onChunk`).
|
|
91
|
+
* @param onChunk - Callback called for each batch of documents. Receives
|
|
92
|
+
* `(collection, items, specId?)`. `specId` is `undefined` when the
|
|
93
|
+
* originating spec did not set one — old callers ignoring the third arg
|
|
94
|
+
* keep working unchanged.
|
|
81
95
|
* @param chunkSize - Number of documents per chunk (default 200)
|
|
82
96
|
* @param defaultOpts - Default query options applied to all collections
|
|
83
97
|
*/
|
|
84
|
-
findNewerManyStream<T>(spec: GetNewerSpec<T>[] | undefined, onChunk: (collection: string, items: any[]) => Promise<void>, chunkSize?: number, defaultOpts?: QueryOpts): Promise<void>;
|
|
98
|
+
findNewerManyStream<T>(spec: GetNewerSpec<T>[] | undefined, onChunk: (collection: string, items: any[], specId?: string) => Promise<void>, chunkSize?: number, defaultOpts?: QueryOpts): Promise<void>;
|
|
85
99
|
latestTimestamps(collections: string[]): Promise<Record<string, Timestamp>>;
|
|
86
100
|
latestTimestamp(collection: string): Promise<Timestamp | undefined>;
|
|
87
101
|
private _createQueryForNewer;
|
|
@@ -214,6 +228,136 @@ export declare class Mongo extends Db {
|
|
|
214
228
|
private _hasHashedKeys;
|
|
215
229
|
private _hasSequenceFields;
|
|
216
230
|
private _processUpdateObject;
|
|
231
|
+
/**
|
|
232
|
+
* Translate `arr[<_id>].field` bracket-by-_id segments inside `$set`
|
|
233
|
+
* and `$unset` paths to mongo positional `$[<filterId>]` placeholders,
|
|
234
|
+
* generating matching `arrayFilters` entries.
|
|
235
|
+
*
|
|
236
|
+
* Lets clients identify array elements by their `_id` instead of by
|
|
237
|
+
* position. Mongo evaluates the filter against the live document at
|
|
238
|
+
* write time, so the operation is atomic — no race window exists where
|
|
239
|
+
* a concurrent reorder/insert/delete by another writer could shift the
|
|
240
|
+
* targeted index between client read and server write.
|
|
241
|
+
*
|
|
242
|
+
* Path token forms (matches `cry-synced-db-client` `tokenizePath`):
|
|
243
|
+
* - plain `field` → kept as-is
|
|
244
|
+
* - numeric `<n>` → kept as-is (legacy positional index path)
|
|
245
|
+
* - bracket `[<_id>]` → translated to `$[fN]`, filter `{fN._id: <_id>}` emitted
|
|
246
|
+
*
|
|
247
|
+
* Filters are deduplicated by (parentPath, _id) so multiple paths into
|
|
248
|
+
* the same array element share one filter (mongo requires every filter
|
|
249
|
+
* identifier to be referenced).
|
|
250
|
+
*
|
|
251
|
+
* Mutates `update.$set` / `update.$unset` in place. Returns the
|
|
252
|
+
* arrayFilters array (or `undefined` when no bracket paths present).
|
|
253
|
+
*/
|
|
254
|
+
private _extractArrayFilters;
|
|
255
|
+
/**
|
|
256
|
+
* Tokenize a dot-notation path that may contain `[<_id>]` bracket
|
|
257
|
+
* segments. Mirrors the client-side `cry-synced-db-client/utils/computeDiff#tokenizePath`.
|
|
258
|
+
*
|
|
259
|
+
* "postavke[A].kolicina" → ["postavke", "[A]", "kolicina"]
|
|
260
|
+
* "koraki.0.diag" → ["koraki", "0", "diag"]
|
|
261
|
+
* "stranka.gsm" → ["stranka", "gsm"]
|
|
262
|
+
* "arr[A].sub[B].field" → ["arr", "[A]", "sub", "[B]", "field"]
|
|
263
|
+
*/
|
|
264
|
+
private static _tokenizePath;
|
|
265
|
+
/**
|
|
266
|
+
* Strip `[ ]` wrapper and surrounding `'…'` / `"…"` quotes from a bracket-id token.
|
|
267
|
+
* Convention: `[p2]`, `['p2']`, `["p2"]` all denote element with `_id === "p2"`.
|
|
268
|
+
* Quoted form is preferred when id contains characters that could conflict with
|
|
269
|
+
* dot-notation (rare, but defensive).
|
|
270
|
+
*
|
|
271
|
+
* Throws on empty id (`[]`, `['']`, `[""]`) — empty bracket has no semantic meaning
|
|
272
|
+
* (no element to target) and almost certainly indicates a caller bug. Optional
|
|
273
|
+
* `path` argument is included in the error message for easier debugging.
|
|
274
|
+
*/
|
|
275
|
+
private static _unquoteBracketId;
|
|
276
|
+
/**
|
|
277
|
+
* Pre-processing pass that VALIDATES and AUTO-FILLS element `_id` for terminal
|
|
278
|
+
* bracket-id paths in `$set` whose value is an object (replace) or array of
|
|
279
|
+
* objects (insert).
|
|
280
|
+
*
|
|
281
|
+
* Three rules enforced:
|
|
282
|
+
* 1) `_id` in brackets must be non-empty (empty → throw via `_unquoteBracketId`)
|
|
283
|
+
* 2) `_id` in brackets must equal element's `_id` (mismatch → throw, prevents data corruption)
|
|
284
|
+
* 3) element `_id` may be omitted (auto-fill from bracket id)
|
|
285
|
+
*
|
|
286
|
+
* Mutates element objects in place (auto-fill). Throws on rule 1/2 violation.
|
|
287
|
+
* Skips primitive values (caller knows what they're doing) and `null` (rare,
|
|
288
|
+
* not a typical insert/replace shape).
|
|
289
|
+
*
|
|
290
|
+
* Called BEFORE `_extractArrayInserts`/`_extractArrayRemoves`/`_extractArrayFilters`
|
|
291
|
+
* so downstream code can assume validated/filled element `_id`.
|
|
292
|
+
*/
|
|
293
|
+
private _validateAndAutoFillTerminalBracketValues;
|
|
294
|
+
/**
|
|
295
|
+
* Detect "terminal-bracket-id with array value" paths in `$set` — these are the
|
|
296
|
+
* INSERT operations: client wants to add array elements identified by `_id`,
|
|
297
|
+
* not update an existing element's sub-fields.
|
|
298
|
+
*
|
|
299
|
+
* Convention:
|
|
300
|
+
* - Path ends with `[<id>]` (terminal bracket, no `.<subfield>` after) AND
|
|
301
|
+
* - Value is an array AND
|
|
302
|
+
* - Every element in the array has `_id` (required for idempotency check)
|
|
303
|
+
*
|
|
304
|
+
* Mutates `update.$set` (removes matched paths). Returns extracted insert specs,
|
|
305
|
+
* or `undefined` if no inserts present.
|
|
306
|
+
*
|
|
307
|
+
* Each spec carries:
|
|
308
|
+
* - `field`: parent array field path (e.g. `"postavke"`)
|
|
309
|
+
* - `ids`: `_id`s of all elements to insert (used to dedupe existing)
|
|
310
|
+
* - `elements`: the new elements to push
|
|
311
|
+
*
|
|
312
|
+
* Note: parent paths with NESTED brackets (e.g. `terapije[t1].postavke[<new>]`)
|
|
313
|
+
* are NOT supported here — left in `$set` for the existing arrayFilters path
|
|
314
|
+
* (which would silently no-op for non-existent ids; future enhancement).
|
|
315
|
+
*/
|
|
316
|
+
private _extractArrayInserts;
|
|
317
|
+
/**
|
|
318
|
+
* Detect "terminal-bracket-id with no value" paths in `$unset` — these are the
|
|
319
|
+
* REMOVE operations: client wants to drop array elements identified by `_id`.
|
|
320
|
+
*
|
|
321
|
+
* Convention:
|
|
322
|
+
* - Path ends with `[<id>]` (terminal bracket, no `.<subfield>` after) AND
|
|
323
|
+
* - Was sent as `undefined` in the original update (became `$unset` after
|
|
324
|
+
* `_processUpdateObject` normalization).
|
|
325
|
+
*
|
|
326
|
+
* Mongo's `$unset` on `arr.$[fN]` would set the element to `null` in place
|
|
327
|
+
* (not remove from array). For real removal we use `$pull` instead — or, when
|
|
328
|
+
* combined with terminal-bracket inserts, the unified `$filter + $concatArrays`
|
|
329
|
+
* aggregation stage in `_applyBracketProcessing`.
|
|
330
|
+
*
|
|
331
|
+
* Mutates `update.$unset` (removes matched paths). Returns extracted remove
|
|
332
|
+
* specs (one per parent field, ids merged), or `undefined` if no removes present.
|
|
333
|
+
*
|
|
334
|
+
* Note: parent paths with NESTED brackets are not supported here (left in `$unset`
|
|
335
|
+
* for the existing arrayFilters fallback).
|
|
336
|
+
*/
|
|
337
|
+
private _extractArrayRemoves;
|
|
338
|
+
/**
|
|
339
|
+
* Combined bracket-path processing: extracts inserts (`arr[id]: [els]`),
|
|
340
|
+
* removes (`arr[id]: undefined` → `$unset`), and arrayFilters (`arr[id].field = X`).
|
|
341
|
+
* Decides whether mongo update should be sent as a regular doc or as an aggregation
|
|
342
|
+
* pipeline.
|
|
343
|
+
*
|
|
344
|
+
* Returns `{ update, arrayFilters? }`:
|
|
345
|
+
* - `update` is the original update doc OR an aggregation pipeline.
|
|
346
|
+
* - `arrayFilters` is set when sub-field bracket paths needed translation; only
|
|
347
|
+
* valid when `update` is the doc form (mongo doesn't support arrayFilters on pipelines).
|
|
348
|
+
*
|
|
349
|
+
* Strategy matrix:
|
|
350
|
+
* - no inserts, no removes → existing arrayFilters path (or pure update doc)
|
|
351
|
+
* - removes only → adds `$pull` to update doc; arrayFilters allowed
|
|
352
|
+
* - inserts (± removes) → pipeline form with unified `$filter + $concatArrays`
|
|
353
|
+
* per parent field; arrayFilters NOT allowed (throws)
|
|
354
|
+
*
|
|
355
|
+
* The unified pipeline stage atomically filters out elements matching any of
|
|
356
|
+
* the (removeIds ∪ insertIds), then appends new elements. This makes inserts
|
|
357
|
+
* idempotent (re-inserting same _id no-ops) and combines remove+insert without
|
|
358
|
+
* race window.
|
|
359
|
+
*/
|
|
360
|
+
private _applyBracketProcessing;
|
|
217
361
|
private _processHashedKeys;
|
|
218
362
|
/**
|
|
219
363
|
* Removes fields starting with `__` from an object (mutates in place).
|
package/dist/mongo.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mongo.d.mts","sourceRoot":"","sources":["../src/mongo.mts"],"names":[],"mappings":"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"}
|