KOBA789 です。
populate を使うと Join のようなことが実現できると思います。
こんな感じでメソッドチェーンします。
Model.find({id: id}).populate('field').exec(function (err, docs) { /*
do something */});
詳しくは公式のドキュメントに書いてあります。
http://mongoosejs.com/docs/populate.html
2012年7月25日 15:34 アウゼン <[email protected]>:
> こんにちはアウゼンです。
>
> 質問なのですが、node + mongooseを使って
> 下記、RDBのJoin的なものを実現するにはどう
> すれば良いでしょうか?
>
> 大半は、埋め込みで1つのテーブルにまとめれる
> のですが、例2のような場合は同じ内容が複数
> ドキュメントに格納されるのが、RDB脳的に拒絶
> してしまいます。
>
> 例1.(1:1)
>
> col1 col2
> ┌─┬─┐ ┌─┬─┐
> │ X│01│ │01│ A│
> ├─┼─┤ ├─┼─┤
> │ Y│02│ │02│ B│
> └─┴─┘ └─┴─┘
>
> ↓
> result
> ┌─┬─┐
> │ X│ A│
> ├─┼─┤
> │ Y│ B│
> └─┴─┘
>
> 例2.(1:n)
>
> col3 col4
> ┌─┬─┐ ┌─┬─┐
> │ X│01│ │01│ A│
> ├─┼─┤ ├─┼─┤
> │ Y│02│ │01│ B│
> ├─┼─┤ ├─┼─┤
> │ Z│01│ │02│ C│
> └─┴─┘ └─┴─┘
>
> ↓
> result
> ┌─┬─┐
> │ X│ A│
> │ ├─┤
> │ │ B│
> ├─┼─┤
> │ Y│ C│
> ├─┼─┤
> │ Z│ A│
> │ ├─┤
> │ │ B│
> └─┴─┘
>
> 例1を下記のように実装しようとしたのです
> が、findが非同期なんでうまくいかないです
> よね。
>
> app.get('/', function(req, res) {
> col1.find({}, function(err, col1) {
> for (var i = 0; i < col1.length ; i++) {
> col2.findOne({id:col1[i].id}, function(err, col2) {
>
> });
> });
> });
>
>
> ・やり方はありますか?
> mongoose-dbrefとか使わないとだめなんで
> しょうか?
>
> ・dbrefの場合はコレクションを作る時から
> 参照を埋め込まないといけないのでしょうか?
>