w-orm-postgresql 1.0.7 → 1.0.8

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
 
@@ -678,7 +678,7 @@
678
678
 
679
679
  <dt class="tag-source">Source:</dt>
680
680
  <dd class="tag-source"><ul class="dummy"><li>
681
- <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line758">line 758</a>
681
+ <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line942">line 942</a>
682
682
  </li></ul></dd>
683
683
 
684
684
 
@@ -839,7 +839,7 @@
839
839
 
840
840
  <dt class="tag-source">Source:</dt>
841
841
  <dd class="tag-source"><ul class="dummy"><li>
842
- <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line895">line 895</a>
842
+ <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line1079">line 1079</a>
843
843
  </li></ul></dd>
844
844
 
845
845
 
@@ -1017,7 +1017,7 @@
1017
1017
 
1018
1018
  <dt class="tag-source">Source:</dt>
1019
1019
  <dd class="tag-source"><ul class="dummy"><li>
1020
- <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line377">line 377</a>
1020
+ <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line489">line 489</a>
1021
1021
  </li></ul></dd>
1022
1022
 
1023
1023
 
@@ -1178,7 +1178,7 @@
1178
1178
 
1179
1179
  <dt class="tag-source">Source:</dt>
1180
1180
  <dd class="tag-source"><ul class="dummy"><li>
1181
- <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line502">line 502</a>
1181
+ <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line618">line 618</a>
1182
1182
  </li></ul></dd>
1183
1183
 
1184
1184
 
@@ -1663,6 +1663,167 @@
1663
1663
 
1664
1664
 
1665
1665
 
1666
+
1667
+
1668
+
1669
+
1670
+ <h4 class="name" id=".selectByTime"><span class="type-signature type-signature-async, static">(async, static) </span>selectByTime<span class="signature">(time)</span><span class="type-signature"> &rarr; {Promise}</span></h4>
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+ <dl class="details">
1678
+
1679
+ <dt class="tag-description">Description:</dt>
1680
+ <dd class="tag-description"><ul class="dummy"><li><p>由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳</p></li></ul></dd>
1681
+
1682
+
1683
+
1684
+ <dt class="tag-source">Source:</dt>
1685
+ <dd class="tag-source"><ul class="dummy"><li>
1686
+ <a href="WOrmPostgresql.mjs.html">WOrmPostgresql.mjs</a>, <a href="WOrmPostgresql.mjs.html#line377">line 377</a>
1687
+ </li></ul></dd>
1688
+
1689
+
1690
+
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+
1705
+
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+
1715
+
1716
+
1717
+
1718
+
1719
+ </dl>
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+
1733
+ <h5 class="h5-parameters">Parameters:</h5>
1734
+
1735
+
1736
+ <table class="params">
1737
+ <thead>
1738
+ <tr>
1739
+
1740
+ <th>Name</th>
1741
+
1742
+
1743
+ <th>Type</th>
1744
+
1745
+
1746
+
1747
+
1748
+
1749
+ <th class="last">Description</th>
1750
+ </tr>
1751
+ </thead>
1752
+
1753
+ <tbody>
1754
+
1755
+
1756
+ <tr>
1757
+
1758
+ <td class="name"><code>time</code></td>
1759
+
1760
+
1761
+ <td class="type">
1762
+
1763
+
1764
+ <span class="param-type">String</span>
1765
+ |
1766
+
1767
+ <span class="param-type">Date</span>
1768
+
1769
+
1770
+
1771
+
1772
+ </td>
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+ <td class="description last"><p>輸入主鍵time值,本套件以time欄位為主鍵</p></td>
1779
+ </tr>
1780
+
1781
+
1782
+ </tbody>
1783
+ </table>
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+ <h5 class="h5-returns">Returns:</h5>
1801
+
1802
+
1803
+ <div class="param-desc">
1804
+ <p>回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息</p>
1805
+ </div>
1806
+
1807
+
1808
+
1809
+ <dl class="param-type">
1810
+ <dt>
1811
+ Type
1812
+ </dt>
1813
+ <dd>
1814
+
1815
+ <span class="param-type">Promise</span>
1816
+
1817
+
1818
+
1819
+ </dd>
1820
+ </dl>
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+
1666
1827
 
1667
1828
 
1668
1829
 
