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
相关产品推荐
相关产品推荐

