You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:50:16