前提・実現したいこと
node.jsでnanoSQLを使って、IndexedDBにテーブルを作成しているのですが、非同期処理で並列に登録すると、インデックスが正しく生成されないようなのです。これがnanoSQLのせいなのか、使い方の問題なのか判断できず、皆様にお知恵をお借りしたいと思っています。
発生している問題・エラーメッセージ
確認用のコード(下記)をGoogle Chromeで実行すると、コンソールに以下のメッセージが出力される。
completed! sync=100 async=14
問題は非同期直列登録したテーブル(sync)を検索した際は100行カウントされているのに、非同期並列登録したテーブル(async)を検索されているときは14行しかカウントされていないこと。
該当のソースコード
HTML
1<!-- index.htmlとかで保存し、npx http-serverとかする --> 2<script src="https://cdn.jsdelivr.net/npm/@nano-sql/core@2.3.7/dist/nano-sql.min.js" 3 integrity="sha256-W1pVgKda7GC4fwXqq9jfOrssBDJJXZqck+ultRPVzmc=" crossorigin="anonymous"></script> 4<script> 5 // 主キーidカラムとデータvalueカラムを持つテーブルスキーマ 6 const model = { 7 "id:string": { pk: true }, 8 "value:string": {}, 9 }; 10 // データvalueカラムのインデックスの定義 11 const indexes = { 12 "value:string": {}, 13 }; 14 // テーブルの行数 15 const NUM = 100; 16 // テーブルの元データ(0~NUM-1までの数。主キーに使用する) 17 const keys = [...Array(NUM).keys()]; 18 // データ登録用のクエリ定義(テーブル名と主キーの値を引数に値'0'のデータを書き込む) 19 const upsert = (table, key) => 20 nSQL(table).query( 21 'upsert' 22 , { 23 "id": String(key), 24 "value": '0' 25 } 26 ).exec(); 27 // データ検索用のクエリ定義(テーブル名を引数に値'0'のデータの行数をカウントする) 28 const select = (table) => 29 nSQL(table) 30 .query('select') 31 .where(['value', '=', '0']) 32 .exec() 33 .then((rows) => rows.length); 34 35 // データベース生成(IndexedDBに同じ構造のテーブルを2つsyncとasyncという名前で作成する) 36 nSQL().createDatabase({ 37 id: "sample_db", 38 mode: "PERM", 39 tables: [ 40 { 41 name: "sync", 42 model: model, 43 indexes: indexes, 44 }, 45 { 46 name: "async", 47 model: model, 48 indexes: indexes, 49 }, 50 ], 51 version: 1, 52 }).then(() => { 53 // asyncテーブルに非同期で並列にデータ(keys)を登録する 54 return Promise.all( 55 keys.map((key) => 56 upsert("async", key) 57 )); 58 }).then(() => { 59 // syncテーブルに非同期で直列にデータ(keys)を登録する 60 return keys.reduce( 61 (promise, key) => promise.then(() => upsert("sync", key)) 62 , Promise.resolve()); 63 }).then(() => { 64 console.log("completed!"); 65 // syncテーブルで値が0の行数をカウント 66 return select('sync'); 67 }).then((count) => { 68 console.log('sync=' + count); 69 // asyncテーブルで値が0の行数をカウント 70 return select('async'); 71 }).then((count) => { 72 console.log('async=' + count); 73 }).catch((err) => { 74 console.log(err); 75 }); 76</script>
試したこと
開発者ツールでIndexDBの中身を確認し、構築されたインデックスと思しきデータ(sample_db__idx_{{id}}_value)を見ると、確かに14個しか入っていない。
補足情報(FW/ツールのバージョンなど)
Google Chrome: Windowsバージョン: 84.0.4147.105(Official Build)(64 ビット)
nanoSQL(@nano-sql/core)バージョン: 2.3.7
追記
回答なかったので開発元に問い合わせしました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。