如何在MongoDB中获取ID存在于其他文档属性数组的vehicle文档?
解决方案:获取被seat关联的vehicle文档
这是个很常见的MongoDB关联查询场景,我给你几个实用的方案,都能精准得到你预期的结果:
方法一:分步查询(简单直观)
这种方式分两步走,先收集所有被seat关联的车辆ID,再用这些ID筛选vehicle文档,适合数据量不大的场景:
// 第一步:提取所有seat文档中vehicle数组里的唯一车辆ID const vehicleIds = db.seat.distinct("vehicle"); // 第二步:查询符合条件的vehicle文档 db.vehicle.find({ _id: { $in: vehicleIds } });
解释:distinct方法会自动帮我们去重,避免重复的ID,后续用$in匹配就能快速拿到目标文档。
方法二:聚合管道(一站式处理)
如果想在数据库端完成所有逻辑,用聚合管道是更优雅的选择,不需要在客户端处理中间数据:
db.vehicle.aggregate([ // 关联seat集合,找到包含当前车辆ID的seat文档 { $lookup: { from: "seat", localField: "_id", foreignField: "vehicle", as: "matched_seats" } }, // 只保留有匹配seat的车辆文档(过滤掉未被关联的vehicle) { $match: { matched_seats: { $ne: [] } } }, // 可选:移除临时的matched_seats字段,还原原始vehicle结构 { $project: { matched_seats: 0 } } ]);
解释:$lookup会给每个vehicle文档添加一个matched_seats数组,里面是所有关联它的seat文档;接着$match过滤掉没有匹配的车辆;最后$project可以去掉多余的字段,完全符合你预期的输出格式。
方法三:从seat集合反向聚合(可选)
也可以从seat集合入手,先整理出所有关联的车辆ID,再关联vehicle集合获取完整文档:
db.seat.aggregate([ // 展开vehicle数组,把每个ID拆成单独的文档 { $unwind: "$vehicle" }, // 分组去重,得到唯一的车辆ID列表 { $group: { _id: "$vehicle" } }, // 关联vehicle集合,获取对应完整文档 { $lookup: { from: "vehicle", localField: "_id", foreignField: "_id", as: "vehicle_doc" } }, // 展开vehicle_doc数组 { $unwind: "$vehicle_doc" }, // 将vehicle_doc设为根文档,得到最终结果 { $replaceRoot: { newRoot: "$vehicle_doc" } } ]);
这个方法适合需要先处理seat数据的场景,最终输出和前两种方法一致。
内容的提问来源于stack exchange,提问作者developer_jun
相关产品推荐
相关产品推荐

