我有以下场景:
guests
的集合,他们需要选择他们将从哪个巴士站乘坐巴士。然后我有buses
收藏。每辆巴士有多次行程,每次行程有多个停靠站,每个停靠站都有一个位置。
我需要做一个 mongo 查询,返回客人信息和他们选择的公交车站(公交车站信息 + 填充
location
)。
问题是
trips
、stops
和location
不是mongo文档,而是buses
的子文档。
guests
收藏:
{
_id: ObjectId,
name: String,
...
bus_stop: ObjectId
...
}
buses
收藏:
{
_id: ObjectId,
...
trips: [{ //<-- Subdocument
_id: ObjectId
stops: [{ //<-- Subdocument
_id: ObjectId,
time: Date,
location: { //<-- Subdocument
_id: ObjectId,
...
name: String,
coordinates: [Number]
}
}]
}]
}
我需要的:
{
_id: ObjectId,
name: String,
...
bus_stop: {
_id: ObjectId,
time: Date,
location: {
_id: ObjectId,
...
name: String,
coordinates: [Number]
}
}
}
我正在尝试执行
$lookup
,但到目前为止没有运气。这是我要运行的查询:
$lookup: {
from: "buses",
let: { stop_id: "$bus_stop" },
pipeline: [
{ $match: { $expr: { $in: [ "$$stop_id", "$going_trips.$stops._id" ] } } } // trying to filter out the bus containing the bus stop
... // more stuff should probably go here
],
as: "bus_stop",
},
这是不完整和错误的,但我被困在这一步试图过滤掉包含有问题的公交车站的公交车。在此之后,我可能应该弄清楚如何获取巴士站和位置信息。
任何帮助将不胜感激。
https://mongoplayground.net/p/8Z5Lp8QG4gY
db.guests.aggregate([
{
"$lookup": {
from: "buses",
let: {
stop_id: "$bus_stop"
},
pipeline: [
{
$unwind: {
path: "$trips"
}
},
{
$unwind: {
path: "$trips.stops"
}
},
{
$match: {
$expr: {
$eq: [
"$$stop_id",
"$trips.stops._id"
]
},
}
}
],
as: "bus_stopDetails",
}
}
])
你可以在这里做这样的事情我首先展开行程和停止然后检查停止ID,你需要根据你的需要调整它这是可行的解决方案但我觉得如果需要可以通过调整查询进一步优化它。