mongolite-ts 0.4.0 → 0.5.0
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 +42 -0
- package/dist/bin/mongolite-debug.js +2 -2
- package/dist/bin/mongolite-debug.js.map +1 -1
- package/dist/collection.js +160 -9
- package/dist/collection.js.map +1 -1
- package/dist/cursors/findCursor.js +96 -2
- package/dist/cursors/findCursor.js.map +1 -1
- package/dist/debugger/query-debugger.js +2 -2
- package/dist/debugger/query-debugger.js.map +1 -1
- package/dist/document-utils.d.ts +34 -0
- package/dist/document-utils.js +101 -0
- package/dist/document-utils.js.map +1 -0
- package/dist/find-cursor.d.ts +51 -0
- package/dist/find-cursor.js +204 -0
- package/dist/find-cursor.js.map +1 -0
- package/dist/index.d.ts +8 -3
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/query-builder.d.ts +18 -0
- package/dist/query-builder.js +358 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/update-operations.d.ts +17 -0
- package/dist/update-operations.js +147 -0
- package/dist/update-operations.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
export class QueryBuilder {
|
|
2
|
+
constructor(options = {}) {
|
|
3
|
+
this.options = options;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Converts a field path to a JSON path for SQLite's json_extract function.
|
|
7
|
+
*/
|
|
8
|
+
parseJsonPath(path) {
|
|
9
|
+
return `'$.${path.replace(/\./g, '.')}'`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds a WHERE clause for a filter object.
|
|
13
|
+
* @param filter The filter object.
|
|
14
|
+
* @param params An array to collect query parameters.
|
|
15
|
+
* @returns A SQL WHERE clause.
|
|
16
|
+
*/
|
|
17
|
+
buildWhereClause(filter, params) {
|
|
18
|
+
const conditions = [];
|
|
19
|
+
// Handle $and, $or, $nor logical operators at the top level
|
|
20
|
+
for (const key of Object.keys(filter)) {
|
|
21
|
+
if (key === '$and' && filter.$and) {
|
|
22
|
+
const condition = filter.$and;
|
|
23
|
+
const andConditions = condition
|
|
24
|
+
.map((subFilter) => `(${this.buildWhereClause(subFilter, params)})`)
|
|
25
|
+
.join(' AND ');
|
|
26
|
+
conditions.push(`(${andConditions})`);
|
|
27
|
+
}
|
|
28
|
+
else if (key === '$or' && filter.$or) {
|
|
29
|
+
const condition = filter.$or;
|
|
30
|
+
const orConditions = condition
|
|
31
|
+
.map((subFilter) => `(${this.buildWhereClause(subFilter, params)})`)
|
|
32
|
+
.join(' OR ');
|
|
33
|
+
conditions.push(`(${orConditions})`);
|
|
34
|
+
}
|
|
35
|
+
else if (key === '$nor' && filter.$nor) {
|
|
36
|
+
const condition = filter.$nor;
|
|
37
|
+
const norConditions = condition
|
|
38
|
+
.map((subFilter) => `(${this.buildWhereClause(subFilter, params)})`)
|
|
39
|
+
.join(' OR ');
|
|
40
|
+
conditions.push(`NOT (${norConditions})`);
|
|
41
|
+
}
|
|
42
|
+
else if (key === '$text' && filter.$text) {
|
|
43
|
+
// Handle text search (basic implementation)
|
|
44
|
+
const search = filter.$text.$search;
|
|
45
|
+
if (typeof search === 'string' && search.trim() !== '') {
|
|
46
|
+
conditions.push(`data LIKE ?`);
|
|
47
|
+
params.push(`%${search}%`); // Simple LIKE search
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
conditions.push('1=0'); // No valid search term, nothing matches
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (key === '$exists' && filter.$exists) {
|
|
54
|
+
// Handle existence check
|
|
55
|
+
const existsConditions = Object.entries(filter.$exists)
|
|
56
|
+
.map(([field, exists]) => {
|
|
57
|
+
const jsonPath = this.parseJsonPath(field);
|
|
58
|
+
if (exists) {
|
|
59
|
+
return `json_extract(data, ${jsonPath}) IS NOT NULL`;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return `json_extract(data, ${jsonPath}) IS NULL`;
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
.join(' AND ');
|
|
66
|
+
conditions.push(`(${existsConditions})`);
|
|
67
|
+
}
|
|
68
|
+
else if (key === '$not' && filter.$not) {
|
|
69
|
+
// Handle negation of conditions
|
|
70
|
+
const notConditions = filter.$not;
|
|
71
|
+
const notClause = this.buildWhereClause(notConditions, params);
|
|
72
|
+
conditions.push(`NOT (${notClause})`);
|
|
73
|
+
}
|
|
74
|
+
else if (key === '$all' && filter.$all) {
|
|
75
|
+
// Handle array all match
|
|
76
|
+
const allConditions = Object.entries(filter.$all)
|
|
77
|
+
.map(([field, values]) => {
|
|
78
|
+
const arrayPath = this.parseJsonPath(field);
|
|
79
|
+
if (Array.isArray(values) && values.length > 0) {
|
|
80
|
+
const inConditions = values
|
|
81
|
+
.map(() => `json_extract(data, ${arrayPath}) = ?`)
|
|
82
|
+
.join(' AND ');
|
|
83
|
+
params.push(...values);
|
|
84
|
+
return `(${inConditions})`;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return '1=0'; // Empty $all means nothing matches
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
.join(' AND ');
|
|
91
|
+
conditions.push(`(${allConditions})`);
|
|
92
|
+
}
|
|
93
|
+
else if (key === '$elemMatch' && filter.$elemMatch) {
|
|
94
|
+
// Handle array element match
|
|
95
|
+
const elemMatchConditions = Object.entries(filter.$elemMatch)
|
|
96
|
+
.map(([field, subFilter]) => {
|
|
97
|
+
const arrayPath = this.parseJsonPath(field);
|
|
98
|
+
// First check if the field exists and is an array
|
|
99
|
+
const checkArrayCondition = `json_type(json_extract(data, ${arrayPath})) = 'array'`;
|
|
100
|
+
// Use a subquery with json_each to find at least one array element matching all conditions
|
|
101
|
+
let elemMatchSubquery = `EXISTS (
|
|
102
|
+
SELECT 1 FROM json_each(json_extract(data, ${arrayPath})) as elements
|
|
103
|
+
WHERE `;
|
|
104
|
+
// Process the conditions for the array elements
|
|
105
|
+
if (typeof subFilter === 'object' && subFilter !== null) {
|
|
106
|
+
const elemConditions = Object.entries(subFilter)
|
|
107
|
+
.map(([subField, subValue]) => {
|
|
108
|
+
if (typeof subValue === 'object' && subValue !== null) {
|
|
109
|
+
// Handle operators in the subfilter
|
|
110
|
+
const subConditions = [];
|
|
111
|
+
for (const op in subValue) {
|
|
112
|
+
const opValue = subValue[op];
|
|
113
|
+
switch (op) {
|
|
114
|
+
case '$eq':
|
|
115
|
+
subConditions.push(`json_extract(elements.value, '$.${subField}') = ?`);
|
|
116
|
+
params.push(opValue);
|
|
117
|
+
break;
|
|
118
|
+
case '$gt':
|
|
119
|
+
subConditions.push(`json_extract(elements.value, '$.${subField}') > ?`);
|
|
120
|
+
params.push(opValue);
|
|
121
|
+
break;
|
|
122
|
+
case '$gte':
|
|
123
|
+
subConditions.push(`json_extract(elements.value, '$.${subField}') >= ?`);
|
|
124
|
+
params.push(opValue);
|
|
125
|
+
break;
|
|
126
|
+
case '$lt':
|
|
127
|
+
subConditions.push(`json_extract(elements.value, '$.${subField}') < ?`);
|
|
128
|
+
params.push(opValue);
|
|
129
|
+
break;
|
|
130
|
+
case '$lte':
|
|
131
|
+
subConditions.push(`json_extract(elements.value, '$.${subField}') <= ?`);
|
|
132
|
+
params.push(opValue);
|
|
133
|
+
break;
|
|
134
|
+
// Add other operators as needed
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return subConditions.join(' AND ');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Simple equality for direct value
|
|
141
|
+
params.push(subValue);
|
|
142
|
+
return `json_extract(elements.value, '$.${subField}') = ?`;
|
|
143
|
+
}
|
|
144
|
+
})
|
|
145
|
+
.join(' AND ');
|
|
146
|
+
elemMatchSubquery += elemConditions;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Simple equality check for the entire element
|
|
150
|
+
params.push(subFilter);
|
|
151
|
+
elemMatchSubquery += `elements.value = ?`;
|
|
152
|
+
}
|
|
153
|
+
elemMatchSubquery += ')';
|
|
154
|
+
return `${checkArrayCondition} AND ${elemMatchSubquery}`;
|
|
155
|
+
})
|
|
156
|
+
.join(' AND ');
|
|
157
|
+
conditions.push(`(${elemMatchConditions})`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// Handle field conditions
|
|
161
|
+
if (key.startsWith('$'))
|
|
162
|
+
continue; // Skip logical operators already handled
|
|
163
|
+
const value = filter[key];
|
|
164
|
+
if (key === '_id') {
|
|
165
|
+
if (typeof value === 'string') {
|
|
166
|
+
conditions.push('_id = ?');
|
|
167
|
+
params.push(value);
|
|
168
|
+
}
|
|
169
|
+
else if (typeof value === 'object' &&
|
|
170
|
+
value !== null &&
|
|
171
|
+
value.$in) {
|
|
172
|
+
const inValues = value.$in;
|
|
173
|
+
if (inValues.length > 0) {
|
|
174
|
+
conditions.push(`_id IN (${inValues.map(() => '?').join(',')})`);
|
|
175
|
+
params.push(...inValues);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
conditions.push('1=0'); // No values in $in means nothing matches
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else if (typeof value === 'object' &&
|
|
182
|
+
value !== null &&
|
|
183
|
+
value.$ne) {
|
|
184
|
+
conditions.push('_id <> ?');
|
|
185
|
+
params.push(value.$ne);
|
|
186
|
+
}
|
|
187
|
+
// Add other _id specific operators if needed
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const jsonPath = this.parseJsonPath(key);
|
|
191
|
+
if (typeof value === 'object' && value !== null) {
|
|
192
|
+
// Handle operators like $gt, $lt, $in, $exists, $not etc.
|
|
193
|
+
for (const op in value) {
|
|
194
|
+
const opValue = value[op];
|
|
195
|
+
switch (op) {
|
|
196
|
+
case '$eq':
|
|
197
|
+
conditions.push(`json_extract(data, ${jsonPath}) = ?`);
|
|
198
|
+
params.push(opValue);
|
|
199
|
+
break;
|
|
200
|
+
case '$ne':
|
|
201
|
+
if (opValue === null) {
|
|
202
|
+
conditions.push(`json_extract(data, ${jsonPath}) IS NOT NULL`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
conditions.push(`json_extract(data, ${jsonPath}) != ?`);
|
|
206
|
+
params.push(opValue);
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
case '$gt':
|
|
210
|
+
conditions.push(`json_extract(data, ${jsonPath}) > ?`);
|
|
211
|
+
params.push(opValue);
|
|
212
|
+
break;
|
|
213
|
+
case '$gte':
|
|
214
|
+
conditions.push(`json_extract(data, ${jsonPath}) >= ?`);
|
|
215
|
+
params.push(opValue);
|
|
216
|
+
break;
|
|
217
|
+
case '$lt':
|
|
218
|
+
conditions.push(`json_extract(data, ${jsonPath}) < ?`);
|
|
219
|
+
params.push(opValue);
|
|
220
|
+
break;
|
|
221
|
+
case '$lte':
|
|
222
|
+
conditions.push(`json_extract(data, ${jsonPath}) <= ?`);
|
|
223
|
+
params.push(opValue);
|
|
224
|
+
break;
|
|
225
|
+
case '$in':
|
|
226
|
+
if (Array.isArray(opValue) && opValue.length > 0) {
|
|
227
|
+
const inConditions = opValue
|
|
228
|
+
.map(() => `json_extract(data, ${jsonPath}) = ?`)
|
|
229
|
+
.join(' OR ');
|
|
230
|
+
conditions.push(`(${inConditions})`);
|
|
231
|
+
opValue.forEach((val) => params.push(val));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
conditions.push('1=0'); // Empty $in array, nothing will match
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case '$nin':
|
|
238
|
+
if (Array.isArray(opValue) && opValue.length > 0) {
|
|
239
|
+
const ninConditions = opValue
|
|
240
|
+
.map(() => `json_extract(data, ${jsonPath}) != ?`)
|
|
241
|
+
.join(' AND ');
|
|
242
|
+
conditions.push(`(${ninConditions})`);
|
|
243
|
+
opValue.forEach((val) => params.push(val));
|
|
244
|
+
}
|
|
245
|
+
// Empty $nin array means match everything, so no condition needed
|
|
246
|
+
break;
|
|
247
|
+
case '$exists':
|
|
248
|
+
if (opValue === true) {
|
|
249
|
+
conditions.push(`json_extract(data, ${jsonPath}) IS NOT NULL`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
conditions.push(`json_extract(data, ${jsonPath}) IS NULL`);
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
case '$not':
|
|
256
|
+
// Handle negation of conditions
|
|
257
|
+
const notCondition = this.buildWhereClause({ [key]: opValue }, params);
|
|
258
|
+
conditions.push(`NOT (${notCondition})`);
|
|
259
|
+
break;
|
|
260
|
+
case '$all':
|
|
261
|
+
if (Array.isArray(opValue) && opValue.length > 0) {
|
|
262
|
+
// Check if the field is an array
|
|
263
|
+
const arrayTypeCheck = `json_type(json_extract(data, ${jsonPath})) = 'array'`;
|
|
264
|
+
// For each value in the $all array, create a subquery to check if it exists in the array
|
|
265
|
+
const allConditions = opValue
|
|
266
|
+
.map(() => {
|
|
267
|
+
return `EXISTS (SELECT 1 FROM json_each(json_extract(data, ${jsonPath})) WHERE json_each.value = ?)`;
|
|
268
|
+
})
|
|
269
|
+
.join(' AND ');
|
|
270
|
+
conditions.push(`(${arrayTypeCheck} AND ${allConditions})`);
|
|
271
|
+
opValue.forEach((val) => params.push(val));
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
conditions.push('1=0'); // Empty $all array, nothing will match
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
case '$elemMatch':
|
|
278
|
+
// Handle array element match
|
|
279
|
+
// For nested.items we need to check for conditions on the same array element
|
|
280
|
+
// Build a query that checks if there's at least one array element that satisfies all conditions
|
|
281
|
+
const arrayPath = this.parseJsonPath(key);
|
|
282
|
+
let elemMatchSubquery = `EXISTS (
|
|
283
|
+
SELECT 1
|
|
284
|
+
FROM json_each(json_extract(data, ${arrayPath})) as array_elements
|
|
285
|
+
WHERE `;
|
|
286
|
+
// Process each condition in the $elemMatch
|
|
287
|
+
if (typeof opValue === 'object' && opValue !== null) {
|
|
288
|
+
const subConditions = Object.entries(opValue)
|
|
289
|
+
.map(([sfKey, sfValue]) => {
|
|
290
|
+
if (typeof sfValue === 'object' && sfValue !== null) {
|
|
291
|
+
// Handle operators in the subfilter
|
|
292
|
+
const subOpConditions = [];
|
|
293
|
+
for (const op in sfValue) {
|
|
294
|
+
const opVal = sfValue[op];
|
|
295
|
+
switch (op) {
|
|
296
|
+
case '$eq':
|
|
297
|
+
subOpConditions.push(`json_extract(array_elements.value, '$.${sfKey}') = ?`);
|
|
298
|
+
params.push(opVal);
|
|
299
|
+
break;
|
|
300
|
+
case '$gt':
|
|
301
|
+
subOpConditions.push(`json_extract(array_elements.value, '$.${sfKey}') > ?`);
|
|
302
|
+
params.push(opVal);
|
|
303
|
+
break;
|
|
304
|
+
case '$gte':
|
|
305
|
+
subOpConditions.push(`json_extract(array_elements.value, '$.${sfKey}') >= ?`);
|
|
306
|
+
params.push(opVal);
|
|
307
|
+
break;
|
|
308
|
+
case '$lt':
|
|
309
|
+
subOpConditions.push(`json_extract(array_elements.value, '$.${sfKey}') < ?`);
|
|
310
|
+
params.push(opVal);
|
|
311
|
+
break;
|
|
312
|
+
case '$lte':
|
|
313
|
+
subOpConditions.push(`json_extract(array_elements.value, '$.${sfKey}') <= ?`);
|
|
314
|
+
params.push(opVal);
|
|
315
|
+
break;
|
|
316
|
+
// Add other operators as needed
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return subOpConditions.join(' AND ');
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// Simple equality for direct value
|
|
323
|
+
params.push(sfValue);
|
|
324
|
+
return `json_extract(array_elements.value, '$.${sfKey}') = ?`;
|
|
325
|
+
}
|
|
326
|
+
})
|
|
327
|
+
.join(' AND ');
|
|
328
|
+
elemMatchSubquery += subConditions;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// Simple equality check for the entire element
|
|
332
|
+
params.push(opValue);
|
|
333
|
+
elemMatchSubquery += `array_elements.value = ?`;
|
|
334
|
+
}
|
|
335
|
+
elemMatchSubquery += ')';
|
|
336
|
+
conditions.push(elemMatchSubquery);
|
|
337
|
+
break;
|
|
338
|
+
// Add other operators as needed
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
// Direct equality for non-object values
|
|
344
|
+
if (value === null) {
|
|
345
|
+
conditions.push(`json_extract(data, ${jsonPath}) IS NULL`);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
conditions.push(`json_extract(data, ${jsonPath}) = ?`);
|
|
349
|
+
params.push(value);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return conditions.length > 0 ? conditions.join(' AND ') : '1=1';
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DocumentWithId, UpdateFilter } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Class to handle update operations on documents
|
|
4
|
+
*/
|
|
5
|
+
export declare class UpdateOperationHandler<T extends DocumentWithId> {
|
|
6
|
+
/**
|
|
7
|
+
* Apply update operations to a document
|
|
8
|
+
* @param doc The document to modify
|
|
9
|
+
* @param update The update operations to apply
|
|
10
|
+
* @returns Whether the document was modified
|
|
11
|
+
*/
|
|
12
|
+
applyUpdateOperations(doc: Record<string, any>, update: UpdateFilter<T>): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a value matches a filter condition
|
|
15
|
+
*/
|
|
16
|
+
private matchesFilterValue;
|
|
17
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { getNestedValue, setNestedValue, unsetNestedValue } from './document-utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Class to handle update operations on documents
|
|
4
|
+
*/
|
|
5
|
+
export class UpdateOperationHandler {
|
|
6
|
+
/**
|
|
7
|
+
* Apply update operations to a document
|
|
8
|
+
* @param doc The document to modify
|
|
9
|
+
* @param update The update operations to apply
|
|
10
|
+
* @returns Whether the document was modified
|
|
11
|
+
*/
|
|
12
|
+
applyUpdateOperations(doc, update) {
|
|
13
|
+
let modified = false;
|
|
14
|
+
// Process update operators
|
|
15
|
+
for (const operator in update) {
|
|
16
|
+
const opArgs = update[operator];
|
|
17
|
+
if (!opArgs)
|
|
18
|
+
continue;
|
|
19
|
+
switch (operator) {
|
|
20
|
+
case '$set':
|
|
21
|
+
for (const path in opArgs) {
|
|
22
|
+
const value = opArgs[path];
|
|
23
|
+
setNestedValue(doc, path, value);
|
|
24
|
+
modified = true;
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
case '$unset':
|
|
28
|
+
for (const path in opArgs) {
|
|
29
|
+
unsetNestedValue(doc, path);
|
|
30
|
+
modified = true;
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
case '$inc':
|
|
34
|
+
for (const path in opArgs) {
|
|
35
|
+
const value = opArgs[path];
|
|
36
|
+
if (typeof value === 'number') {
|
|
37
|
+
const currentValue = getNestedValue(doc, path) || 0;
|
|
38
|
+
if (typeof currentValue === 'number') {
|
|
39
|
+
setNestedValue(doc, path, currentValue + value);
|
|
40
|
+
modified = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case '$push':
|
|
46
|
+
for (const path in opArgs) {
|
|
47
|
+
const value = opArgs[path];
|
|
48
|
+
const currentValue = getNestedValue(doc, path);
|
|
49
|
+
if (Array.isArray(currentValue)) {
|
|
50
|
+
if (typeof value === 'object' && value !== null && '$each' in value) {
|
|
51
|
+
if (Array.isArray(value.$each)) {
|
|
52
|
+
currentValue.push(...value.$each);
|
|
53
|
+
modified = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
currentValue.push(value);
|
|
58
|
+
modified = true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (currentValue === undefined) {
|
|
62
|
+
// If the field doesn't exist, create it as an array
|
|
63
|
+
if (typeof value === 'object' && value !== null && '$each' in value) {
|
|
64
|
+
if (Array.isArray(value.$each)) {
|
|
65
|
+
setNestedValue(doc, path, [...value.$each]);
|
|
66
|
+
modified = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
setNestedValue(doc, path, [value]);
|
|
71
|
+
modified = true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case '$pull':
|
|
77
|
+
for (const path in opArgs) {
|
|
78
|
+
const value = opArgs[path];
|
|
79
|
+
const currentValue = getNestedValue(doc, path);
|
|
80
|
+
if (Array.isArray(currentValue)) {
|
|
81
|
+
// Simple equality pull
|
|
82
|
+
const newArray = currentValue.filter((item) => {
|
|
83
|
+
if (typeof value === 'object' && value !== null) {
|
|
84
|
+
// For objects, we need to check all criteria
|
|
85
|
+
for (const key in value) {
|
|
86
|
+
if (typeof item === 'object' &&
|
|
87
|
+
item !== null &&
|
|
88
|
+
!this.matchesFilterValue(item[key], value[key])) {
|
|
89
|
+
return true; // Keep the item if it doesn't match the criteria
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return false; // Remove if all criteria match
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Simple equality check for primitives
|
|
96
|
+
return item !== value;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
if (newArray.length !== currentValue.length) {
|
|
100
|
+
setNestedValue(doc, path, newArray);
|
|
101
|
+
modified = true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return modified;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if a value matches a filter condition
|
|
112
|
+
*/
|
|
113
|
+
matchesFilterValue(value, condition) {
|
|
114
|
+
if (typeof condition === 'object' && condition !== null) {
|
|
115
|
+
// Check for operators
|
|
116
|
+
// This is a simplified version, in a real implementation you'd handle many operators
|
|
117
|
+
if ('$eq' in condition) {
|
|
118
|
+
return value === condition.$eq;
|
|
119
|
+
}
|
|
120
|
+
else if ('$ne' in condition) {
|
|
121
|
+
return value !== condition.$ne;
|
|
122
|
+
}
|
|
123
|
+
else if ('$gt' in condition) {
|
|
124
|
+
return value > condition.$gt;
|
|
125
|
+
}
|
|
126
|
+
else if ('$gte' in condition) {
|
|
127
|
+
return value >= condition.$gte;
|
|
128
|
+
}
|
|
129
|
+
else if ('$lt' in condition) {
|
|
130
|
+
return value < condition.$lt;
|
|
131
|
+
}
|
|
132
|
+
else if ('$lte' in condition) {
|
|
133
|
+
return value <= condition.$lte;
|
|
134
|
+
}
|
|
135
|
+
else if ('$in' in condition && Array.isArray(condition.$in)) {
|
|
136
|
+
return condition.$in.includes(value);
|
|
137
|
+
}
|
|
138
|
+
else if ('$nin' in condition && Array.isArray(condition.$nin)) {
|
|
139
|
+
return !condition.$nin.includes(value);
|
|
140
|
+
}
|
|
141
|
+
// For a complete implementation, handle more operators
|
|
142
|
+
}
|
|
143
|
+
// Default to simple equality
|
|
144
|
+
return value === condition;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=update-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-operations.js","sourceRoot":"","sources":["../src/update-operations.ts"],"names":[],"mappings":"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"}
|