2015-01-29 2 views
0

У меня есть две коллекции, стопы и услуги для приложения для отслеживания городских автобусов. Вот схемы:Есть ли более быстрый способ выполнить этот запрос MongoDB?

var ServiceSchema = new mongoose.Schema({ 
    name: {type: String, index: true}, 
    description: String, 
    service_type: String, 
    routes: {type: Array, "default": []} 
}); 

«маршруты», выше, представляет собой массив объектов и каждый объект имеет поле под названием «остановка», который является массивом stop_id, каждый из которых индексов к документу Stop.

var StopSchema = new mongoose.Schema({ 
    stop_id: {type: Number, index: true}, 
    name: String, 
    identifier: String, 
    locality: String, 
    orientation: Number, 
    direction: String, 
    coordinates : {type: [Number], index: '2d'}, 
    destinations: { type: Array, "default": []}, 
    services: {type: Array, "default": []} 
}); 

Я хочу найти все документы Stop, проиндексированные stop_ids в рамках данной службы. Я использовал цикл for.

var stops = db.services.findOne().routes[0].stops; 
stops.forEach(function(j,k){ 
    printjson(db.stops.findOne({stop_id: j})); 
}); 

ли это, кажется правильным, или есть более сложные (быстрее) , как я могу это сделать?

ответ

0

Вы можете получить все остановки по маршруту в одном запросе find с помощью $in.

В оболочке:

var route_stop_ids = db.services.findOne().routes[0].stops; 
var stops = db.stops.find({stop_id: {$in: route_stop_ids}}) 
+0

ли выполняется быстрее, а что? – michaelAdam

+0

@michaelAdam Да, это всего лишь один запрос вместо одного на остановку. – JohnnyHK

+0

Но разве этот запрос не должен включать внутри? – michaelAdam

Смежные вопросы