A Peak Never Ending !

Mongooseを使ってmongodbにアクセスしてみる

前回mongodbを触ってみたので、次はmongodbのデータをwebsocket経由で表示できるようにしたいな〜 と思って調べたところnode.js + mongodb + socket.ioで出来そうな気がしたのでnode.js + mongoose をまず試してみた。mongooseはmongodbを扱うためのライブラリでsocket.ioはwebsocket (+未対応ブラウザでのエミュレーション)を実現してくれるライブラリらしい。 まずは、node.js自体動かす環境がないので環境の構築から。ちなみにnode.jsは騒がれた頃に少し触った程度 でjavascriptも全然書いたことなかったり。

node.jsの準備

node.jsのインストールはnvm、ライブラリ群はnpmを使って管理すると楽らしいので、まずはnvmをインストール。 nvmをインストールするとnpmも入るらしい。

nvmインストール
1
2
3
4
git clone git://github.com/creationix/nvm.git ~/.node
. ~/.node/nvm.sh
nvm install v0.4.12
nvm use v0.4.12

.bashrcに以下を追加

~/.bashrc
1
2
. ~/.node/nvm.sh
nvm use v0.4.12

mongooseをインストールしてアクセス

まずはmongooseをインストール

mongooseインストール
1
npm install mongoose

mongooseを使ってデータを取り出してconsoleに出力するテストプログラムを書く。 流れ的にはmongoに保存するデータの構造を定義するSchemaを作って、mongooseにmodelとして登録する感じかな。 下の場合だと、title,bodyをキーとしてもつスキーマを定義してMemoモデルとして登録。その後memoデータベース に接続してfindを行うといった具合。ちなみにコレクション名を指定してる場所がないけど、mongooseはモデル名を lower caseにしてsを付けた名前をコレクション名として使うっぽい(この場合はmemosがコレクション名になる) もしかして明示的に指定できるのかもしれないけど、その辺はまだ調べてなくてコレクション名がmemosになるのも mongoose経由で一度データを登録してみて、mongodbを直接叩いてわかった感じ。

memo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
 * Mongooseでデータを取り出して表示するテスト
 */
var mongoose = require('mongoose');

// スキーマ定義
var MemoSchema = new mongoose.Schema({
  title: String,
  body: String
});
// モデルとして登録
var Memo = mongoose.model('Memo', MemoSchema);

// mongodbに接続
mongoose.connect('mongodb://localhost:27017/memo', // memoの部分はデータベース名
  // コールバックでエラー時の処理が書けるみたい。
  function(err) {
    if (err) {
      console.log(err);
    } else {
      console.log('connection success!');
    }
  }
);

// findしてコンソールに出力
Memo.find({}, function(err, docs) {
  if(!err) {
    console.log("num of item => " + docs.length)
    for (var i = 0; i < docs.length; i++ ) {
      console.log(docs[i]);
    }
    mongoose.disconnect()  // mongodbへの接続を切断
    process.exit()         // node.js終了
  } else {
    console.log("find error")
  }
});

mongodbにサンプルデータを入れる。mongoose経由で入れても良いけど、mongodb自体もちょっと触り慣れたいのであえて直接いれてみたりしてる。 (さっき言ったとおり一回mongoose経由で入れるテストはしたけど)

1
2
3
> use memo
switched to db memo
> db.memos.save({title:'test title', body:'test body'})

作ったスクリプトを実行して動作確認

1
2
3
4
5
6
7
8
node memo.js

# 出力
connection success!
num of item => 1
{ _id: 4f54a721601f550c008585e4,
  title: 'test title',
  body: 'test body' }

こんな感じ。