如何从MongoDB嵌套嵌入式文档获取E6-2135航班各舱位baseFare
解决方案:提取航班E6-2135的舱位票价
方法一:直接返回完整舱位票价列表
无需$unwind,通过聚合管道精准筛选目标航班后提取票价数组即可:
db.yourCollectionName.aggregate([ // 缩小处理范围,匹配包含目标航班的文档 { $match: { "flights.flightId": "E6-2135" } }, { $project: { _id: 0, flightFares: { // 从flights数组中筛选出目标航班,提取其fare属性 $first: { $filter: { input: "$flights", cond: { $eq: ["$$this.flightId", "E6-2135"] } } }.fare } } } ])
执行结果:
{ "flightFares": [ { "travelClass": "Economy", "baseFare": 3988 }, { "travelClass": "Business", "baseFare": 9999 } ] }
方法二:每个舱位单独成文档
如果需要将每个舱位作为独立文档返回,可结合$unwind和$replaceRoot:
db.yourCollectionName.aggregate([ { $match: { "flights.flightId": "E6-2135" } }, { $project: { _id: 0, fares: { $first: { $filter: { input: "$flights", cond: { $eq: ["$$this.flightId", "E6-2135"] } } }.fare } } }, { $unwind: "$fares" }, { $replaceRoot: { newRoot: "$fares" } } ])
执行结果:
{ "travelClass": "Economy", "baseFare": 3988 } { "travelClass": "Business", "baseFare": 9999 }
关键说明
$filter用于精准定位目标航班,避免对整个flights数组$unwind带来的不必要性能消耗;$first是因为每个文档中flightId唯一,筛选后只会得到单元素数组,直接提取即可;- 若集合中同一文档存在多个相同
flightId的航班,可去掉$first,后续对筛选后的航班数组再做$unwind处理。
内容的提问来源于stack exchange,提问作者EdwardFunnyHands
相关产品推荐
相关产品推荐

