share facebook facebook twitter menu hatena pocket slack

WebSocketってなんじゃ?(Node編4 MongoDBってなんじゃ?)

三浦 悟

WRITTEN BY 三浦 悟

今回は、MongoDBについての記事になります。
MongoDBはNoSQLで、BSONというJSONのバイナリ版のような形式でデータの入出力を行い、クエリ等のデータ操作をjavascriptで行うため、サーバーサイドJavascriptととても相性がよく、node.jsと共によく利用されているようです。

今回は、このMongoDBをnode.jsから操作してみます。

MongoDB公式サイトにあるように、yumでインストールするためのMongoDB用のyumリポジトリを追加します。
以下のファイルを作成します。

/etc/yum.repos.d/10gen.repo

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0

それでは、yumでインストールします。

yum install mongo-10gen mongo-10gen-server -y

インストールが終了したら、mongodが/etc/init.d/以下にできるので、起動します。


/etc/init.d/mongod start

MongoDBのコンソールを立ち上げてみます。

$ mongo
MongoDB shell version: 2.0.0
connecting to: test

testというDBに繋がりました。
ここで、helpと入力すると、いくつかのコマンドが紹介されています。
それでは、DBの一覧を見てみます。

> show dbs
local (empty)
test (empty)

localとtestというDBがあり、中身はまだ空になっています。

MongoDBは基本的にはスキーマを定義することなく、そのままデータを保存することができます。
データが保存された時点で、それがスキーマになります。
以下のように、hogeというデータを保存、その直後にhogeを参照してみます。

> db.hoge.save({id:"1", name:"HOGE"});
>
> db.hoge.find();
{ "_id" : ObjectId("4e9f8ced316d58abc218dc43"), "id" : "1", "name" : "HOGE" }

このように、クエリに相当するものもすべてjavascriptで行い、結果はJSON形式で表示されるので、nodeとの相性が良さそうです。

それでは、このMongoDBにnode.jsからアクセスしてみます。
node.jsからMongoDBにアクセスするには、MongoDB用のパッケージモジュールを入れる必要があります。
Mongo用のモジュールはいくつかあるのですが、今回はMongooseを利用してみます。
mongooseのインストールはnpmで行います。

# npm install -g mongoose

> mongodb@0.9.6-22 install /usr/local/lib/node_modules/mongoose/node_modules/mongodb
> bash ./install.sh

================================================================================
=                                                                              =
=  To install with C++ bson parser do    =
=  the parser only works for node 0.4.X or lower                               =
=                                                                              =
================================================================================
Not building native library for cygwin
Using GNU make
mongoose@2.3.5 /usr/local/lib/node_modules/mongoose
├── colors@0.5.0
├── hooks@0.1.9
└── mongodb@0.9.6-22

以下のように、mongoにデータを投入するコードを書いてみます。

#!/usr/local/bin/node

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/memorycraft');

var Schema = mongoose.Schema;
var ItemSchema = new Schema({title:String, auther:String, price:Number, date:Date});
var Item = mongoose.model('Item', ItemSchema);

var item = new Item();
item.title = "体脂肪計タニタの社員食堂 ~500kcalのまんぷく定食~";
item.auther = "タニタ";
item.price = 1200;
item.date = new Date(2010, 1, 21);

item.save(function(err){
  if(err){
    console.log(err.message);
  }
  else{
    console.log("保存しました");
  }
});

上記のコードを実行します。

$ ./hello_mongo.js
保存しました

ここで、実際にデータが投入されているか再度mongoのコンソールで確認してみます。

$mongo
> show dbs
local (empty)
memorycraft 0.0625GB
test 0.0625GB
>
> use memorycraft
switched to db memorycraft
>
> show collections
items
system.indexes
>
> db.items.find()
{ "date" : ISODate("2010-02-20T15:00:00Z"), "price" : 1200, "auther" : "タニタ", "title" : "体脂肪計タニタの社員食堂 ~500kcalのまんぷく定食~", "_id" : ObjectId("4e9f98394699a3fb40000001") }

memorycraftというDBが追加されており、投入したデータが入っていることが確認できました。

ここで、mongodb+nodeがいいのは、データの保持の時点でデータの形式がJSONなので、取得結果もJSONになっていることです。
そして、上記のコードで書いたようにアクセスの結果がすべてコールバックで記述できるので、とても柔軟にコード記述ができます。
例として、以下のように別途WEBフレームワークなどを使用した場合、取得したデータをそのままレスポンスに返すことで余計な変換処理が必要なくなります。

Item.find({}, function(err, items) {
  if(!err) {
    res.json(items);
  }
});

少しだけ触れただけですが、とても便利なことがわかりました。
これからいろいろと試してみよう思います。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。