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.
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li><li data-type='method'><a href="WOrmPostgresql.html#.selectByTime">selectByTime</a></li></ul></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -415,11 +415,131 @@ function WOrmPostgresql(opt = {}) {
415
415
  }
416
416
 
417
417
  /**
418
- * 插入數據
418
+ * 由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳
419
+ *
420
+ * 函數名依主鍵欄位命名為selectByTime而不另掛selectById別名,因本套件之主鍵為具業務語義之time,
421
+ * 與以無語義識別碼為主鍵者性質不同,該差異須由呼叫端知悉而非由別名掩蓋。
422
+ * 主鍵未命中或主鍵值無效皆回傳null而不reject,命中之判定基準與insert、save、del內對既有數據之認定一致。
423
+ *
424
+ * @memberOf WOrmPostgresql
425
+ * @param {String|Date} time 輸入主鍵time值,本套件以time欄位為主鍵
426
+ * @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息
427
+ */
428
+ async function selectByTime(time) {
429
+ let isErr = false
430
+ let res = null
431
+
432
+ //check
433
+ if (!isDate(time)) {
434
+ //未給有效主鍵值視為查無數據, 判定基準與insert、save、del內對time之認定一致
435
+ return null
436
+ }
437
+
438
+ //find, 本套件以time欄位為主鍵, 與save、del、genConflictSQL之認定一致
439
+ let find = {
440
+ time,
441
+ }
442
+
443
+ //cache, 與select共用快取, 因快取鍵值由find與order組成, 故此處等同select(find)之結果
444
+ if (useCache) {
445
+ let cache = getCache(find, {})
446
+ if (isarr(cache)) {
447
+ return get(cache, 0, null)
448
+ }
449
+ }
450
+
451
+ //client
452
+ let client = new PgClient({ connectionString })
453
+
454
+ //connect
455
+ try {
456
+
457
+ //connect
458
+ await client.connect()
459
+
460
+ }
461
+ catch (err) {
462
+ isErr = true
463
+ res = err
464
+ client = null
465
+ }
466
+
467
+ //check
468
+ if (isErr) {
469
+ return Promise.reject(res)
470
+ }
471
+
472
+ try {
473
+
474
+ //mr, 不使用limit以令結果與select(find)完全等價, 方能安全共用快取,
475
+ //time為主鍵時本就僅回傳1筆, 不會因此多拉數據
476
+ let mr = mongoSql.sql({
477
+ type: 'select',
478
+ table: cl,
479
+ where: find,
480
+ })
481
+ // console.log('mr', mr)
482
+ // console.log('mr.query', mr.query)
483
+ // console.log('mr.values', mr.values)
484
+
485
+ //select
486
+ let r = await client.query(mr.query, mr.values)
487
+ // console.log('r', r)
488
+
489
+ //rows
490
+ let rows = get(r, 'rows')
491
+
492
+ //check
493
+ if (!isarr(rows)) {
494
+ throw new Error(`can not select by time[${time}]`)
495
+ }
496
+
497
+ //cache
498
+ if (useCache) {
499
+ setCache(find, {}, rows)
500
+ }
501
+
502
+ //v
503
+ let v = get(rows, 0, null)
504
+
505
+ //check, 判定基準與save、del內對既有數據之認定一致
506
+ if (iseobj(v)) {
507
+ res = v
508
+ }
509
+ else {
510
+ //不存在time, 回傳null
511
+ res = null
512
+ }
513
+
514
+ }
515
+ catch (err) {
516
+ isErr = true
517
+ res = err
518
+ }
519
+ finally {
520
+ await client.end()
521
+ client = null
522
+ }
523
+ // console.log('res', res)
524
+
525
+ //check
526
+ if (isErr) {
527
+ return Promise.reject(res)
528
+ }
529
+
530
+ return res
531
+ }
532
+
533
+ /**
534
+ * 插入數據,僅於主鍵time不存在時寫入,已存在者跳過且不覆寫
535
+ *
536
+ * n為輸入筆數,即本次嘗試插入之基準;nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果,
537
+ * 不視為錯誤。同批含重複time時僅首筆計入nInserted。
538
+ * 因主鍵time承載觀測時間之業務意義,未帶有效time時不自動補值,一律以reject回報。
419
539
  *
420
540
  * @memberOf WOrmPostgresql
421
541
  * @param {Object|Array} data 輸入數據物件或陣列
422
- * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
542
+ * @returns {Promise} 回傳Promise,resolve回傳插入結果物件{n,nInserted,ok},reject回傳錯誤訊息
423
543
  */
