JavaScript でデータベースを使う必要性が出てきてしまった。
練習してみよう。
Introduction · RxDB - Documentation
https://rxdb.info/
NoSQLデータベースだそうな。SQLite か LMDB かでいえば、LMDB 側ということになろう。
私はそんなにデータベースを使ったことがないので、比較できるのはその2つくらいなのだ。
npm i でインストールすれば使えるのだろうと思ったが、RxDB 以外にもインストールしないと使えないらしい。
adapter というものもインストールして設定しないと使えないっぽい。
今回は Node.js なので、adapter のページにあった leveldown というものを使ってみよう。 Level DBらしい。
npm i rxdb rxjs leveldown pouchdb-adapter-leveldb
メニューの順番からすると、 RxDatabase, RxSchema, RxCollection, RxDocument, RxQuery の順にやっていくのだろう。
SQL ではないからか、テーブルではなくスキーマと呼ぶのか? そこはまだよいのだが、コレクションとかドキュメントとかあるのだが、何なのかが分からん。。。
開発者が知っておくべき、ドキュメント・データベースの基礎:特集:MongoDBで理解する「ドキュメント・データベース」の世界(前編)(1/3 ページ) - @IT
https://www.atmarkit.co.jp/ait/articles/1211/09/news056.html
ドキュメントはデータベースに突っ込むデータで、コレクションはその集合・・・?
- createRxDatabase()でデータベースを作る
- データベースに突っ込みたいデータの構造を決めて addCollections() で追加する
- insert() でデータを突っ込む
- find() でデータを取り出す
01: import { 02: createRxDatabase, 03: addRxPlugin, 04: } from 'rxdb'; 05: 06: addRxPlugin(require('pouchdb-adapter-leveldb')); 07: const leveldown = require('leveldown'); 08: 09: const fn = async () => { 10: const db = await createRxDatabase({ 11: name: 'heroesdb', 12: adapter: leveldown, 13: }); 14: 15: const myHeroSchema = { 16: "title": "hero schema", 17: "version": 0, 18: "description": "describes a simple hero", 19: "type": "object", 20: "properties": { 21: "name": { 22: "type": "string", 23: "primary": true 24: }, 25: "color": { 26: "type": "string" 27: }, 28: "healthpoints": { 29: "type": "number", 30: "minimum": 0, 31: "maximum": 100 32: }, 33: }, 34: "required": ["color"], 35: "attachments": { 36: "encrypted": false 37: }, 38: indexes: ['healthpoints', 'color'] 39: } 40: await db.addCollections({ 41: heroes: { 42: schema: myHeroSchema 43: } 44: }); 45: 46: await db.heroes.bulkInsert([ 47: { 48: name: "yoshida", 49: color: "green", 50: healthpoints: 30, 51: }, 52: { 53: name: "yoshio", 54: color: "blown", 55: healthpoints: 33, 56: }, 57: { 58: name: "momo", 59: color: "pink", 60: healthpoints: 9, 61: }, 62: ]); 63: 64: const query = await db.heroes.find(); 65: const resHealth = await query.sort('healthpoints').exec(); 66: for (let lp = 0; lp < resHealth.length; lp++) { 67: console.dir(resHealth[lp].get('name')); 68: } 69: console.log(); 70: const resColor = await query.sort('color').exec(); 71: for (let lp = 0; lp < resColor.length; lp++) { 72: console.dir(resColor[lp].get('name')); 73: } 74: 75: await query.remove(); 76: } 77: fn();
難しすぎでは!?と思ったが、SQL を使うタイプだと SQL文というテキストになっているだけであんまり変わらんか。
addCollections() の戻り値はコレクションではあるのだが、コレクションの集合のようなものが返ってくるようだ。
これに find() したかったら、今回だと .heroes.find() のように名前を挟まないといかん。
そうなると db.heroes.find() と変わらん気がする。
それとは別に気になったのは、RxDB はその下で動いているデータベースを隠蔽するような形で動いていると思うのだが、トランザクションがあるデータベースだとパフォーマンスが悪くならないだろうか。 bulkInsert() で全部放り込めるなら良いけれども、取得しては保存、取得しては保存、みたいな使い方をしたい場合もあるだろうし。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。