如何查询MongoDB中未被其他文档children数组包含的文档ID?
获取未被其他文档children引用的分类文档
可以实现这个需求,下面提供两种可行的实现方式:
方式一:简洁查询(适合中小数据量)
先提取所有被其他文档children数组引用的ID,再筛选出ID不在该列表中的文档:
// 提取所有被引用的ID const referencedIds = await CategoryModel.distinct("children"); // 查询未被引用的文档 const unReferencedCategories = await CategoryModel.find({ _id: { $nin: referencedIds } });
方式二:聚合管道(适合大数据量)
通过聚合管道一次性完成数据处理,避免多次查询的性能损耗:
const unReferencedCategories = await CategoryModel.aggregate([ // 收集所有被引用的ID { $group: { _id: null, referencedIds: { $addToSet: { $each: "$children" } } } }, // 关联原集合,对比筛选未被引用的ID { $lookup: { from: "categories", // 替换为你的实际集合名称 let: { refs: "$referencedIds" }, pipeline: [ { $match: { $expr: { $not: { $in: ["$_id", "$$refs"] } } } } ], as: "unreferencedDocs" } }, // 展开并输出结果 { $unwind: "$unreferencedDocs" }, { $replaceRoot: { newRoot: "$unreferencedDocs" } } ]);
注意事项
- 方式一的
distinct操作在数据量极大时可能存在性能瓶颈,此时优先选择聚合管道方案 - 确保替换代码中
categories为你的实际集合名称
内容的提问来源于stack exchange,提问作者Dima Kambalin
相关产品推荐
相关产品推荐

