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の場合はコレクションを作る時から
>  参照を埋め込まないといけないのでしょうか?
>

メールによる返信