MongoDB多查询合并:获取A集合独有的文档编号
合并后的MongoDB聚合查询方案
直接给你合并后的完整聚合查询,同时拆解每个阶段的作用:
db.receptions.aggregate([ // 1. 先筛选集合A(receptions)中符合条件的文档 { $match: { // 替换为你的实际日期筛选区间 createTime: { $gte: ISODate("2024-01-01T00:00:00Z"), $lte: ISODate("2024-01-31T23:59:59Z") }, // 替换为你的实际UUID范围条件 uuid: { $gte: "uuid-start-value", $lte: "uuid-end-value" } } }, // 2. 关联集合B(replyacusexmlblobs),同时完成B的条件筛选 { $lookup: { from: "replyacusexmlblobs", let: { receptionUuid: "$uuid" }, // 传递A的UUID到关联管道 pipeline: [ { $match: { $expr: { $eq: ["$uuid", "$$receptionUuid"] }, // 匹配A、B的UUID // B的日期筛选条件,和A保持一致或按实际需求调整 createTime: { $gte: ISODate("2024-01-01T00:00:00Z"), $lte: ISODate("2024-01-31T23:59:59Z") }, // B的EventResponse筛选条件,替换为你的实际规则 EventResponse: { $exists: true, $ne: "" } } }, { $project: { _id: 0, uuid: 1 } } // 只保留必要字段,减少数据量 ], as: "matchedB" } }, // 3. 筛选出仅存在于A、B中无匹配的文档 { $match: { matchedB: { $size: 0 } } }, // 4. 只输出需要的文档编号字段 { $project: { _id: 0, documentNumber: "$uuid" // 替换为你实际的文档编号字段名 } } ])
关键逻辑说明
- 用带管道的$lookup替代普通关联,直接在关联阶段完成集合B的所有筛选,避免后续处理冗余数据。
- 通过判断
matchedB数组长度为0,精准定位“仅存在于A”的文档,比$exists更直观可靠。 - 所有筛选条件都前置,最大程度减少聚合过程中处理的数据量,提升查询效率。
内容的提问来源于stack exchange,提问作者MANUEL ALBERTO COY BENAVIDES
相关产品推荐
相关产品推荐

