w-orm-mongodb 1.1.39 → 1.1.40

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.
@@ -75,14 +75,15 @@
75
75
 
76
76
  <dt class="tag-description">Description:</dt>
77
77
  <dd class="tag-description"><ul class="dummy"><li><p>操作資料庫(MongoDB)</p>
78
- <p>本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。
79
- id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自動補值;del不補值。</p></li></ul></dd>
78
+ <p>本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。id為無業務語義之識別碼。
79
+ opt.autoGenPk預設為true,insert、saveinsertGfs於輸入未帶有效id時自動產生;del於任一設定下皆不補值。
80
+ opt.autoGenPk為false時套件一律不產生id,未帶有效id者以reject拋出,且id之唯一性與格式皆由呼叫端自負。</p></li></ul></dd>
80
81
 
81
82
 
82
83
 
83
84
  <dt class="tag-source">Source:</dt>
84
85
  <dd class="tag-source"><ul class="dummy"><li>
85
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line33">line 33</a>
86
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line36">line 36</a>
86
87
  </li></ul></dd>
87
88
 
88
89
 
@@ -338,6 +339,46 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
338
339
  </tr>
339
340
 
340
341
 
342
+
343
+ <tr>
344
+
345
+ <td class="name"><code>autoGenPk</code></td>
346
+
347
+
348
+ <td class="type">
349
+
350
+
351
+ <span class="param-type">Boolean</span>
352
+
353
+
354
+
355
+
356
+ </td>
357
+
358
+
359
+ <td class="attributes">
360
+
361
+ &lt;optional><br>
362
+
363
+
364
+
365
+
366
+
367
+ </td>
368
+
369
+
370
+
371
+ <td class="default">
372
+
373
+ <code>true</code>
374
+
375
+ </td>
376
+
377
+
378
+ <td class="description last"><p>輸入是否於輸入未帶有效主鍵時自動產生主鍵值,預設true。為false時主鍵須由呼叫端自備,屬依賴注入之定位,主鍵之唯一性、格式與是否與既有資料衝突皆由呼叫端自負。本設定為建構層設定,不得於insert與save之option逐次覆寫</p></td>
379
+ </tr>
380
+
381
+
341
382
  </tbody>
342
383
  </table>
343
384
 
@@ -433,7 +474,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
433
474
 
434
475
  <dt class="tag-source">Source:</dt>
435
476
  <dd class="tag-source"><ul class="dummy"><li>
436
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line648">line 648</a>
477
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line681">line 681</a>
437
478
  </li></ul></dd>
438
479
 
439
480
 
@@ -595,7 +636,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
595
636
 
596
637
  <dt class="tag-source">Source:</dt>
597
638
  <dd class="tag-source"><ul class="dummy"><li>
598
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line760">line 760</a>
639
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line793">line 793</a>
599
640
  </li></ul></dd>
600
641
 
601
642
 
@@ -775,7 +816,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
775
816
 
776
817
  <dt class="tag-source">Source:</dt>
777
818
  <dd class="tag-source"><ul class="dummy"><li>
778
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line1183">line 1183</a>
819
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line1215">line 1215</a>
779
820
  </li></ul></dd>
780
821
 
781
822
 
@@ -955,7 +996,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
955
996
 
956
997
  <dt class="tag-source">Source:</dt>
957
998
  <dd class="tag-source"><ul class="dummy"><li>
958
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line1055">line 1055</a>
999
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line1087">line 1087</a>
959
1000
  </li></ul></dd>
960
1001
 
961
1002
 
@@ -1112,13 +1153,14 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
1112
1153
  <dt class="tag-description">Description:</dt>
1113
1154
  <dd class="tag-description"><ul class="dummy"><li><p>插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
1114
1155
  由MongoDB於唯一索引上原子完成[檢查id未存在]與[寫入],併發時同一id僅有一次成功
1115
- 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果</p></li></ul></dd>
1156
+ 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
1157
+ 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入</p></li></ul></dd>
1116
1158
 
1117
1159
 
1118
1160
 