@@ -1682,7 +1843,7 @@
1682
1843
  <br class="clear">
1683
1844
 
1684
1845
  <footer>
1685
- 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.
1846
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 17:59:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1686
1847
  </footer>
1687
1848
 
1688
1849
  <script>prettyPrint();</script>
@@ -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
 
@@ -414,6 +414,118 @@ function WOrmPostgresql(opt = {}) {
414
414
  return res
415
415
  }
416
416
 
417
+ /**
418
+ * 由主鍵time查詢單筆數據,因直接由資料表主鍵索引取值,不需如select提取數據至前端再處理,故數據量大時效能較佳
419
+ *
420
+ * @memberOf WOrmPostgresql
421
+ * @param {String|Date} time 輸入主鍵time值,本套件以time欄位為主鍵
422
+ * @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此time則回傳null,reject回傳錯誤訊息
423
+ */
424
+ async function selectByTime(time) {
425
+ let isErr = false
426
+ let res = null
427
+
428
+ //check
429
+ if (!isDate(time)) {
430
+ //未給有效主鍵值視為查無數據, 判定基準與insert、save、del內對time之認定一致
431
+ return null
432
+ }
433
+
434
+ //find, 本套件以time欄位為主鍵, 與save、del、genConflictSQL之認定一致
435
+ let find = {
436
+ time,
437
+ }
438
+
439
+ //cache, 與select共用快取, 因快取鍵值由find與order組成, 故此處等同select(find)之結果
440
+ if (useCache) {
441
+ let cache = getCache(find, {})
442
+ if (isarr(cache)) {
443
+ return get(cache, 0, null)
444
+ }
445
+ }
446
+
447
+ //client
448
+ let client = new PgClient({ connectionString })
449
+
450
+ //connect
451
+ try {
452
+
453
+ //connect
454
+ await client.connect()
455
+
456
+ }
457
+ catch (err) {
458
+ isErr = true
459
+ res = err
460
+ client = null
461
+ }
462
+
463
+ //check
464
+ if (isErr) {
465
+ return Promise.reject(res)
466
+ }
467
+
468
+ try {
469
+
470
+ //mr, 不使用limit以令結果與select(find)完全等價, 方能安全共用快取,
471
+ //time為主鍵時本就僅回傳1筆, 不會因此多拉數據
472
+ let mr = mongoSql.sql({
473
+ type: 'select',
474
+ table: cl,
475
+ where: find,
476
+ })
477
+ // console.log('mr', mr)
478
+ // console.log('mr.query', mr.query)
479
+ // console.log('mr.values', mr.values)
480
+
481
+ //select
482
+ let r = await client.query(mr.query, mr.values)
483
+ // console.log('r', r)
484
+
485
+ //rows
486
+ let rows = get(r, 'rows')
487
+
488
+ //check
489
+ if (!isarr(rows)) {
490
+ throw new Error(`can not select by time[${time}]`)
491
+ }
492
+
493
+ //cache
494
+ if (useCache) {
495
+ setCache(find, {}, rows)
496
+ }
497
+
498
+ //v
499
+ let v = get(rows, 0, null)
500
+
501
+ //check, 判定基準與save、del內對既有數據之認定一致
502
+ if (iseobj(v)) {
503
+ res = v
504
+ }
505
+ else {
506
+ //不存在time, 回傳null
507
+ res = null
508
+ }
509
+
510
+ }
511
+ catch (err) {
512
+ isErr = true
513
+ res = err
514
+ }
515
+ finally {
516
+ await client.end()
517
+ client = null
518
+ }
519
+ // console.log('res', res)
520
+
521
+ //check
522
+ if (isErr) {
523
+ return Promise.reject(res)
524
+ }
525
+
526
+ return res
527
+ }
528
+
417
529
  /**
418
530
  * 插入數據
419
531
  *
@@ -483,18 +595,22 @@ function WOrmPostgresql(opt = {}) {
483
595
  // console.log('mr.query', mr.query)
484
596
  // console.log('mr.values', mr.values)
485
597
 
486
- //nAll, nInsert
598
+ //添加conflict, 令已存在time者跳過而不中斷整批插入, 主鍵認定與genConflictSQL一致
599
+ //由PostgreSQL於單一語句內原子完成[檢查time未存在]與[寫入], 併發時同一time僅有一次成功,
600
+ //同批含重複time時亦僅首筆成功, 故不須逐筆插入即可取得實際插入筆數
601
+ let sql = `${mr.query} ON CONFLICT (time) DO NOTHING`
602
+
603
+ //nAll
487
604
  let nAll = size(data)
488
- let nInsert = nAll //一次插入全部數據加速, 但也因此沒法個別處理conflict, 無法個別計算已插入數量
489
605
 
490
- //insert
491
- await client.query(mr.query, mr.values)
492
- .then(() => {
606
+ //insert, ON CONFLICT DO NOTHING時rowCount即為實際插入筆數
607
+ await client.query(sql, mr.values)
608
+ .then((r) => {
493
609
 
494
610
  //res
495
611
  res = {
496
612
  n: nAll,
497
- nInserted: nInsert,
613
+ nInserted: r.rowCount,
498
614
  ok: 1,
499
615
  }
500
616
 
@@ -635,9 +751,10 @@ function WOrmPostgresql(opt = {}) {
635
751
 
636
752
  }
637
753
 
638
- //check
754
+ //快速路徑, 先不寫入直接由前述預讀判斷內容是否相同, 內容相同者本就不須寫入,
755
+ //預讀值縱使已被其他寫入者更動而過期亦不影響正確性, 因內容相同時本次save等價於無操作,
756
+ //無操作可視為於預讀當下即已完成, 其後他人之寫入結果與[本次save先執行再輪到他人]相同
639
757
  if (iseobj(_v)) {
640
- //存在
641
758
 
642
759
  //_vt
643
760
  let _vt = omit(_v, 'time')
@@ -658,75 +775,125 @@ function WOrmPostgresql(opt = {}) {
658
775
  }
659
776
  // console.log('相同時不更新', rest, v)
660
777
 
778
+ return rest
661
779
  }
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
780
 
675
- //添加conflict
676
- let conflict = genConflictSQL(v)
781
+ }
782
+ else {
783
+
784
+ //check
785
+ if (!autoInsert) {
786
+ //不存在且未開啟autoInsert則不寫入
787
+
788
+ //rest
789
+ rest = {
790
+ n: 0,
791
+ nModified: 0,
792
+ ok: 1,
793
+ }
794
+ // console.log('不存在', rest, v)
795
+
796
+ return rest
797
+ }
798
+
799
+ }
800
+
801
+ //check
802
+ if (autoInsert) {
803
+ //由PostgreSQL於單一語句內原子完成[查找time]與[插入或更新],
804
+ //併發時不會因他方已先插入同一time而報錯, 亦不會有兩方各自讀到同一舊值再各自寫入
805
+
806
+ //mr
807
+ let mr = mongoSql.sql({
808
+ type: 'insert',
809
+ table: cl,
810
+ values: v,
811
+ })
812
+ // console.log('mr', mr)
813
+ // console.log('mr.query', mr.query)
814
+ // console.log('mr.values', mr.values)
677
815
 
678
- //sql
679
- let sql = `${mr.query} ${conflict}`
816
+ //添加conflict, 僅有time欄位時genConflictSQL無可更新欄位而回傳空字串,
817
+ //此時退回DO NOTHING, 以免併發插入同一time者報錯
818
+ let conflict = genConflictSQL(v)
819
+ if (!isestr(conflict)) {
820
+ conflict = 'ON CONFLICT (time) DO NOTHING'
821
+ }
822
+
823
+ //sql, xmax為0表該列由本語句插入, 非0表係由DO UPDATE更新而來,
824
+ //衝突且落入DO NOTHING時不回傳任何列, 代表該time已存在且未變更
825
+ let sql = `${mr.query} ${conflict} RETURNING (xmax = 0) AS inserted`
680
826
 
681
- //save
682
- await client.query(sql, mr.values)
683
- .then(() => {
827
+ //save
828
+ await client.query(sql, mr.values)
829
+ .then((r) => {
830
+
831
+ //rows
832
+ let rows = get(r, 'rows')
833
+
834
+ //check
835
+ if (!isearr(rows)) {
836
+ //衝突且未更新
684
837
 
685
838
  //rest
686
839
  rest = {
687
840
  n: 1,
688
- nModified: 1,
841
+ nModified: 0,
689
842
  ok: 1,
690
843
  }
691
- // console.log('不相同時須更新', rest, vt)
692
844
 
693
- })
694
- .catch((err) => {
845
+ }
846
+ else if (get(rows, '0.inserted') === true) {
847
+ //原不存在而插入, 回傳形狀同insert
695
848
 
696
849
  //rest
697
850
  rest = {
698
851
  n: 1,
699
- nModified: 0,
700
- ok: 0,
701
- err: err.message,
852
+ nInserted: 1,
853
+ ok: 1,
702
854
  }
855
+ // console.log('之前不存在且可自動插入', rest, v)
703
856
 
704
- })
857
+ }
858
+ else {
859
+ //原已存在而更新
705
860
 
706
- }
707
- }
708
- else {
709
- //不存在
861
+ //rest
862
+ rest = {
863
+ n: 1,
864
+ nModified: 1,
865
+ ok: 1,
866
+ }
867
+ // console.log('不相同時須更新', rest, v)
710
868
 
711
- //rest
712
- rest = {
713
- n: 0,
714
- nModified: 0,
715
- ok: 1,
716
- }
717
- // console.log('不存在', rest, v)
869
+ }
718
870
 
719
- }
871
+ })
872
+ .catch((err) => {
873
+
874
+ //rest
875
+ rest = {
876
+ n: 1,
877
+ nInserted: 0,
878
+ ok: 0,
879
+ err: err.message,
880
+ }
720
881
 
721
- //autoInsert
722
- if (autoInsert &amp;&amp; rest.n === 0) {
723
- //之前不存在(rest.n)且可自動插入(autoInsert=true)
882
+ })
883
+
884
+ }
885
+ else {
886
+ //未開啟autoInsert則僅能更新既有數據, 不可用INSERT以免無中生有,
887
+ //由UPDATE...WHERE time原子完成[查找time]與[更新], 併發時不會遺失更新
724
888
 
725
889
  //mr
726
890
  let mr = mongoSql.sql({
727
- type: 'insert',
891
+ type: 'update',
728
892
  table: cl,
729
- values: v,
893
+ updates: omit(v, 'time'),
894
+ where: {
895
+ time: v.time,
896
+ },
730
897
  })
731
898
  // console.log('mr', mr)
732
899
  // console.log('mr.query', mr.query)
@@ -734,15 +901,32 @@ function WOrmPostgresql(opt = {}) {
734
901
 
735
902
  //save
736
903
  await client.query(mr.query, mr.values)
737
- .then(() => {
904
+ .then((r) => {
905
+
906
+ //check
907
+ if (r.rowCount > 0) {
908
+ //已更新
909
+
910
+ //rest
911
+ rest = {
912
+ n: 1,
913
+ nModified: 1,
914
+ ok: 1,
915
+ }
916
+ // console.log('不相同時須更新', rest, v)
917
+
918
+ }
919
+ else {
920
+ //預讀後至更新前已被他人刪除, 視為不存在
921
+
922
+ //rest
923
+ rest = {
924
+ n: 0,
925
+ nModified: 0,
926
+ ok: 1,
927
+ }
738
928
 
739
- //rest
740
- rest = {
741
- n: 1,
742
- nInserted: 1,
743
- ok: 1,
744
929
  }
745
- // console.log('之前不存在且可自動插入', rest, v)
746
930
 
747
931
  })
748
932
  .catch((err) => {
@@ -750,7 +934,7 @@ function WOrmPostgresql(opt = {}) {
750
934
  //rest
751
935
  rest = {
752
936
  n: 1,
753
- nInserted: 0,
937
+ nModified: 0,
754
938
  ok: 0,
755
939
  err: err.message,
756
940
  }
@@ -1043,6 +1227,7 @@ function WOrmPostgresql(opt = {}) {
1043
1227
  //save
1044
1228
  ee.createTable = createTable
1045
1229
  ee.select = select
1230
+ ee.selectByTime = selectByTime
1046
1231
  ee.insert = insert
1047
1232
  ee.save = save
1048
1233
  ee.del = del
@@ -1067,7 +1252,7 @@ export default WOrmPostgresql
1067
1252
  <br class="clear">
1068
1253
 
1069
1254
  <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.
1255
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 17:59:38 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1071
1256
  </footer>
1072
1257
 
1073
1258
  <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 17:59:38 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,7 +295,7 @@ 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
@@ -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 },