2015-04-13 3 views
2

Я просто не могу обойти это. Я пытаюсь получить результат запроса в мангусте. У меня есть база данных поездок, которые включают в себя маршрут остановок. Я хочу получить все поездки, которые посещают целевую станцию ​​(бонус: и использовать определенную платформу).Nodejs mongoose complex query

Вот что схемы выглядит следующим образом:

var StopSchema = new Schema({ 
    arrival: String, 
    departure: String, 
    platform: String, 
    station: String, 
}); 

var JourneySchema = new Schema({ 
    trainNumber: String, 
    destination: String, 
    route: [StopSchema] 
}); 

exampleData:

{ 
    trainNumber: '1', 
    destination: 'Z', 
    route: [ 
    { arrival: "11:23", departure: "11:25", platform: "3", station: "A"}, 
    { arrival: "11:33", departure: "11:35", platform: "3", station: "B"}, 
    { arrival: "11:43", departure: "11:45", platform: "3", station: "Z"} 
    ] 
}, 
{ 
    trainNumber: '2', 
    destination: 'Z', 
    route: [ 
    { arrival: "12:23", departure: "12:25", platform: "3", station: "A"}, 
    { arrival: "12:33", departure: "12:35", platform: "3", station: "B"}, 
    { arrival: "12:43", departure: "12:45", platform: "3", station: "Z"} 
    ] 
}, 
{ 
    trainNumber: '3', 
    destination: 'F', 
    route: [ 
    { arrival: "12:23", departure: "12:25", platform: "3", station: "D"}, 
    { arrival: "12:33", departure: "12:35", platform: "3", station: "E"}, 
    { arrival: "12:43", departure: "12:45", platform: "3", station: "Z"} 
    ] 
} 

Запрос: получить все поездки посещения "B" (на платформе 3), перечислите маршрут и содействовать цели данные станции

desiredResult:

[ 
{ 
    trainNumber: '1', 
    destination: 'Z', 
    route: [ 
    { arrival: "11:23", departure: "11:25", platform: "3", station: "A"}, 
    { arrival: "11:33", departure: "11:35", platform: "3", station: "B"}, 
    { arrival: "11:43", departure: "11:45", platform: "3", station: "Z"} 
    ], 
    targetStation: { arrival: "11:33", departure: "11:35", platform: "3", station: "B"} 
}, 
{ 
    trainNumber: '2', 
    destination: 'Z', 
    route: [ 
    { arrival: "12:23", departure: "12:25", platform: "3", station: "A"}, 
    { arrival: "12:33", departure: "12:35", platform: "3", station: "B"}, 
    { arrival: "12:43", departure: "12:45", platform: "3", station: "Z"} 
    ], 
    targetStation: { arrival: "12:33", departure: "12:35", platform: "3", station: "B"} 
} 
] 

Я просто не знаю, какую злую комбинацию elemmatch/aggregate/virtual/query я могу использовать.

ответ

1

Поскольку MongoDB не поддерживает объединения, вы не можете сделать это в одном запросе с помощью вашей желаемой схемы. Вам понадобятся по крайней мере два запроса: один, чтобы получить идентификатор целевой остановки, а затем вторую, чтобы получить поездки, у которых есть эта остановка. Что-то вроде (предполагается, что модели Stop и Journey):

Stop.findOne({station: 'B', platform: '3'}).exec().then(function(stop) { 
    if (stop === null) { throw new Error('No stop matches request'); 
    return Journey.find({route: {_id: stop.id}}).populate('route').exec(); 
}).then(function(journeys) { 
    if (journeys === null || journeys.length === 0) { throw new Error('No journeys include requested stop'); } 

    // `journeys` should be an array matching your desired output 
    // you can add the extra property here or in the journeys query if you wish 
}).then(null, function (err) { 
    // Handle errors 
}); 
+0

Ok, так что мне нужно сделать это в несколько этапов. Но, начиная с одиночной остановки, странно, так как мне нужно все поездки на этой станции. Спасибо, спасибо. – user1736217

+0

Ваш пример показал единственную целевую остановку, поэтому предоставленный образец кода. Второй запрос захватывает все поездки, которые включают эту остановку. Тем не менее, тривиально сделать запрос на несколько остановок, если это то, что вы хотите. –