1119
1161
  <dt class="tag-source">Source:</dt>
1120
1162
  <dd class="tag-source"><ul class="dummy"><li>
1121
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line346">line 346</a>
1163
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line388">line 388</a>
1122
1164
  </li></ul></dd>
1123
1165
 
1124
1166
 
@@ -1274,14 +1316,15 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
1274
1316
 
1275
1317
  <dt class="tag-description">Description:</dt>
1276
1318
  <dd class="tag-description"><ul class="dummy"><li><p>使用GridFS,插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
1277
- 數據物件形狀為{ id, u8a },id未給時自動產生,u8a須為Uint8Array
1278
- 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果</p></li></ul></dd>
1319
+ 數據物件形狀為{ id, u8a },u8a須為Uint8Array
1320
+ 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
1321
+ 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入</p></li></ul></dd>
1279
1322
 
1280
1323
 
1281
1324
 
1282
1325
  <dt class="tag-source">Source:</dt>
1283
1326
  <dd class="tag-source"><ul class="dummy"><li>
1284
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line818">line 818</a>
1327
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line852">line 852</a>
1285
1328
  </li></ul></dd>
1286
1329
 
1287
1330
 
@@ -1438,13 +1481,14 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
1438
1481
  <dt class="tag-description">Description:</dt>
1439
1482
  <dd class="tag-description"><ul class="dummy"><li><p>儲存數據,以id為準更新既有數據,未給之欄位會保留;id不存在且option.autoInsert為true時改為插入
1440
1483
  註: n為id命中筆數,命中或經插入而產生皆為1;[內容相同]之判定基準為將待儲存物件合併進現值後結果與現值相同,
1441
- 相同者不寫入而nModified為0;本筆失敗不中斷整批,該筆以ok為0並附err回報</p></li></ul></dd>
1484
+ 相同者不寫入而nModified為0;本筆失敗不中斷整批,該筆以ok為0並附err回報
1485
+ 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入</p></li></ul></dd>
1442
1486
 
1443
1487
 
1444
1488
 
1445
1489
  <dt class="tag-source">Source:</dt>
1446
1490
  <dd class="tag-source"><ul class="dummy"><li>
1447
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line568">line 568</a>
1491
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line606">line 606</a>
1448
1492
  </li></ul></dd>
1449
1493
 
1450
1494
 
@@ -1731,7 +1775,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
1731
1775
 
1732
1776
  <dt class="tag-source">Source:</dt>
1733
1777
  <dd class="tag-source"><ul class="dummy"><li>
1734
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line236">line 236</a>
1778
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line277">line 277</a>
1735
1779
  </li></ul></dd>
1736
1780
 
1737
1781
 
@@ -1911,7 +1955,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
1911
1955
 
1912
1956
  <dt class="tag-source">Source:</dt>
1913
1957
  <dd class="tag-source"><ul class="dummy"><li>
1914
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line288">line 288</a>
1958
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line329">line 329</a>
1915
1959
  </li></ul></dd>
1916
1960
 
1917
1961
 
@@ -2072,7 +2116,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
2072
2116
 
2073
2117
  <dt class="tag-source">Source:</dt>
2074
2118
  <dd class="tag-source"><ul class="dummy"><li>
2075
- <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line925">line 925</a>
2119
+ <a href="WOrmMongodb.mjs.html">WOrmMongodb.mjs</a>, <a href="WOrmMongodb.mjs.html#line957">line 957</a>
2076
2120
  </li></ul></dd>
2077
2121
 
2078
2122
 
@@ -2229,7 +2273,7 @@ id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自
2229
2273
  <br class="clear">
2230
2274
 
2231
2275
  <footer>
2232
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 23:36:47 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
2276
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 07:33:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
2233
2277
  </footer>
2234
2278
 
2235
2279
  <script>prettyPrint();</script>
@@ -56,6 +56,7 @@ import omit from 'lodash-es/omit.js'
56
56
  import size from 'lodash-es/size.js'
57
57
  import genPm from 'wsemi/src/genPm.mjs'
