DRYな備忘録

Don't Repeat Yourself.

mongoDBをインストールしてnode.jsから使う【mongodb】【mongoose】【node.js】【Debian】

【課題】

JS好きーなのにmongo(もはや遅い)をちゃんとアプリケーションで使ったことなかったので、とりあえずやっとかなきゃな、という。

nodejs、npm、express入ってる前提でいきます。express入れるまでの記事はこちら

【記録】

1. まずmongodbを入れる

% cd
% sudo apt-get install mongodb

確認

% mongo --version
MongoDB shell version: 1.4.4

2. 次にmongoose入れる

mongooseとは

f:id:otiai10:20121128001334j:plain

Mongoose は非同期環境において機能することを目的とした MongoDB のオブジェクトモデリングツールです。

だそうです。
参考
Mongoose
Mongoose - デベロッパーズガイド 日本語訳

ということで

% npm install mongoose

確認

% npm list | grep mongoose

3. ちょっと寄り道:expressで最小限のウェブサーバ立てる

/**
 * minimum.js
**/

// create app by express
var express = require('express');
var http    = require('http');
var app = express();
app.configure(function(){
  app.set('port', 8000);
});

// define routing
app.get('/',function(request,response){
    response.send({'田井中':'律'}); 
});

// listen
http.createServer(app).listen(app.get('port'), function(){
  console.log('listening on ' + app.get('port'));
});

うごかす

% node minimum.js
listening on 8000

これで、サーバの8000ポート/にアクセスするとブラウザ上で

{
    '田井中' : '律'
}

と表示されるようになりました

4. mongooseをつかってsaveとfindする

上記のminimum.jsをちょっとだけいじってmongooseでmongodbを操作してウェブアプリっぽくする

/**
 * minimum.js
**/

/********** for mongoose **********/
var mongoose = require('mongoose');
var db       = mongoose.createConnection('mongodb://localhost/test');// define schema
var mouseSchema = new mongoose.Schema({
    name        : String,
    age         : Number,    is_pockemon : Boolean,
});
// create object
var Mouse = db.model('Mouse', mouseSchema);
/*********************************/

// create app by express
var express = require('express');
var http    = require('http');
var app = express();
app.configure(function(){
  app.set('port', 8000);
});

app.get('/save',function(request,response){

    // define data
    var tom = new Mouse({
        name       : 'Tom',
        age        : 72,
        is_pockemon: false,
    });
    var mickey = new Mouse({
        name       : 'Mickey',
        age        : 84,
        is_pockemon: false,
    });
    var picachu = new Mouse({
        name       : 'ぴかちゅー',
        age        : 16,
        is_pockemon: true,
    });

    // save to mongodb
    tom.save();
    mickey.save();
    picachu.save();

    response.send({'message' : '保存したよん'});
});

app.get('/find',function(request,response){
    // find from mongodb
    Mouse.find(function(err, mice){
        if(err) console.log(err);
        response.send(mice);
    });
});

// listen
http.createServer(app).listen(app.get('port'), function(){
  console.log('listening on ' + app.get('port'));
});

まずデータ構造のひな形であるSchemaを定義する(Mouse)。
で、/saveでアクセスきたら、それを元に実際のデータをつくっていく(tomとかmickeyとかpicachuとか)。
一方、/findでアクセス来たら、Mouseスキーマの中のものを取ってきて返す。

 

なんか超ざっくりMySQL的に理解するなら、

Schema -> テーブルとかテーブル構成とか

Schemaのインスタンス -> テーブルのrowひとつ分みたいな感じなのかな。

 

ブラウザで /saveにアクセスすると、

f:id:otiai10:20121128000138p:plain

で、/findでアクセスすると、

f:id:otiai10:20121128000207p:plain

なるほどなるほど。いけてるじゃん。

 

【雑感】

今動かしてるサービスは node.js + mysql で十分事足りてるので、あえてmongoDBでやる必要性は無いのだけれど、JS好きーとしてコレはやっとかないといけないなあと思ったのでやった。

素人を脱出すべくもがき続け、ちょっとずつ技術的なことが分かってくるにつれて、分かり易いドキュメントを書くということ自体にも楽しさを感じつつある。

 

DRY