SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

NeDBを使ってNode.js環境でお手軽にNoSQLのDBを使ってみる

Node.jsでNoSQLなDBを使うときは、MongoDBなどと組み合わせるのがよくあるパターンかと思います。

ただ、MongoDBは別途インストールが必要なので、ちょっとNoSQLなDBのお勉強という程度で使うには少し面倒です。
また、OS環境へのインストールが必要ということで、Electronで作ったアプリのように、実行するファイル類一式を配布するようなケースにはMongoDBはマッチしません。

そんな時に使えそうなNeDBという組み込み型DBのライブラリがあります。
https://github.com/louischatriot/nedb

NeDBは、完全にJavaScriptだけで書かれているDBなので、npmから取得してきたスクリプト類だけでNoSQLなDBを利用することができます。
アプリのコード一式と一緒に配布するような用途にバッチリなライブラリです。
イメージ的にはNoSQL界のSQLite的な立ち位置ですかね。

ここでは、TypeScriptからNeDBを使ってみます。
ちょうど先日、TypeScript2.0がリリースされたので、TypeScritp2.0を使い、型定義ファイルもnpmから取得する方法で扱ってみたいと思います。

参考リンク

NeDBの各種APIは、MongoDBのAPIのサブセットとなっているため、MongoDBの入門資料などの知識をそのまま流用できます。

以下あたりのリンクが参考になります。
http://dotinstall.com/lessons/basic_mongodb_v3

また、NeDBの使い方の説明は↓の記事がわかりやすいです。
http://qiita.com/tinymouse/items/0731eef4aebf2779bd0b

準備

インストール

  1. package.jsonの生成
    • フォルダを作り、npm initコマンドで、package.jsonを生成します。
  2. TypeScriptのインストール
    • npm install typescript --save-devとコマンドを実行し、TypeScriptコンパイラをインストールします。
  3. NeDBのインストール
    • 続いて、npm install --save nedbのコマンドを実行し、nedbをインストールします。
  4. 型定義ファイルのインストール
    • npm install --save-dev @types/nedbを実行

各種プロジェクトの準備

続いて、色々と設定ファイル類の準備をしていきます。
tsconfig.json/package.jsonをそれぞれ以下のように編集します。

tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": true
    }
}
package.json
{
  "name": "nedb-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "tsc",
    "prestart": "npm run build",
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/nedb": "0.0.31",
    "typescript": "^2.0.3"
  },
  "dependencies": {
    "nedb": "^1.8.0"
  }
}

使ってみる

準備が整ったので、NeDBを使ってサンプルコードを書いてみます。

初めの一歩

とりあえず、以下のようなコードで、オンメモリなDBを作り、そこにドキュメントを作成&読み出しをしてみます。

import Datastore = require('nedb');
var db = new Datastore();

var doc = {
    name: "hoge",
    age: 20
};

db.insert(doc, function(err) {
    var result = db.find({}, (err, docs) => {
        console.dir(docs);
    });
});

ファイルにデータを保存

import Datastore = require('nedb');
var db = new Datastore({
    filename: 'data/database.db',
    autoload: true
});

var doc = {
    name: "hoge",
    age: 20
};

db.insert(doc, function(err) {
    var result = db.find({}, (err, docs) => {
        console.dir(docs);
    });
});

検索

import Datastore = require('nedb');
var db = new Datastore({
    filename: 'data/database.db',
    autoload: true
});

var doc = [
    { name: "hoge",  age: 20 },
    { name: "hoge1", age: 25 },
    { name: "hoge2", age: 30 },
];

db.insert(doc, function(err) {
    var result = db.find({age: 25}, (err, docs) => {
        console.dir(docs);
    });
});

DBファイルの中身

ファイルに保存したDBファイルの中身を見てみると、こんな風にプレーンテキストなJSONデータが格納されてました。

f:id:minami_SC:20161004011728p:plain

所感

MongoDBに慣れた方々だったら、いきなりJavaScriptでも何の問題もなく書けるかもしれませんが、 この手のNoSQL系DBの経験がない自分にとっては、TypeScriptで各種関数の説明や引数の説明が出るのはとても便利でした。
f:id:minami_SC:20161004005611p:plain

APIのドキュメント以上に、インテリセンスがライブラリの使い方を教えてくれる、という感じがします。