58
58
  import genID from 'wsemi/src/genID.mjs'
59
+ import isbol from 'wsemi/src/isbol.mjs'
59
60
  import isestr from 'wsemi/src/isestr.mjs'
60
61
  import isarr from 'wsemi/src/isarr.mjs'
61
62
  import isearr from 'wsemi/src/isearr.mjs'
@@ -67,14 +68,16 @@ import pmSeries from 'wsemi/src/pmSeries.mjs'
67
68
  /**
68
69
  * 操作資料庫(MongoDB)
69
70
  *
70
- * 本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。
71
- * id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自動補值;del不補值。
71
+ * 本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。id為無業務語義之識別碼。
72
+ * opt.autoGenPk預設為true,insert、saveinsertGfs於輸入未帶有效id時自動產生;del於任一設定下皆不補值。
73
+ * opt.autoGenPk為false時套件一律不產生id,未帶有效id者以reject拋出,且id之唯一性與格式皆由呼叫端自負。
72
74
  *
73
75
  * @class
74
76
  * @param {Object} [opt={}] 輸入設定物件,預設{}
75
77
  * @param {String} [opt.url='mongodb://127.0.0.1:27017'] 輸入連接資料庫字串,預設'mongodb://127.0.0.1:27017'
76
78
  * @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
77
79
  * @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
80
+ * @param {Boolean} [opt.autoGenPk=true] 輸入是否於輸入未帶有效主鍵時自動產生主鍵值,預設true。為false時主鍵須由呼叫端自備,屬依賴注入之定位,主鍵之唯一性、格式與是否與既有資料衝突皆由呼叫端自負。本設定為建構層設定,不得於insert與save之option逐次覆寫
78
81
  * @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
79
82
  */
