Mongoose のコネクション周り

node.js + MongoDB はイイ感じです.というわけで Mongoose ネタの続き.

見出し

  • connect と disconnect
  • 明示的にコネクションを扱う
  • Connection とイベント

connect と disconnect

require で取得する Mongoose オブジェクトには connect と disconnect があります.

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

// スキーマ登録
var HogeSchema = new Schema({
  label: String,
  value: Number
});
mongoose.model('Hoge', HogeSchema);

// デフォルトコネクションを開く
mongoose.connect('mongodb://localhost/test');

... (なんか使う)

// signal 飛んできたら閉じる
process.on('SIGINT', function() { mongoose.disconnect(); });

mongoose の connect を呼び出すと,デフォルトコネクションが使用されます.「デフォルトコネクション」とは,mongoose がプロパティとして持つ connections の [0] 要素を指しており,connection プロパティから取得可能です.
この [0] 要素は require 時の 'new Mongoose()' で生成され,'mongoose.connect(...)' でコネクションが開かれます.また,'mongoose.model(...)' した際には内部で自動的に使用されます.

対する disconnect は,connections プロパティが保持する全てのコネクションを閉じます.

明示的にコネクションを扱う

Mongoose オブジェクトの connect/model を使うと,常に「デフォルトコネクション」が使用されます.DB ごとにコネクションを保持したい場合は,コネクションを直接扱う必要があります.以下のようにします.

var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

// スキーマ登録
var HogeSchema = new Schema({
  label: String,
  value: Number
});
mongoose.model('Hoge', HogeSchema);

// コネクションと,それにひも付いたモデルを取得
var db = mongoose.createConnection('mongodb://localhost/test');
var Hoge = db.model('Hoge');

// 使う
Hoge.findOne({}, function(err, doc) {
  // ...
});

// 終わり
process.on('SIGINT', function() { mongoose.disconnect(); });

createConnection を使用すると Connection オブジェクトを取得できます.引数 (uri もしくは (host, database, port, callback) の組) を指定した場合,open 済みの Connection オブジェクトが返ってきます.

モデルは以下のような手順で定義,取得します.

  1. トップレベルの Mongoose オブジェクトにスキーマを登録 (mongoose.model)
  2. Connection を取得 (mongoose.createConnection)
  3. Connection 経由でモデルを取得 (db.model)

Connection の model を使用することで,Connection オブジェクトとモデルをひも付けます.

サンプルコードでは disconnect を呼び出して一括 close していますが,Connection にも close があるため,個別にコネクションを閉じることも可能です.

Connection とイベント

Connection は EventEmitter の派生になっており,イベントをハンドリングできます.

var db = mongoose.createConnection();  // まだ開かない

// ハンドラ登録
db.on('open' , function() { console.log('open'); });
db.on('close', function() { console.log('close'); });

// コネクションを開く
db.open('mongodb://localhost/test');

var Hoge = db.model('Hoge');
Hoge.findOne({}, function(err, doc) {
  // ... (いろいろ)
});

process.on('SIGINT', function() { mongoose.disconnect(); });

// [実行結果]
// $ node test.js
// open
// ... (findOne の結果)
// close

これ以外にもあるのかな?

終わりに

前回の内容はコネクション周りを明記していなかったので,今回独立してコネクション周りを取り上げてみました.
実はまだ '...Set' という API があるのですが,それはまた次の機会に取り上げてみたいと思います.