旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

mongoose-id-extractor-pluginで常に_idを取得

2014年10月28日

mongoose で ObjectId 型のフィールドを定義した場合、population が実行済みか否で取得できる値が変わります。

例えば、過去に書いたことでもありますが、以下の問題です:

// foo に対して populate 未実行の場合は foo が ObjectId インスタンス
doc.foo;

// foo に対して populate を実行済みの場合は foo はドキュメントなので
// foo._id が ObjectId インスタンス
doc.foo._id;

// 両方の状況に対応するためには、このような分岐を書く必要がある
var fooId = doc.populated('foo') || doc.foo;

npm パッケージを作った

なので、mongoose-id-extractor-plugin という npm パッケージを作りました。
mongoose-plugins の仕組みを使い、foo に対して、常に _id を抽出できる foo_idschema.virtual で定義します。

大体こんな風に使う:

var mongoose = require('mongoose');
var idExtractor = require('mongoose-id-extractor-plugin');

var commentSchema = new mongoose.Schema({
  article: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Article'
  }
});

// plugin として使う
commentSchema.plugin(idExtractor, { refs:['article'] });

var Comment = mongoose.model('Comment', commentSchema);
var comment = new Comment();
// 常に _id を返す article_id が生えている
comment.article_id;

詳しくは、GitHub をご確認下さい。

ご査収のほど、よろしくお願い申し上げます。