質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1090閲覧

nanoSQLの並列登録時のインデックスについて

dameo

総合スコア943

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/31 22:18

編集2020/08/01 08:48

前提・実現したいこと

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

追記

回答なかったので開発元に問い合わせしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問