在聚合框架mongodb中找到从一个机场到另一个机场的可能航班,最多有一个中间机场停机
Posted
技术标签:
【中文标题】在聚合框架mongodb中找到从一个机场到另一个机场的可能航班,最多有一个中间机场停机【英文标题】:find the possible flights going from one airport to another with at most one intermediate airport stoppage in aggregate framework mongodb 【发布时间】:2021-03-15 19:53:00 【问题描述】:如何找到从“BAN”到“CHD”的所有可能航班,最多有一次中间机场停飞?
我基本上想获得一个数组的数组,该数组具有一个对象(直飞)或两个对象(连接的航班与一个中间机场停止)
数据集
"_id" : ObjectId("5fc92425f356c05bdafe724a"),
"to" : "CHD",
"from" : "BAN"
"_id" : ObjectId("5fc92425f356c05bdafe724b"),
"to" : "CHD",
"from" : "DEL"
"_id" : ObjectId("5fc92425f356c05bdafe724d"),
"to" : "DEL",
"from" : "BAN"
"_id" : ObjectId("5fc92425f356c05bdafe724e"),
"to" : "CHD",
"from" : "CHN"
"_id" : ObjectId("5fc9245af356c05bdafe7251"),
"to" : "BAN",
"from" : "CHD"
OUTPUT REQUIRED
[
[
"_id" : ObjectId("5fc92425f356c05bdafe724a"),
"to" : "CHD",
"from" : "BAN"
],
[
"_id" : ObjectId("5fc92425f356c05bdafe724b"),
"to" : "CHD",
"from" : "DEL"
,
"_id" : ObjectId("5fc92425f356c05bdafe724d"),
"to" : "DEL",
"from" : "BAN"
]
]
【问题讨论】:
【参考方案1】:我相信这已经足够了,但请随时测试或标记任何错误:
db.collection.aggregate([
"$graphLookup":
"from": "collection",
"startWith": "$to",
"connectFromField": "to",
"connectToField": "from",
"as": "flights",
"maxDepth": 0,
"restrictSearchWithMatch": $or: [ from: "BAN" , to: "CHD" ]
,
$match: from: "BAN"
])
Live
理念是我们需要的:
A ---> Anywhere
Anywhere ---> B
始终抱着“Anywhere”,就是同一个地方。
-
我们获取一个文档,如果 to 不是 B 或 from 不是 A,我们丢弃
如果 to 是 B 或 from 是 A,那么我们在 to:anywhere 和 from:anywhere 之间寻找完全匹配
我们需要删除以下路径:B-->anywhere; Anywhere-->A(反向路径),由
$match
完成
如果这很慢,值得尝试索引“来自”字段,如下所示:
db.nameOfDB.createIndex(from:1)
【讨论】:
以上是关于在聚合框架mongodb中找到从一个机场到另一个机场的可能航班,最多有一个中间机场停机的主要内容,如果未能解决你的问题,请参考以下文章
MongoDb 聚合基于 ids 过滤列表并将此过滤列表映射到另一个字段