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 オブジェクトが返ってきます.
モデルは以下のような手順で定義,取得します.
- トップレベルの Mongoose オブジェクトにスキーマを登録 (mongoose.model)
- Connection を取得 (mongoose.createConnection)
- 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 があるのですが,それはまた次の機会に取り上げてみたいと思います.