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. 没有交易
  2. 没有连接
  3. 一个文档只有原子操作
  4. 您将无法使用聚合框架

如果无法迁移到一个集合模式,那么您可能应该执行以下操作:

    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)
                    });
                });

            });
        });
    }

请注意,如果数据库中有大量数据,那么您可能应该使用游标。http://mongoosejs.com/docs/api.html#querystream_QueryStream

于 2012-11-29T18:04:25.003 回答