424
544
  async function insert(data) {
425
545
  let isErr = false
@@ -483,18 +603,22 @@ function WOrmPostgresql(opt = {}) {
483
603
  // console.log('mr.query', mr.query)
484
604
  // console.log('mr.values', mr.values)
485
605
 
486
- //nAll, nInsert
606
+ //添加conflict, 令已存在time者跳過而不中斷整批插入, 主鍵認定與genConflictSQL一致
607
+ //由PostgreSQL於單一語句內原子完成[檢查time未存在]與[寫入], 併發時同一time僅有一次成功,
608
+ //同批含重複time時亦僅首筆成功, 故不須逐筆插入即可取得實際插入筆數
609
+ let sql = `${mr.query} ON CONFLICT (time) DO NOTHING`
610
+
611
+ //nAll
487
612
  let nAll = size(data)
488
- let nInsert = nAll //一次插入全部數據加速, 但也因此沒法個別處理conflict, 無法個別計算已插入數量
489
613
 
490
- //insert
491
- await client.query(mr.query, mr.values)
492
- .then(() => {
614
+ //insert, ON CONFLICT DO NOTHING時rowCount即為實際插入筆數
615
+ await client.query(sql, mr.values)
616
+ .then((r) => {
493
617
 
494
618
  //res
495
619
  res = {
496
620
  n: nAll,
497
- nInserted: nInsert,
621
+ nInserted: r.rowCount,
498
622
  ok: 1,
499
623
  }
500
624
 
@@ -538,13 +662,21 @@ function WOrmPostgresql(opt = {}) {
538
662
  }
539
663
 
540
664
  /**
541
- * 儲存數據
665
+ * 儲存數據,以主鍵time為準更新既有數據,未給之欄位保留
666
+ *
667
+ * 回傳陣列恆與輸入等長,輸入單一物件亦回傳長度1之陣列。
668
+ * 各筆之n為主鍵命中筆數,值為0或1,命中(不論內容有無變更)或經插入而產生皆為1;
669
+ * nInserted與nModified恆同時出現,無對應行為時填0。
670
+ * [內容相同]之判定基準為待寫入物件合併進現值後與現值相同,非待寫入物件與現值全等,
671
+ * 故只給部份欄位且該些欄位值皆與現值相同時,合併結果等於現值,nModified為0,
672
+ * 令nModified忠實反映資料庫端是否真的寫入。
673
+ * 因主鍵time承載觀測時間之業務意義,未帶有效time時不自動補值,一律以reject回報。
542
674
  *
543
675
  * @memberOf WOrmPostgresql
544
676
  * @param {Object|Array} data 輸入數據物件或陣列
545
677
  * @param {Object} [option={}] 輸入設定物件,預設為{}
546
678
  * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
547
- * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
679
+ * @returns {Promise} 回傳Promise,resolve回傳儲存結果陣列[{n,nInserted,nModified,ok}],reject回傳錯誤訊息
548
680
  */
549
681
  async function save(data, option = {}) {
550
682
  let isErr = false
@@ -635,98 +767,160 @@ function WOrmPostgresql(opt = {}) {
635
767
 
636
768
  }
637
769
 
638
- //check
770
+ //快速路徑, 先不寫入直接由前述預讀判斷內容是否相同, 內容相同者本就不須寫入,
771
+ //預讀值縱使已被其他寫入者更動而過期亦不影響正確性, 因內容相同時本次save等價於無操作,
772
+ //無操作可視為於預讀當下即已完成, 其後他人之寫入結果與[本次save先執行再輪到他人]相同
639
773
  if (iseobj(_v)) {
640
- //存在
641
774
 
642
775
  //_vt
643
776
  let _vt = omit(_v, 'time')
644
777
  // console.log('_vt', _vt)
645
778
 
646
- //vt
647
- let vt = omit(v, 'time')
779
+ //vt, [內容相同]之判定基準為[待寫入物件合併進現值後與現值相同],
780
+ //非[待寫入物件與現值全等], 故只給部份欄位且該些欄位值皆與現值相同時視為相同而不寫入,
781
+ //合併採淺層覆蓋, 與後端以EXCLUDED整欄取代之寫入行為一致
782
+ let vt = {
783
+ ..._vt,
784
+ ...omit(v, 'time'),
785
+ }
648
786
  // console.log('vt', vt)
649
787
 
650
- if (isEqual(_vt, vt)) {
788
+ if (isEqual(vt, _vt)) {
651
789
  //相同時不更新
652
790
 
653
791
  //rest
654
792
  rest = {
655
793
  n: 1,
794
+ nInserted: 0,
656
795
  nModified: 0,
657
796
  ok: 1,
658
797
  }
659
798
  // console.log('相同時不更新', rest, v)
660
799
 
800
+ return rest
661
801
  }
662
- else {
663
- //不相同時須更新
664
-
665
- //mr
666
- let mr = mongoSql.sql({
667
- type: 'insert',
668
- table: cl,
669
- values: v,
670
- })
671
- // console.log('mr', mr)
672
- // console.log('mr.query', mr.query)
673
- // console.log('mr.values', mr.values)
674
802
 
675
- //添加conflict
676
- let conflict = genConflictSQL(v)
803
+ }
804
+ else {
805
+
806
+ //check
807
+ if (!autoInsert) {
808
+ //不存在且未開啟autoInsert則不寫入
809
+
810
+ //rest
811
+ rest = {
812
+ n: 0,
813
+ nInserted: 0,
814
+ nModified: 0,
815
+ ok: 1,
816
+ }
817
+ // console.log('不存在', rest, v)
818
+
819
+ return rest
820
+ }
821
+
822
+ }
823
+
824
+ //check
825
+ if (autoInsert) {
826
+ //由PostgreSQL於單一語句內原子完成[查找time]與[插入或更新],
827
+ //併發時不會因他方已先插入同一time而報錯, 亦不會有兩方各自讀到同一舊值再各自寫入
828
+
829
+ //mr
830
+ let mr = mongoSql.sql({
831
+ type: 'insert',
832
+ table: cl,
833
+ values: v,
834
+ })
835
+ // console.log('mr', mr)
836
+ // console.log('mr.query', mr.query)
837
+ // console.log('mr.values', mr.values)
838
+
839
+ //添加conflict, 僅有time欄位時genConflictSQL無可更新欄位而回傳空字串,
840
+ //此時退回DO NOTHING, 以免併發插入同一time者報錯
841
+ let conflict = genConflictSQL(v)
842
+ if (!isestr(conflict)) {
843
+ conflict = 'ON CONFLICT (time) DO NOTHING'
844
+ }
677
845
 
678
- //sql
679
- let sql = `${mr.query} ${conflict}`
846
+ //sql, xmax為0表該列由本語句插入, 非0表係由DO UPDATE更新而來,
847
+ //衝突且落入DO NOTHING時不回傳任何列, 代表該time已存在且未變更
848
+ let sql = `${mr.query} ${conflict} RETURNING (xmax = 0) AS inserted`
680
849
 
681
- //save
682
- await client.query(sql, mr.values)
683
- .then(() => {
850
+ //save
851
+ await client.query(sql, mr.values)
852
+ .then((r) => {
853
+
854
+ //rows
855
+ let rows = get(r, 'rows')
856
+
857
+ //check
858
+ if (!isearr(rows)) {
859
+ //衝突且未更新
684
860
 
685
861
  //rest
686
862
  rest = {
687
863
  n: 1,
688
- nModified: 1,
864
+ nInserted: 0,
865
+ nModified: 0,
689
866
  ok: 1,
690
867
  }
691
- // console.log('不相同時須更新', rest, vt)
692
868
 
693
- })
694
- .catch((err) => {
869
+ }
870
+ else if (get(rows, '0.inserted') === true) {
871
+ //原不存在而插入
695
872
 
696
873
  //rest
697
874
  rest = {
698
875
  n: 1,
876
+ nInserted: 1,
699
877
  nModified: 0,
700
- ok: 0,
701
- err: err.message,
878
+ ok: 1,
702
879
  }
880
+ // console.log('之前不存在且可自動插入', rest, v)
703
881
 
704
- })
882
+ }
883
+ else {
884
+ //原已存在而更新
705
885
 
706
- }
707
- }
708
- else {
709
- //不存在
886
+ //rest
887
+ rest = {
888
+ n: 1,
889
+ nInserted: 0,
890
+ nModified: 1,
891
+ ok: 1,
892
+ }
893
+ // console.log('不相同時須更新', rest, v)
710
894
 
711
- //rest
712
- rest = {
713
- n: 0,
714
- nModified: 0,
715
- ok: 1,
716
- }
717
- // console.log('不存在', rest, v)
895
+ }
718
896
 
719
- }
897
+ })
898
+ .catch((err) => {
720
899
 
721
- //autoInsert
722
- if (autoInsert &amp;&amp; rest.n === 0) {
723
- //之前不存在(rest.n)且可自動插入(autoInsert=true)
900
+ //rest
901
+ rest = {
902
+ n: 1,
903
+ nInserted: 0,
904
+ nModified: 0,
905
+ ok: 0,
906
+ err: err.message,
907
+ }
908
+
909
+ })
910
+
911
+ }
912
+ else {
913
+ //未開啟autoInsert則僅能更新既有數據, 不可用INSERT以免無中生有,
914
+ //由UPDATE...WHERE time原子完成[查找time]與[更新], 併發時不會遺失更新
724
915
 
725
916
  //mr
726
917
  let mr = mongoSql.sql({
727
- type: 'insert',
918
+ type: 'update',
728
919
  table: cl,
729
- values: v,
920
+ updates: omit(v, 'time'),
921
+ where: {
922
+ time: v.time,
923
+ },
730
924
  })
731
925
  // console.log('mr', mr)
732
926
  // console.log('mr.query', mr.query)
@@ -734,15 +928,34 @@ function WOrmPostgresql(opt = {}) {
734
928
 
735
929
  //save
736
930
  await client.query(mr.query, mr.values)
737
- .then(() => {
931
+ .then((r) => {
932
+
933
+ //check
934
+ if (r.rowCount > 0) {
935
+ //已更新
936
+
937
+ //rest
938
+ rest = {
939
+ n: 1,
940
+ nInserted: 0,
941
+ nModified: 1,
942
+ ok: 1,
943
+ }
944
+ // console.log('不相同時須更新', rest, v)
945
+
946
+ }
947
+ else {
948
+ //預讀後至更新前已被他人刪除, 視為不存在
949
+
950
+ //rest
951
+ rest = {
952
+ n: 0,
953
+ nInserted: 0,
954
+ nModified: 0,
955
+ ok: 1,
956
+ }
738
957
 
739
- //rest
740
- rest = {
741
- n: 1,
742
- nInserted: 1,
743
- ok: 1,
744
958
  }
745
- // console.log('之前不存在且可自動插入', rest, v)
746
959
 
747
960
  })
748
961
  .catch((err) => {
@@ -751,6 +964,7 @@ function WOrmPostgresql(opt = {}) {
751
964
  rest = {
752
965
  n: 1,
753
966
  nInserted: 0,
967
+ nModified: 0,
754
968
  ok: 0,
755
969
  err: err.message,
756
970
  }
@@ -798,9 +1012,14 @@ function WOrmPostgresql(opt = {}) {
798
1012
  /**
799
1013
  * 刪除數據
800
1014
  *
1015
+ * 回傳陣列恆與輸入等長,各筆之n與nDeleted皆為主鍵命中筆數,值為0或1,未命中為0且屬正常結果。
1016
+ * 判斷某筆是否真的被刪除一律以nDeleted為準。
1017
+ * 未帶有效time者為該筆之輸入問題,回ok:0與err且不送查詢,不中斷其餘筆數,
1018
+ * 以此與[主鍵未命中]之ok:1區辨。
1019
+ *
801
1020
  * @memberOf WOrmPostgresql
802
1021
  * @param {Object|Array} data 輸入數據物件或陣列
803
- * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
1022
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果陣列[{n,nDeleted,ok}],reject回傳錯誤訊息
804
1023
  */
805
1024
  async function del(data) {
806
1025
  let isErr = false
@@ -846,39 +1065,49 @@ function WOrmPostgresql(opt = {}) {
846
1065
  data = [data]
847
1066
  }
848
1067
 
849
- //check time
850
- data = map(data, function(v, k) {
851
- if (!isDate(v.time)) {
852
- throw new Error(`invalid data[${k}].time[${v.time}]`)
853
- }
854
- return v
855
- })
856
-
857
1068
  //pmSeries
858
1069
  res = await pmSeries(data, async(v) => {
859
1070
 
860
1071
  //rest
861
1072
  let rest = null
862
1073
 
1074
+ //time
1075
+ let time = get(v, 'time')
1076
+
1077
+ //check time, 未帶有效主鍵者不補值亦不送查詢,
1078
+ //因mongo-sql會將無效值轉為null而誤中其他數據, 故直接視為該筆無法處理
1079
+ if (!isDate(time)) {
1080
+
1081
+ //rest
1082
+ rest = {
1083
+ n: 0,
1084
+ nDeleted: 0,
1085
+ ok: 0,
1086
+ err: `invalid time[${time}]`,
1087
+ }
1088
+
1089
+ return rest
1090
+ }
1091
+
863
1092
  //mr
864
1093
  let mr = mongoSql.sql({
865
1094
  type: 'delete',
866
1095
  table: cl,
867
1096
  where: {
868
- time: v.time,
1097
+ time,
869
1098
  },
870
1099
  })
871
1100
  // console.log('mr', mr)
872
1101
  // console.log('mr.query', mr.query)
873
1102
  // console.log('mr.values', mr.values)
874
1103
 
875
- //del
1104
+ //del, n與nDeleted皆為主鍵命中筆數, 未命中為0
876
1105
  await client.query(mr.query, mr.values)
877
1106
  .then((r) => {
878
1107
 
879
1108
  //res
880
1109
  rest = {
881
- n: 1,
1110
+ n: r.rowCount,
882
1111
  nDeleted: r.rowCount,
883
1112
  ok: 1,
884
1113
  }
@@ -935,9 +1164,12 @@ function WOrmPostgresql(opt = {}) {
935
1164
  /**
936
1165
  * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
937
1166
  *
1167
+ * n與nDeleted皆為實際刪除筆數,不取全表筆數。find未給或為空物件時刪除全部數據,
1168
+ * 條件無命中時回{n:0,nDeleted:0,ok:1},不視為錯誤。
1169
+ *
938
1170
  * @memberOf WOrmPostgresql
939
1171
  * @param {Object} [find={}] 輸入刪除條件物件
940
- * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
1172
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果物件{n,nDeleted,ok},reject回傳錯誤訊息
941
1173
  */
942
1174
  async function delAll(find = {}) {
943
1175
  let isErr = false
@@ -1043,6 +1275,7 @@ function WOrmPostgresql(opt = {}) {
1043
1275
  //save
1044
1276
  ee.createTable = createTable
1045
1277
  ee.select = select
1278
+ ee.selectByTime = selectByTime
1046
1279
  ee.insert = insert
1047
1280
  ee.save = save
1048
1281
  ee.del = del
@@ -1067,7 +1300,7 @@ export default WOrmPostgresql
1067
1300
  <br class="clear">
1068
1301
 
1069
1302
  <footer>
1070
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sat Aug 08 2026 14:32:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1303
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 22:57:35 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1071
1304
  </footer>
1072
1305
 
1073
1306
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -29,7 +29,7 @@
29
29
  <nav >
30
30
 
31
31
 
32
- <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmPostgresql.html">WOrmPostgresql</a><ul class='methods'><li data-type='method'><a href="WOrmPostgresql.html#.createTable">createTable</a></li><li data-type='method'><a href="WOrmPostgresql.html#.del">del</a></li><li data-type='method'><a href="WOrmPostgresql.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmPostgresql.html#.insert">insert</a></li><li data-type='method'><a href="WOrmPostgresql.html#.save">save</a></li><li data-type='method'><a href="WOrmPostgresql.html#.select">select</a></li><li data-type='method'><a href="WOrmPostgresql.html#.selectByTime">selectByTime</a></li></ul></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sat Aug 08 2026 14:32:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 22:57:35 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/g-basic.mjs CHANGED
@@ -168,6 +168,14 @@ async function test() {
168
168
  let so = await wo.select({ name: 'rosemary' })
169
169
  console.log('select by name', so)
170
170
 
171
+ //selectByTime
172
+ let sb = await wo.selectByTime('2025-01-01T00:10:00Z')
173
+ console.log('selectByTime', sb)
174
+
175
+ //selectByTime by time not existed
176
+ let sbn = await wo.selectByTime('2024-01-01T00:00:00Z')
177
+ console.log('selectByTime by time not existed', sbn)
178
+
171
179
  //select by $and, $gt, $lt
172
180
  let spa = await wo.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
173
181
  console.log('select by $and, $gt, $lt', spa)
@@ -287,16 +295,16 @@ async function test() {
287
295
  }
288
296
  test()
289
297
  // change delAll
290
- // delAll then { n: 5, nDeleted: 5, ok: 1 }
298
+ // delAll then { n: 0, nDeleted: 0, ok: 1 }
291
299
  // change insert
292
300
  // insert then { n: 13, nInserted: 13, ok: 1 }
293
301
  // change save
294
302
  // save then [
295
- // { n: 1, nModified: 0, ok: 1 },
296
- // { n: 1, nModified: 1, ok: 1 },
297
- // { n: 1, nModified: 1, ok: 1 },
298
- // { n: 1, nModified: 1, ok: 1 },
299
- // { n: 0, nModified: 0, ok: 1 }
303
+ // { n: 1, nInserted: 0, nModified: 0, ok: 1 },
304
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
305
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
306
+ // { n: 1, nInserted: 0, nModified: 1, ok: 1 },
307
+ // { n: 0, nInserted: 0, nModified: 0, ok: 1 }
300
308
  // ]
301
309
  // select all [
302
310
  // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
@@ -326,6 +334,12 @@ test()
326
334
  // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
327
335
  // { time: 2025-01-01T00:07:00.000Z, name: 'rosemary', value: 124.76 }
328
336
  // ]
337
+ // selectByTime {
338
+ // time: 2025-01-01T00:10:00.000Z,
339
+ // name: 'rosemary(modify)',
340
+ // value: 113.98
341
+ // }
342
+ // selectByTime by time not existed null
329
343
  // select by $and, $gt, $lt [
330
344
  // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
331
345
  // { time: 2025-01-01T00:04:00.000Z, name: 'rosemary', value: 123.1236 },
@@ -356,9 +370,9 @@ test()
356
370
  // }
357
371
  // ]
358
372
  // change save
359
- // save then [ { n: 1, nInserted: 1, ok: 1 } ]
373
+ // save then [ { n: 1, nInserted: 1, nModified: 0, ok: 1 } ]
360
374
  // change del
361
- // del then [ { n: 1, nDeleted: 0, ok: 1 } ]
375
+ // del then [ { n: 0, nDeleted: 0, ok: 1 } ]
362
376
  // change del
363
377
  // del then [
364
378
  // { n: 1, nDeleted: 1, ok: 1 },
@@ -393,7 +407,7 @@ test()
393
407
  // { time: 2025-01-01T00:01:00.000Z, name: 'rosemary', value: 123.456 },
394
408
  // { time: 2025-01-01T00:02:00.000Z, name: 'kettle', value: 456 }
395
409
  // ]
396
- // save (invalidate cache) then [ { n: 1, nModified: 1, ok: 1 } ]
410
+ // save (invalidate cache) then [ { n: 1, nInserted: 0, nModified: 1, ok: 1 } ]
397
411
  // select all 3rd (reload after save) [
398
412
  // { time: 2025-01-01T00:00:00.000Z, name: 'peter', value: 123 },
399
413
  // {
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "w-orm-postgresql",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "main": "dist/w-orm-postgresql.umd.js",
5
5
  "dependencies": {
6
6
  "mongo-sql": "^6.2.0",
7
- "pg": "^8.20.0",
7
+ "pg": "^8.23.0",
8
8
  "wsemi": "^1.8.70"
9
9
  },
10
10
  "devDependencies": {