如何为CollectionA文档添加布尔字段标识其_id是否在CollectionB查询结果中
解决MongoDB关联集合并添加布尔标记字段的问题
你原来的$lookup写法没关联两个集合的对应字段,所以返回的是所有符合筛选条件的CollectionB文档,自然不符合需求。正确的做法是在关联时同时实现筛选和匹配对应ID的逻辑,具体步骤如下:
- 用
$lookup的let参数把当前CollectionA文档的_id传入子管道,子管道里先执行你的几何筛选,再加上otherId匹配当前_id的条件,这样每个CollectionA文档只会拿到自己对应的匹配结果 - 用
$addFields把匹配结果数组转换成布尔值:数组非空则为true,表示该文档的_id存在于筛选后的CollectionB中;反之则为false
完整聚合代码示例:
db.CollectionA.aggregate([ { $lookup: { from: "CollectionB", let: { aId: "$_id" }, // 将当前CollectionA的_id定义为变量aId pipeline: [ { $match: { // 这里填入你的几何筛选查询内容 <你的几何查询条件>, // 关联条件:匹配otherId等于当前CollectionA的_id $expr: { $eq: ["$otherId", "$$aId"] } } } ], as: "matchedDocs" // 临时存储匹配到的CollectionB文档数组 } }, { $addFields: { isOverThere: { $ne: ["$matchedDocs", []] } // 判断数组是否非空,生成布尔字段 } }, // 可选:如果不需要保留matchedDocs字段,添加此阶段删除它 { $project: { matchedDocs: 0 } } ])
这样处理后,CollectionA的每个文档都会新增isOverThere布尔字段,值完全符合你的需求。
内容的提问来源于stack exchange,提问作者Yuval A.
相关产品推荐
相关产品推荐