80
83
  function WOrmMongodb(opt = {}) {
@@ -92,6 +95,13 @@ function WOrmMongodb(opt = {}) {
92
95
  }
93
96
 
94
97
 
98
+ //autoGenPk, 預設開啟, 為false時主鍵一律由呼叫端自備, 套件不產生亦不補救
99
+ let autoGenPk = get(opt, 'autoGenPk')
100
+ if (!isbol(autoGenPk)) {
101
+ autoGenPk = true
102
+ }
103
+
104
+
95
105
  //_indexReady, 唯一索引只須建立一次, 以旗標記錄避免每次操作皆多一次round-trip
96
106
  let _indexReady = false
97
107
 
@@ -146,6 +156,37 @@ function WOrmMongodb(opt = {}) {
146
156
  }
147
157
 
148
158
 
159
+ /**
160
+ * 檢查並補齊單筆數據之主鍵
161
+ * autoGenPk為true時未帶有效id者自動產生,為false時往外拋
162
+ * 註: 未帶有效id屬呼叫端未履行契約而非某一筆資料本身之問題,故為整批性錯誤而不降級為該筆ok為0,
163
+ * 若降級為逐筆結果,呼叫端易於整批resolve之下漏看,使[忘了給id]靜默變成[少寫了幾筆]
164
+ * 註: 本函數須於任何寫入之前一次對全部數據完成,令拋錯時同批之有效筆數亦不會被寫入
165
+ *
166
+ * @ignore
167
+ * @param {Object} v 輸入數據物件
168
+ * @param {Number} k 輸入數據於陣列內之索引
169
+ * @returns {Object} 回傳補齊主鍵之數據物件
170
+ */
171
+ function procPk(v, k) {
172
+
173
+ //check
174
+ if (!isestr(v.id)) {
175
+
176
+ //check, autoGenPk為false時主鍵須由呼叫端自備
177
+ if (!autoGenPk) {
178
+ throw new Error(`invalid data[${k}].id, autoGenPk is false`)
179
+ }
180
+
181
+ //genID
182
+ v.id = genID()
183
+
184
+ }
185
+
186
+ return v
187
+ }
188
+
189
+
149
190
  /**
150
191
  * 判定是否為唯一索引重複鍵錯誤(11000),批次插入時須全部寫入錯誤皆為重複鍵才算
151
192
  *
@@ -385,6 +426,7 @@ function WOrmMongodb(opt = {}) {
385
426
  * 插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
386
427
  * 由MongoDB於唯一索引上原子完成[檢查id未存在]與[寫入],併發時同一id僅有一次成功
387
428
  * 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
429
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
388
430
  *
389
431
  * @memberOf WOrmMongodb
390
432
  * @param {Object|Array} data 輸入數據物件或陣列
@@ -424,13 +466,8 @@ function WOrmMongodb(opt = {}) {
424
466
  data = [data]
425
467
  }
426
468
 
427
- //check id
428
- data = map(data, function(v) {
429
- if (!isestr(v.id)) {
430
- v.id = genID()
431
- }
432
- return v
433
- })
469
+ //check id, 須於任何寫入之前一次完成, 令autoGenPk為false而拋錯時同批之有效筆數亦不會被寫入
470
+ data = map(data, procPk)
434
471
 
435
472
  //ensureIndex
436
473
  await ensureIndex(collection)
@@ -605,6 +642,7 @@ function WOrmMongodb(opt = {}) {
605
642
  * 儲存數據,以id為準更新既有數據,未給之欄位會保留;id不存在且option.autoInsert為true時改為插入
606
643
  * 註: n為id命中筆數,命中或經插入而產生皆為1;[內容相同]之判定基準為將待儲存物件合併進現值後結果與現值相同,
607
644
  * 相同者不寫入而nModified為0;本筆失敗不中斷整批,該筆以ok為0並附err回報
645
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
608
646
  *
609
647
  * @memberOf WOrmMongodb
610
648
  * @param {Object|Array} data 輸入數據物件或陣列
@@ -645,13 +683,8 @@ function WOrmMongodb(opt = {}) {
645
683
  data = [data]
646
684
  }
647
685
 
648
- //check id
649
- data = map(data, function(v) {
650
- if (!isestr(v.id)) {
651
- v.id = genID()
652
- }
653
- return v
654
- })
686
+ //check id, 須於任何寫入之前一次完成, 令autoGenPk為false而拋錯時同批之有效筆數亦不會被寫入
687
+ data = map(data, procPk)
655
688
 
656
689
  //ensureIndex
657
690
  await ensureIndex(collection)
@@ -855,8 +888,9 @@ function WOrmMongodb(opt = {}) {
855
888
 
856
889
  /**
857
890
  * 使用GridFS,插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
858
- * 數據物件形狀為{ id, u8a },id未給時自動產生,u8a須為Uint8Array
891
+ * 數據物件形狀為{ id, u8a },u8a須為Uint8Array
859
892
  * 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
893
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
860
894
  *
861
895
  * @memberOf WOrmMongodb
862
896
  * @param {Object|Array} data 輸入數據物件或陣列,各數據物件形狀為{ id, u8a }
@@ -906,9 +940,7 @@ function WOrmMongodb(opt = {}) {
906
940
  //u8a無效屬呼叫端給值錯誤且整批函數無從逐筆回報, 故往外拋
907
941
  data = map(data, function(v, k) {
908
942
  v = { ...v }
909
- if (!isestr(v.id)) {
910
- v.id = genID()
911
- }
943
+ v = procPk(v, k)
912
944
  if (!isu8arr(v.u8a)) {
913
945
  throw new Error(`invalid data[${k}].u8a`)
914
946
  }
@@ -1322,7 +1354,7 @@ export default WOrmMongodb
1322
1354
  <br class="clear">
1323
1355
 
1324
1356
  <footer>
1325
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Sun Aug 16 2026 23:36:47 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1357
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 07:33:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1326
1358
  </footer>
1327
1359
 
1328
1360
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -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 Sun Aug 16 2026 23:36:47 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 Mon Aug 17 2026 07:33:48 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-orm-mongodb",
3
- "version": "1.1.39",
3
+ "version": "1.1.40",
4
4
  "main": "dist/w-orm-mongodb.umd.js",
5
5
  "dependencies": {
6
6
  "mongodb": "^7.5.0",
@@ -9,6 +9,7 @@ import omit from 'lodash-es/omit.js'
9
9
  import size from 'lodash-es/size.js'
10
10
  import genPm from 'wsemi/src/genPm.mjs'
11
11
  import genID from 'wsemi/src/genID.mjs'
12
+ import isbol from 'wsemi/src/isbol.mjs'
12
13
  import isestr from 'wsemi/src/isestr.mjs'
13
14
  import isarr from 'wsemi/src/isarr.mjs'
14
15
  import isearr from 'wsemi/src/isearr.mjs'
@@ -20,14 +21,16 @@ import pmSeries from 'wsemi/src/pmSeries.mjs'
20
21
  /**
21
22
  * 操作資料庫(MongoDB)
22
23
  *
23
- * 本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。
24
- * id為無業務語義之識別碼,故insert與save於輸入未帶有效id時自動補值;del不補值。
24
+ * 本套件之主鍵欄位固定為id,尚未支援由呼叫端指定。id為無業務語義之識別碼。
25
+ * opt.autoGenPk預設為true,insert、saveinsertGfs於輸入未帶有效id時自動產生;del於任一設定下皆不補值。
26
+ * opt.autoGenPk為false時套件一律不產生id,未帶有效id者以reject拋出,且id之唯一性與格式皆由呼叫端自負。
25
27
  *
26
28
  * @class
27
29
  * @param {Object} [opt={}] 輸入設定物件,預設{}
28
30
  * @param {String} [opt.url='mongodb://127.0.0.1:27017'] 輸入連接資料庫字串,預設'mongodb://127.0.0.1:27017'
29
31
  * @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
30
32
  * @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
33
+ * @param {Boolean} [opt.autoGenPk=true] 輸入是否於輸入未帶有效主鍵時自動產生主鍵值,預設true。為false時主鍵須由呼叫端自備,屬依賴注入之定位,主鍵之唯一性、格式與是否與既有資料衝突皆由呼叫端自負。本設定為建構層設定,不得於insert與save之option逐次覆寫
31
34
  * @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
32
35
  */
33
36
  function WOrmMongodb(opt = {}) {
@@ -45,6 +48,13 @@ function WOrmMongodb(opt = {}) {
45
48
  }
46
49
 
47
50
 
51
+ //autoGenPk, 預設開啟, 為false時主鍵一律由呼叫端自備, 套件不產生亦不補救
52
+ let autoGenPk = get(opt, 'autoGenPk')
53
+ if (!isbol(autoGenPk)) {
54
+ autoGenPk = true
55
+ }
56
+
57
+
48
58
  //_indexReady, 唯一索引只須建立一次, 以旗標記錄避免每次操作皆多一次round-trip
49
59
  let _indexReady = false
50
60
 
@@ -99,6 +109,37 @@ function WOrmMongodb(opt = {}) {
99
109
  }
100
110
 
101
111
 
112
+ /**
113
+ * 檢查並補齊單筆數據之主鍵
114
+ * autoGenPk為true時未帶有效id者自動產生,為false時往外拋
115
+ * 註: 未帶有效id屬呼叫端未履行契約而非某一筆資料本身之問題,故為整批性錯誤而不降級為該筆ok為0,
116
+ * 若降級為逐筆結果,呼叫端易於整批resolve之下漏看,使[忘了給id]靜默變成[少寫了幾筆]
117
+ * 註: 本函數須於任何寫入之前一次對全部數據完成,令拋錯時同批之有效筆數亦不會被寫入
118
+ *
119
+ * @ignore
120
+ * @param {Object} v 輸入數據物件
121
+ * @param {Number} k 輸入數據於陣列內之索引
122
+ * @returns {Object} 回傳補齊主鍵之數據物件
123
+ */
124
+ function procPk(v, k) {
125
+
126
+ //check
127
+ if (!isestr(v.id)) {
128
+
129
+ //check, autoGenPk為false時主鍵須由呼叫端自備
130
+ if (!autoGenPk) {
131
+ throw new Error(`invalid data[${k}].id, autoGenPk is false`)
132
+ }
133
+
134
+ //genID
135
+ v.id = genID()
136
+
137
+ }
138
+
139
+ return v
140
+ }
141
+
142
+
102
143
  /**
103
144
  * 判定是否為唯一索引重複鍵錯誤(11000),批次插入時須全部寫入錯誤皆為重複鍵才算
104
145
  *
@@ -338,6 +379,7 @@ function WOrmMongodb(opt = {}) {
338
379
  * 插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
339
380
  * 由MongoDB於唯一索引上原子完成[檢查id未存在]與[寫入],併發時同一id僅有一次成功
340
381
  * 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
382
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
341
383
  *
342
384
  * @memberOf WOrmMongodb
343
385
  * @param {Object|Array} data 輸入數據物件或陣列
@@ -377,13 +419,8 @@ function WOrmMongodb(opt = {}) {
377
419
  data = [data]
378
420
  }
379
421
 
380
- //check id
381
- data = map(data, function(v) {
382
- if (!isestr(v.id)) {
383
- v.id = genID()
384
- }
385
- return v
386
- })
422
+ //check id, 須於任何寫入之前一次完成, 令autoGenPk為false而拋錯時同批之有效筆數亦不會被寫入
423
+ data = map(data, procPk)
387
424
 
388
425
  //ensureIndex
389
426
  await ensureIndex(collection)
@@ -558,6 +595,7 @@ function WOrmMongodb(opt = {}) {
558
595
  * 儲存數據,以id為準更新既有數據,未給之欄位會保留;id不存在且option.autoInsert為true時改為插入
559
596
  * 註: n為id命中筆數,命中或經插入而產生皆為1;[內容相同]之判定基準為將待儲存物件合併進現值後結果與現值相同,
560
597
  * 相同者不寫入而nModified為0;本筆失敗不中斷整批,該筆以ok為0並附err回報
598
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
561
599
  *
562
600
  * @memberOf WOrmMongodb
563
601
  * @param {Object|Array} data 輸入數據物件或陣列
@@ -598,13 +636,8 @@ function WOrmMongodb(opt = {}) {
598
636
  data = [data]
599
637
  }
600
638
 
601
- //check id
602
- data = map(data, function(v) {
603
- if (!isestr(v.id)) {
604
- v.id = genID()
605
- }
606
- return v
607
- })
639
+ //check id, 須於任何寫入之前一次完成, 令autoGenPk為false而拋錯時同批之有效筆數亦不會被寫入
640
+ data = map(data, procPk)
608
641
 
609
642
  //ensureIndex
610
643
  await ensureIndex(collection)
@@ -808,8 +841,9 @@ function WOrmMongodb(opt = {}) {
808
841
 
809
842
  /**
810
843
  * 使用GridFS,插入數據,僅於id不存在時寫入,已存在者跳過且不覆寫
811
- * 數據物件形狀為{ id, u8a },id未給時自動產生,u8a須為Uint8Array
844
+ * 數據物件形狀為{ id, u8a },u8a須為Uint8Array
812
845
  * 註: n為輸入筆數,nInserted為實際插入筆數,全數已存在而nInserted為0屬正常結果
846
+ * 註: opt.autoGenPk為true(預設)時未帶有效id者自動產生,為false時未帶有效id即reject且同批皆不寫入
813
847
  *
814
848
  * @memberOf WOrmMongodb
815
849
  * @param {Object|Array} data 輸入數據物件或陣列,各數據物件形狀為{ id, u8a }
@@ -859,9 +893,7 @@ function WOrmMongodb(opt = {}) {
859
893
  //u8a無效屬呼叫端給值錯誤且整批函數無從逐筆回報, 故往外拋
860
894
  data = map(data, function(v, k) {
861
895
  v = { ...v }
862
- if (!isestr(v.id)) {
863
- v.id = genID()
864
- }
896
+ v = procPk(v, k)
865
897
  if (!isu8arr(v.u8a)) {
866
898
  throw new Error(`invalid data[${k}].u8a`)
867
899
  }