1

mongodbの複数のコレクションをクエリしたいのですが、このようなデータがあります

Collection stops {
    { stop_id : 1, stop_name: 'a'},
    { stop_id : 2, stop_name: 'b'}, ...

Collection stop_time {
    { stop_id : 1, trip_id: 40},
    { stop_id : 2, trip_id: 41}, ...

Collection trips {
    { trip_id : 40, route_id: 400},
    { trip_id : 41, route_id: 401}, ...

Collection route {
    { route_id : 400, route_name: 'foo'},
    { route_id : 401, route_name: 'bar'}, ...

そして、stop_nameごとに、それに一致するroute_nameを知りたいです...(ちなみに、データ構造は選択しませんでした。これはGTFS形式です...)

問題に対応するクエリを簡単に実行する方法はありますか?

ありがとう

4

1 に答える 1

0

このようなアプローチはmongodbには適していません。すべてのデータを含む1つのコレクションを作成し、クエリを1つだけ作成する必要があります。

これは非常に重要です。理由は次のとおりです。

  1. 取引はありません
  2. 参加はありません
  3. 1つのドキュメントには不可分操作のみがあります
  4. 集約フレームワークを使用できなくなります

1つのコレクションスキーマに移行できない場合は、おそらく次のようにする必要があります。

    var _ = require("underscore")._;
    function get_all(cb) {
        stops.find({}, function(err, stps, cb) {

            stop_time.find({}, function(err, stptime) {

                var all = _.map(stps, function(e) {
                    e.trip_id = stptime[e.stop_id].trip_id;
                    return e;
                });

                trips.find({}, function(err, trips) {

                    all = _.map(all, function(e) {
                        e.route_id = trips[e.trip_id].route_id;
                        return e;
                    });

                    route.find({}, function(err, routes) {

                        all = _.map(all, function(e) {
                            e.route_name = routes[e.route_id].route_name;
                            return e;
                        });

                        cb(all)
                    });
                });

            });
        });
    }

DBに大量のデータがある場合は、おそらくカーソルを使用する必要があることに注意してください。http://mongoosejs.com/docs/api.html#querystream_QueryStream

于 2012-11-29T18:04:25.003 に答える