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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。