w-orm-postgresql 1.0.7 → 1.0.9

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 CHANGED
@@ -1,428 +1,443 @@
1
- # w-orm-postgresql
2
- An operator for postgresql in nodejs.
3
-
4
- ![language](https://img.shields.io/badge/language-JavaScript-orange.svg)
5
- [![npm version](http://img.shields.io/npm/v/w-orm-postgresql.svg?style=flat)](https://npmjs.org/package/w-orm-postgresql)
6
- [![license](https://img.shields.io/npm/l/w-orm-postgresql.svg?style=flat)](https://npmjs.org/package/w-orm-postgresql)
7
- [![npm download](https://img.shields.io/npm/dt/w-orm-postgresql.svg)](https://npmjs.org/package/w-orm-postgresql)
8
- [![npm download](https://img.shields.io/npm/dm/w-orm-postgresql.svg)](https://npmjs.org/package/w-orm-postgresql)
9
- [![jsdelivr download](https://img.shields.io/jsdelivr/npm/hm/w-orm-postgresql.svg)](https://www.jsdelivr.com/package/npm/w-orm-postgresql)
10
-
11
- ## Documentation
12
- To view documentation or get support, visit [docs](https://yuda-lyu.github.io/w-orm-postgresql/WOrm.html).
13
-
14
- ## Installation
15
-
16
- ### Using npm(ES6 module):
17
- ```alias
18
- npm i w-orm-postgresql
19
- ```
20
-
21
- #### Example for collection
22
- > **Link:** [[dev source code](https://github.com/yuda-lyu/w-orm-postgresql/blob/master/g-basic.mjs)]
23
- ```alias
24
- import WOrm from './src/WOrmPostgresql.mjs'
25
- //import WOrm from './dist/w-orm-postgresql.umd.js'
26
-
27
- let opt = {
28
- url: 'postgresql://username:password@127.0.0.1:5432',
29
- db: 'worm',
30
- cl: 'users',
31
- }
32
-
33
- let rs = [
34
- {
35
- time: '2025-01-01T00:00:00Z',
36
- name: 'peter',
37
- value: 123,
38
- },
39
- {
40
- time: '2025-01-01T00:01:00Z',
41
- name: 'rosemary',
42
- value: 123.456,
43
- },
44
- {
45
- time: '2025-01-01T00:02:00Z',
46
- name: 'kettle',
47
- value: 456,
48
- },
49
- {
50
- time: '2025-01-01T00:03:00Z',
51
- name: 'peter',
52
- value: 200,
53
- },
54
- {
55
- time: '2025-01-01T00:04:00Z',
56
- name: 'rosemary',
57
- value: 123.1236,
58
- },
59
- {
60
- time: '2025-01-01T00:05:00Z',
61
- name: 'kettle',
62
- value: 488,
63
- },
64
- {
65
- time: '2025-01-01T00:06:00Z',
66
- name: 'peter',
67
- value: 125,
68
- },
69
- {
70
- time: '2025-01-01T00:07:00Z',
71
- name: 'rosemary',
72
- value: 124.76,
73
- },
74
- {
75
- time: '2025-01-01T00:08:00Z',
76
- name: 'kettle',
77
- value: 524,
78
- },
79
- {
80
- time: '2025-01-01T00:09:00Z',
81
- name: 'peter',
82
- value: 127,
83
- },
84
- {
85
- time: '2025-01-01T00:10:00Z',
86
- name: 'rosemary',
87
- value: 113.98,
88
- },
89
- {
90
- time: '2025-01-01T00:11:00Z',
91
- name: 'kettle',
92
- value: 447,
93
- },
94
- {
95
- time: '2025-01-01T00:12:00Z',
96
- name: 'peter',
97
- value: 131,
98
- },
99
- ]
100
-
101
- let rsm = [
102
- { //相同
103
- time: '2025-01-01T00:09:00Z',
104
- name: 'peter',
105
- value: 127,
106
- },
107
- { //name變更
108
- time: '2025-01-01T00:10:00Z',
109
- name: 'rosemary(modify)',
110
- value: 113.98,
111
- },
112
- { //name變更
113
- time: '2025-01-01T00:11:00Z',
114
- name: 'kettle(modify)',
115
- value: 447,
116
- },
117
- { //無name且value變更
118
- time: '2025-01-01T00:12:00Z',
119
- // name: 'peter',
120
- value: 99,
121
- },
122
- { //無time須新增且新增數據無value
123
- time: '2025-01-01T00:13:00Z',
124
- name: 'sandler',
125
- },
126
- ]
127
-
128
- let rsa = [
129
- {
130
- time: '2025-01-01T00:13:00Z',
131
- name: 'sandler',
132
- },
133
- ]
134
-
135
- async function test() {
136
-
137
- //wo
138
- let wo = WOrm(opt)
139
- // console.log('wo', wo)
140
-
141
- await wo.createTable(opt.cl, 'time', {
142
- time: '2000-01-01T00:00:00Z', //time
143
- name: 'abc', //string
144
- value: 0.1, //float
145
- })
146
- .then(function(msg) {
147
- // console.log('createTable then', msg)
148
- })
149
- .catch(function(msg) {
150
- // console.log('createTable catch', msg)
151
- })
152
-
153
- //on
154
- wo.on('change', function(mode, data, res) {
155
- console.log('change', mode)
156
- })
157
-
158
- //delAll
159
- await wo.delAll()
160
- .then(function(msg) {
161
- console.log('delAll then', msg)
162
- })
163
- .catch(function(msg) {
164
- console.log('delAll catch', msg)
165
- })
166
-
167
- //insert
168
- await wo.insert(rs)
169
- .then(function(msg) {
170
- console.log('insert then', msg)
171
- })
172
- .catch(function(msg) {
173
- console.log('insert catch', msg)
174
- })
175
-
176
- //save
177
- await wo.save(rsm, { autoInsert: false })
178
- .then(function(msg) {
179
- console.log('save then', msg)
180
- })
181
- .catch(function(msg) {
182
- console.log('save catch', msg)
183
- })
184
-
185
- //select all
186
- let ss = await wo.select()
187
- console.log('select all', ss)
188
-
189
- //select
190
- let so = await wo.select({ name: 'rosemary' })
191
- console.log('select by name', so)
192
-
193
- //select by $and, $gt, $lt
194
- let spa = await wo.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
195
- console.log('select by $and, $gt, $lt', spa)
196
-
197
- //select by $or, $gte, $lte
198
- let spb = await wo.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
199
- console.log('select by $or, $gte, $lte', spb)
200
-
201
- //select by $or, $and, $ne, $in, $nin
202
- let spc = await wo.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] })
203
- console.log('select by $or, $and, $ne, $in, $nin', spc)
204
-
205
- // //select by regex
206
- // let sr = await wo.select({ name: { $regex: 'PeT', $options: '$i' } })
207
- // console.log('selectReg', sr)
208
-
209
- //save
210
- await wo.save(rsa, { autoInsert: true })
211
- .then(function(msg) {
212
- console.log('save then', msg)
213
- })
214
- .catch(function(msg) {
215
- console.log('save catch', msg)
216
- })
217
-
218
- //del
219
- let d = {
220
- time: '2024-01-01T00:00:00Z',
221
- }
222
- await wo.del(d)
223
- .then(function(msg) {
224
- console.log('del then', msg)
225
- })
226
- .catch(function(msg) {
227
- console.log('del catch', msg)
228
- })
229
-
230
- //del
231
- let ssDel = await wo.select()
232
- let ds = ssDel.filter(function(v) {
233
- return v.name.indexOf('peter') >= 0 || v.name.indexOf('kettle') >= 0 || v.name.indexOf('sandler') >= 0
234
- })
235
- await wo.del(ds)
236
- .then(function(msg) {
237
- console.log('del then', msg)
238
- })
239
- .catch(function(msg) {
240
- console.log('del catch', msg)
241
- })
242
-
243
- //select all final
244
- let ss2 = await wo.select()
245
- console.log('select all final', ss2)
246
-
247
- //清除數據, 後續cache測試共用users表
248
- await wo.delAll()
249
-
250
- //woc, 啟用useCache
251
- let woc = WOrm({
252
- ...opt,
253
- useCache: true,
254
- })
255
-
256
- let rsc = [
257
- {
258
- time: '2025-01-01T00:00:00Z',
259
- name: 'peter',
260
- value: 123,
261
- },
262
- {
263
- time: '2025-01-01T00:01:00Z',
264
- name: 'rosemary',
265
- value: 123.456,
266
- },
267
- {
268
- time: '2025-01-01T00:02:00Z',
269
- name: 'kettle',
270
- value: 456,
271
- },
272
- ]
273
-
274
- let rscm = [
275
- {
276
- time: '2025-01-01T00:01:00Z',
277
- name: 'rosemary(modify)',
278
- value: 654.321,
279
- },
280
- ]
281
-
282
- //insert
283
- await woc.insert(rsc)
284
-
285
- //select all (1st time, 從DB讀取並填入快取)
286
- let sc1 = await woc.select()
287
- sc1 = sc1.sort((a, b) => a.time - b.time)
288
- console.log('select all 1st (fill cache)', sc1)
289
-
290
- //select all (2nd time, 命中快取, 內容須與第一次相同)
291
- let sc2 = await woc.select()
292
- sc2 = sc2.sort((a, b) => a.time - b.time)
293
- console.log('select all 2nd (cache hit)', sc2)
294
-
295
- //save (更新rosemary, 觸發快取重設)
296
- await woc.save(rscm, { autoInsert: false })
297
- .then(function(msg) {
298
- console.log('save (invalidate cache) then', msg)
299
- })
300
- .catch(function(msg) {
301
- console.log('save (invalidate cache) catch', msg)
302
- })
303
-
304
- //select all (3rd time, 快取已重設, 從DB重新讀取, 須反映rosemary更新)
305
- let sc3 = await woc.select()
306
- sc3 = sc3.sort((a, b) => a.time - b.time)
307
- console.log('select all 3rd (reload after save)', sc3)
308
-
309
- }
310
- test()
311
- // change delAll
312
- // delAll then { n: 5, nDeleted: 5, ok: 1 }
313
- // change insert
314
- // insert then { n: 13, nInserted: 13, ok: 1 }
315
- // change save
316
- // save then [
317
- // { n: 1, nModified: 0, ok: 1 },
318
- // { n: 1, nModified: 1, ok: 1 },
319
- // { n: 1, nModified: 1, ok: 1 },
320
- // { n: 1, nModified: 1, ok: 1 },
321
- // { n: 0, nModified: 0, ok: 1 }
322
- // ]
323
- // select all [
324
- // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
325
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
326
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
327
- // { time: 2025-01-01T00:03:00.000Z, name: 'peter', value: 200 },
328
- // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
329
- // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
330
- // { time: 2025-01-01T00:06:00.000Z, name: 'peter', value: 125 },
331
- // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
332
- // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
333
- // { time: 2025-01-01T00:09:00.000Z, name: 'peter', value: 127 },
334
- // {
335
- // time: 2025-01-01T00:10:00.000Z,
336
- // name: 'rosemary(modify)',
337
- // value: 113.98
338
- // },
339
- // {
340
- // time: 2025-01-01T00:11:00.000Z,
341
- // name: 'kettle(modify)',
342
- // value: 447
343
- // },
344
- // { time: 2025-01-01T00:12:00.000Z, name: 'peter', value: 99 }
345
- // ]
346
- // select by name [
347
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
348
- // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
349
- // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 }
350
- // ]
351
- // select by $and, $gt, $lt [
352
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
353
- // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
354
- // { time: 2025-01-01T00:06:00.000Z, name: 'peter', value: 125 },
355
- // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
356
- // { time: 2025-01-01T00:09:00.000Z, name: 'peter', value: 127 }
357
- // ]
358
- // select by $or, $gte, $lte [
359
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
360
- // { time: 2025-01-01T00:03:00.000Z, name: 'peter', value: 200 },
361
- // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
362
- // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
363
- // {
364
- // time: 2025-01-01T00:11:00.000Z,
365
- // name: 'kettle(modify)',
366
- // value: 447
367
- // }
368
- // ]
369
- // select by $or, $and, $ne, $in, $nin [
370
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
371
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
372
- // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
373
- // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
374
- // {
375
- // time: 2025-01-01T00:11:00.000Z,
376
- // name: 'kettle(modify)',
377
- // value: 447
378
- // }
379
- // ]
380
- // change save
381
- // save then [ { n: 1, nInserted: 1, ok: 1 } ]
382
- // change del
383
- // del then [ { n: 1, nDeleted: 0, ok: 1 } ]
384
- // change del
385
- // del then [
386
- // { n: 1, nDeleted: 1, ok: 1 },
387
- // { n: 1, nDeleted: 1, ok: 1 },
388
- // { n: 1, nDeleted: 1, ok: 1 },
389
- // { n: 1, nDeleted: 1, ok: 1 },
390
- // { n: 1, nDeleted: 1, ok: 1 },
391
- // { n: 1, nDeleted: 1, ok: 1 },
392
- // { n: 1, nDeleted: 1, ok: 1 },
393
- // { n: 1, nDeleted: 1, ok: 1 },
394
- // { n: 1, nDeleted: 1, ok: 1 },
395
- // { n: 1, nDeleted: 1, ok: 1 }
396
- // ]
397
- // select all final [
398
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
399
- // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
400
- // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
401
- // {
402
- // time: 2025-01-01T00:10:00.000Z,
403
- // name: 'rosemary(modify)',
404
- // value: 113.98
405
- // }
406
- // ]
407
- // change delAll
408
- // select all 1st (fill cache) [
409
- // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
410
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
411
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
412
- // ]
413
- // select all 2nd (cache hit) [
414
- // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
415
- // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
416
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
417
- // ]
418
- // save (invalidate cache) then [ { n: 1, nModified: 1, ok: 1 } ]
419
- // select all 3rd (reload after save) [
420
- // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
421
- // {
422
- // time: 2025-01-01T00:01:00.000Z,
423
- // name: 'rosemary(modify)',
424
- // value: 654.321
425
- // },
426
- // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
427
- // ]
428
- ```
1
+ # w-orm-postgresql
2
+ An operator for postgresql in nodejs.
3
+
4
+ ![language](https://img.shields.io/badge/language-JavaScript-orange.svg)
5
+ [![npm version](http://img.shields.io/npm/v/w-orm-postgresql.svg?style=flat)](https://npmjs.org/package/w-orm-postgresql)
6
+ [![license](https://img.shields.io/npm/l/w-orm-postgresql.svg?style=flat)](https://npmjs.org/package/w-orm-postgresql)
7
+ [![npm download](https://img.shields.io/npm/dt/w-orm-postgresql.svg)](https://npmjs.org/package/w-orm-postgresql)
8
+ [![npm download](https://img.shields.io/npm/dm/w-orm-postgresql.svg)](https://npmjs.org/package/w-orm-postgresql)
9
+ [![jsdelivr download](https://img.shields.io/jsdelivr/npm/hm/w-orm-postgresql.svg)](https://www.jsdelivr.com/package/npm/w-orm-postgresql)
10
+
11
+ ## Documentation
12
+ To view documentation or get support, visit [docs](https://yuda-lyu.github.io/w-orm-postgresql/WOrm.html).
13
+
14
+ ## Installation
15
+
16
+ ### Using npm(ES6 module):
17
+ ```alias
18
+ npm i w-orm-postgresql
19
+ ```
20
+
21
+ #### Example for collection
22
+ > **Link:** [[dev source code](https://github.com/yuda-lyu/w-orm-postgresql/blob/master/g-basic.mjs)]
23
+ ```alias
24
+ import WOrm from './src/WOrmPostgresql.mjs'
25
+ //import WOrm from './dist/w-orm-postgresql.umd.js'
26
+
27
+
28
+ let opt = {
29
+ url: 'postgresql://username:password@127.0.0.1:5432',
30
+ db: 'worm',
31
+ cl: 'users',
32
+ }
33
+
34
+ let rs = [
35
+ {
36
+ time: '2025-01-01T00:00:00Z',
37
+ name: 'peter',
38
+ value: 123,
39
+ },
40
+ {
41
+ time: '2025-01-01T00:01:00Z',
42
+ name: 'rosemary',
43
+ value: 123.456,
44
+ },
45
+ {
46
+ time: '2025-01-01T00:02:00Z',
47
+ name: 'kettle',
48
+ value: 456,
49
+ },
50
+ {
51
+ time: '2025-01-01T00:03:00Z',
52
+ name: 'peter',
53
+ value: 200,
54
+ },
55
+ {
56
+ time: '2025-01-01T00:04:00Z',
57
+ name: 'rosemary',
58
+ value: 123.1236,
59
+ },
60
+ {
61
+ time: '2025-01-01T00:05:00Z',
62
+ name: 'kettle',
63
+ value: 488,
64
+ },
65
+ {
66
+ time: '2025-01-01T00:06:00Z',
67
+ name: 'peter',
68
+ value: 125,
69
+ },
70
+ {
71
+ time: '2025-01-01T00:07:00Z',
72
+ name: 'rosemary',
73
+ value: 124.76,
74
+ },
75
+ {
76
+ time: '2025-01-01T00:08:00Z',
77
+ name: 'kettle',
78
+ value: 524,
79
+ },
80
+ {
81
+ time: '2025-01-01T00:09:00Z',
82
+ name: 'peter',
83
+ value: 127,
84
+ },
85
+ {
86
+ time: '2025-01-01T00:10:00Z',
87
+ name: 'rosemary',
88
+ value: 113.98,
89
+ },
90
+ {
91
+ time: '2025-01-01T00:11:00Z',
92
+ name: 'kettle',
93
+ value: 447,
94
+ },
95
+ {
96
+ time: '2025-01-01T00:12:00Z',
97
+ name: 'peter',
98
+ value: 131,
99
+ },
100
+ ]
101
+
102
+ let rsm = [
103
+ { //相同
104
+ time: '2025-01-01T00:09:00Z',
105
+ name: 'peter',
106
+ value: 127,
107
+ },
108
+ { //name變更
109
+ time: '2025-01-01T00:10:00Z',
110
+ name: 'rosemary(modify)',
111
+ value: 113.98,
112
+ },
113
+ { //name變更
114
+ time: '2025-01-01T00:11:00Z',
115
+ name: 'kettle(modify)',
116
+ value: 447,
117
+ },
118
+ { //無name且value變更
119
+ time: '2025-01-01T00:12:00Z',
120
+ // name: 'peter',
121
+ value: 99,
122
+ },
123
+ { //無time須新增且新增數據無value
124
+ time: '2025-01-01T00:13:00Z',
125
+ name: 'sandler',
126
+ },
127
+ ]
128
+
129
+ let rsa = [
130
+ {
131
+ time: '2025-01-01T00:13:00Z',
132
+ name: 'sandler',
133
+ },
134
+ ]
135
+
136
+ async function test() {
137
+
138
+ //wo
139
+ let wo = WOrm(opt)
140
+ // console.log('wo', wo)
141
+
142
+ await wo.createTable(opt.cl, 'time', {
143
+ time: '2000-01-01T00:00:00Z', //time
144
+ name: 'abc', //string
145
+ value: 0.1, //float
146
+ })
147
+ .then(function(msg) {
148
+ // console.log('createTable then', msg)
149
+ })
150
+ .catch(function(msg) {
151
+ // console.log('createTable catch', msg)
152
+ })
153
+
154
+ //on
155
+ wo.on('change', function(mode, data, res) {
156
+ console.log('change', mode)
157
+ })
158
+
159
+ //delAll
160
+ await wo.delAll()
161
+ .then(function(msg) {
162
+ console.log('delAll then', msg)
163
+ })
164
+ .catch(function(msg) {
165
+ console.log('delAll catch', msg)
166
+ })
167
+
168
+ //insert
169
+ await wo.insert(rs)
170
+ .then(function(msg) {
171
+ console.log('insert then', msg)
172
+ })
173
+ .catch(function(msg) {
174
+ console.log('insert catch', msg)
175
+ })
176
+
177
+ //save
178
+ await wo.save(rsm, { autoInsert: false })
179
+ .then(function(msg) {
180
+ console.log('save then', msg)
181
+ })
182
+ .catch(function(msg) {
183
+ console.log('save catch', msg)
184
+ })
185
+
186
+ //select all
187
+ let ss = await wo.select()
188
+ console.log('select all', ss)
189
+
190
+ //select
191
+ let so = await wo.select({ name: 'rosemary' })
192
+ console.log('select by name', so)
193
+
194
+ //selectByTime
195
+ let sb = await wo.selectByTime('2025-01-01T00:10:00Z')
196
+ console.log('selectByTime', sb)
197
+
198
+ //selectByTime by time not existed
199
+ let sbn = await wo.selectByTime('2024-01-01T00:00:00Z')
200
+ console.log('selectByTime by time not existed', sbn)
201
+
202
+ //select by $and, $gt, $lt
203
+ let spa = await wo.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
204
+ console.log('select by $and, $gt, $lt', spa)
205
+
206
+ //select by $or, $gte, $lte
207
+ let spb = await wo.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
208
+ console.log('select by $or, $gte, $lte', spb)
209
+
210
+ //select by $or, $and, $ne, $in, $nin
211
+ let spc = await wo.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] })
212
+ console.log('select by $or, $and, $ne, $in, $nin', spc)
213
+
214
+ // //select by regex
215
+ // let sr = await wo.select({ name: { $regex: 'PeT', $options: '$i' } })
216
+ // console.log('selectReg', sr)
217
+
218
+ //save
219
+ await wo.save(rsa, { autoInsert: true })
220
+ .then(function(msg) {
221
+ console.log('save then', msg)
222
+ })
223
+ .catch(function(msg) {
224
+ console.log('save catch', msg)
225
+ })
226
+
227
+ //del
228
+ let d = {
229
+ time: '2024-01-01T00:00:00Z',
230
+ }
231
+ await wo.del(d)
232
+ .then(function(msg) {
233
+ console.log('del then', msg)
234
+ })
235
+ .catch(function(msg) {
236
+ console.log('del catch', msg)
237
+ })
238
+
239
+ //del
240
+ let ssDel = await wo.select()
241
+ let ds = ssDel.filter(function(v) {
242
+ return v.name.indexOf('peter') >= 0 || v.name.indexOf('kettle') >= 0 || v.name.indexOf('sandler') >= 0
243
+ })
244
+ await wo.del(ds)
245
+ .then(function(msg) {
246
+ console.log('del then', msg)
247
+ })
248
+ .catch(function(msg) {
249
+ console.log('del catch', msg)
250
+ })
251
+
252
+ //select all final
253
+ let ss2 = await wo.select()
254
+ console.log('select all final', ss2)
255
+
256
+ //清除數據, 後續cache測試共用users表
257
+ await wo.delAll()
258
+
259
+ //woc, 啟用useCache
260
+ let woc = WOrm({
261
+ ...opt,
262
+ useCache: true,
263
+ })
264
+
265
+ let rsc = [
266
+ {
267
+ time: '2025-01-01T00:00:00Z',
268
+ name: 'peter',
269
+ value: 123,
270
+ },
271
+ {
272
+ time: '2025-01-01T00:01:00Z',
273
+ name: 'rosemary',
274
+ value: 123.456,
275
+ },
276
+ {
277
+ time: '2025-01-01T00:02:00Z',
278
+ name: 'kettle',
279
+ value: 456,
280
+ },
281
+ ]
282
+
283
+ let rscm = [
284
+ {
285
+ time: '2025-01-01T00:01:00Z',
286
+ name: 'rosemary(modify)',
287
+ value: 654.321,
288
+ },
289
+ ]
290
+
291
+ //insert
292
+ await woc.insert(rsc)
293
+
294
+ //select all (1st time, 從DB讀取並填入快取)
295
+ let sc1 = await woc.select()
296
+ sc1 = sc1.sort((a, b) => a.time - b.time)
297
+ console.log('select all 1st (fill cache)', sc1)
298
+
299
+ //select all (2nd time, 命中快取, 內容須與第一次相同)
300
+ let sc2 = await woc.select()
301
+ sc2 = sc2.sort((a, b) => a.time - b.time)
302
+ console.log('select all 2nd (cache hit)', sc2)
303
+
304
+ //save (更新rosemary, 觸發快取重設)
305
+ await woc.save(rscm, { autoInsert: false })
306
+ .then(function(msg) {
307
+ console.log('save (invalidate cache) then', msg)
308
+ })
309
+ .catch(function(msg) {
310
+ console.log('save (invalidate cache) catch', msg)
311
+ })
312
+
313
+ //select all (3rd time, 快取已重設, 從DB重新讀取, 須反映rosemary更新)
314
+ let sc3 = await woc.select()
315
+ sc3 = sc3.sort((a, b) => a.time - b.time)
316
+ console.log('select all 3rd (reload after save)', sc3)
317
+
318
+ }
319
+ test()
320
+ // change delAll
321
+ // delAll then { n: 0, nDeleted: 0, ok: 1 }
322
+ // change insert
323
+ // insert then { n: 13, nInserted: 13, ok: 1 }
324
+ // change save
325
+ // save then [
326
+ // { n: 1, nInserted: 0, nModified: 0, ok: 1 },
327
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
328
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
329
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
330
+ // { n: 0, nInserted: 0, nModified: 0, ok: 1 }
331
+ // ]
332
+ // select all [
333
+ // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
334
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
335
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
336
+ // { time: 2025-01-01T00:03:00.000Z, name: 'peter', value: 200 },
337
+ // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
338
+ // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
339
+ // { time: 2025-01-01T00:06:00.000Z, name: 'peter', value: 125 },
340
+ // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
341
+ // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
342
+ // { time: 2025-01-01T00:09:00.000Z, name: 'peter', value: 127 },
343
+ // {
344
+ // time: 2025-01-01T00:10:00.000Z,
345
+ // name: 'rosemary(modify)',
346
+ // value: 113.98
347
+ // },
348
+ // {
349
+ // time: 2025-01-01T00:11:00.000Z,
350
+ // name: 'kettle(modify)',
351
+ // value: 447
352
+ // },
353
+ // { time: 2025-01-01T00:12:00.000Z, name: 'peter', value: 99 }
354
+ // ]
355
+ // select by name [
356
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
357
+ // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
358
+ // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 }
359
+ // ]
360
+ // selectByTime {
361
+ // time: 2025-01-01T00:10:00.000Z,
362
+ // name: 'rosemary(modify)',
363
+ // value: 113.98
364
+ // }
365
+ // selectByTime by time not existed null
366
+ // select by $and, $gt, $lt [
367
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
368
+ // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
369
+ // { time: 2025-01-01T00:06:00.000Z, name: 'peter', value: 125 },
370
+ // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
371
+ // { time: 2025-01-01T00:09:00.000Z, name: 'peter', value: 127 }
372
+ // ]
373
+ // select by $or, $gte, $lte [
374
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
375
+ // { time: 2025-01-01T00:03:00.000Z, name: 'peter', value: 200 },
376
+ // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
377
+ // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
378
+ // {
379
+ // time: 2025-01-01T00:11:00.000Z,
380
+ // name: 'kettle(modify)',
381
+ // value: 447
382
+ // }
383
+ // ]
384
+ // select by $or, $and, $ne, $in, $nin [
385
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
386
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 },
387
+ // { time: 2025-01-01T00:05:00.000Z, name: 'kettle', value: 488 },
388
+ // { time: 2025-01-01T00:08:00.000Z, name: 'kettle', value: 524 },
389
+ // {
390
+ // time: 2025-01-01T00:11:00.000Z,
391
+ // name: 'kettle(modify)',
392
+ // value: 447
393
+ // }
394
+ // ]
395
+ // change save
396
+ // save then [ { n: 1, nInserted: 1, nModified: 0, ok: 1 } ]
397
+ // change del
398
+ // del then [ { n: 0, nDeleted: 0, ok: 1 } ]
399
+ // change del
400
+ // del then [
401
+ // { n: 1, nDeleted: 1, ok: 1 },
402
+ // { n: 1, nDeleted: 1, ok: 1 },
403
+ // { n: 1, nDeleted: 1, ok: 1 },
404
+ // { n: 1, nDeleted: 1, ok: 1 },
405
+ // { n: 1, nDeleted: 1, ok: 1 },
406
+ // { n: 1, nDeleted: 1, ok: 1 },
407
+ // { n: 1, nDeleted: 1, ok: 1 },
408
+ // { n: 1, nDeleted: 1, ok: 1 },
409
+ // { n: 1, nDeleted: 1, ok: 1 },
410
+ // { n: 1, nDeleted: 1, ok: 1 }
411
+ // ]
412
+ // select all final [
413
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
414
+ // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
415
+ // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 },
416
+ // {
417
+ // time: 2025-01-01T00:10:00.000Z,
418
+ // name: 'rosemary(modify)',
419
+ // value: 113.98
420
+ // }
421
+ // ]
422
+ // change delAll
423
+ // select all 1st (fill cache) [
424
+ // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
425
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
426
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
427
+ // ]
428
+ // select all 2nd (cache hit) [
429
+ // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
430
+ // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
431
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
432
+ // ]
433
+ // save (invalidate cache) then [ { n: 1, nInserted: 0, nModified: 1, ok: 1 } ]
434
+ // select all 3rd (reload after save) [
435
+ // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
436
+ // {
437
+ // time: 2025-01-01T00:01:00.000Z,
438
+ // name: 'rosemary(modify)',
439
+ // value: 654.321
440
+ // },
441
+ // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
442
+ // ]
443
+ ```