JavaScript
Node.js

node.js 超入門④mongodbを使ってみる

More than 1 year has passed since last update.

ついに第4回です。

第一弾ではnode.jsの超基礎を学びながら簡単なwebサーバを作りました。
第二弾では、他のファイルに分割する方法や、ルーティングやファイルシステムを使ってHTMLで表示等を行いました。
第三弾では、簡単なアプリケーションを作ってみました。

今回は、前回のアプリケーションの続きとして、保存したデータの永続化(DBへの保存)もやってみます。
(長くなってしまいそうなので、今回はmongoに接続する所まで)

[基礎編]MongoDBとは

高速なNoSQLで、node.jsと相性が良いデータベースです。

最近の、NoSQLは、KVS/ドキュメント指向データベース/列指向データベース等がありますが、
MongoDBは、スキーマレスなドキュメント指向データベースです。

MongoDBは、トランザクションやリレーショナル(JOIN)機能をつけない事で、高速でKVSレベルの高いパフォーマンスを実現します。

特にリアルタイム処理にも強く、node.jsと相性が抜群です。

MongoDBとRDBの比較

RDBで使われている用語とMongoDBで使われる用語の対応を書いておきます。

RDB MongoDB
database database
table collection
record document
column field
index index
primary_key _id

ここで覚えておきたいのは、MongoDBはスキーマレスなドキュメント指向データベースであるという事です。
スキーマレスなので、RDBのように、カラム定義を行いません。

RDBでユーザ管理するテーブルを作れば、id(int), name(varchar), created_at(datetime)のように、各カラムの型を指定するため、各レコードには同じ型のデータが入ります。

しかし、MongoDBの場合は、document毎に自由fieldを定義することが出来ます。

node.jsからMongoDBを扱ってみる

まずは、インストールして、接続する所までやってみたいと思います。

$ npm install mongodb

実際にDBにテストデータを入れて、取得する部分までやるとこんな感じになります。
config.dbにはtestdbというデータベースの名前を入れてみました。

var mongoClient = require('mongodb').MongoClient;
var config = require('./config');

mongoClient.connect("mongodb://localhost/" + config.db, function(err, db) {
  // エラー処理
  if (err) {
    return console.dir(err);
  }

  db.collection("users", function(err, collection) {
    if (err) {
      return console.dir(err);
    }

    // 挿入するデータ
    var docs = [
      {name: "山口",   score: 20},
      {name: "大田",   score: 80},
      {name: "長本",   score: 100},
    ];

    collection.insert(docs, function(err, result) {
      // エラー処理
      if (err) {
        return console.dir(err);
      }

    });

    // 検索する
    collection.find().toArray(function(err, items) {
      console.log(items);
    });

  });
});

検索してみる

先程はfind()で全て取得しましたが、実際に検索してみて、mongoがどんなものか見てみましょう。

var mongoClient = require('mongodb').MongoClient;
var config = require('./config');

mongoClient.connect("mongodb://localhost/" + config.db, function(err, db) {
  // エラー処理
  if (err) {
    return console.dir(err);
  }

  db.collection("users", function(err, collection) {
    if (err) {
      return console.dir(err);
    }

    // 検索する
    collection.find({name: "長本"}).toArray(function(err, items) {
      console.log(items);
    });

  });
});

このようにfindに指定すれば条件指定して取得が可能です。

$ node mongo.js
[ { _id: 59b69c558e9ce1484773fffd, name: '長本', score: 100 } ]

結構簡単ですね。

次回は、前回作ったアプリケーションのデータをmongodbに保存、取得してデータの永続化にtryしてみようと思います。