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

MongoDB查询:获取指定Workspace时排除isArchived=true的Workbook

MongoDB关联查询:排除已归档的子文档ID

针对查询指定ID的workspace,并过滤掉其workbooks数组中对应isArchived=true的子文档ID的需求,这里提供两种实用的聚合实现方式:

方法一:$lookup + $filter 组合实现

先关联所有匹配的子文档,再过滤掉已归档项,最后提取有效ID:

db.workspace.aggregate([
  // 匹配目标workspace文档
  {
    $match: {
      _id: ObjectId("指定的workspaceID") // 替换为你的目标ID
    }
  },
  // 关联workbooks集合,获取所有匹配的子文档
  {
    $lookup: {
      from: "workbooks",
      localField: "workbooks",
      foreignField: "_id",
      as: "matchedWorkbooks"
    }
  },
  // 过滤掉已归档的workbook
  {
    $addFields: {
      filteredWorkbooks: {
        $filter: {
          input: "$matchedWorkbooks",
          cond: { $ne: ["$$this.isArchived", true] }
        }
      }
    }
  },
  // 重构workbooks字段为过滤后的ID数组,保留原文档其他字段
  {
    $project: {
      workbooks: "$filteredWorkbooks._id",
      name: 1,
      createdAt: 1 // 按需保留其他字段
    }
  }
])

方法二:使用$lookup的自定义管道(更高效)

在关联阶段直接过滤已归档的子文档,避免不必要的数据加载,适合数据量较大的场景:

db.workspace.aggregate([
  {
    $match: {
      _id: ObjectId("指定的workspaceID") // 替换为你的目标ID
    }
  },
  {
    $lookup: {
      from: "workbooks",
      let: { workspaceWorkbookIds: "$workbooks" },
      pipeline: [
        // 关联时仅匹配当前workspace的未归档子文档
        {
          $match: {
            $expr: {
              $and: [
                { $in: ["$_id", "$$workspaceWorkbookIds"] },
                { $ne: ["$isArchived", true] }
              ]
            }
          }
        },
        // 仅返回_id字段,减少数据传输
        { $project: { _id: 1 } }
      ],
      as: "filteredWorkbooks"
    }
  },
  // 替换原workbooks字段为过滤后的ID数组
  {
    $project: {
      workbooks: "$filteredWorkbooks._id",
      name: 1,
      createdAt: 1 // 按需保留其他字段
    }
  }
])

优化建议

为提升查询效率,建议给workbooks集合创建复合索引:

db.workbooks.createIndex({ _id: 1, isArchived: 1 })

内容的提问来源于stack exchange,提问作者raju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:22