基于Project集合字段值筛选Record集合字段的MongoDB查询问题
MongoDB 动态字段投影实现方案
场景说明
Record集合包含多条文档,结构示例:
Field1: 'some values' Field2: 'some values'
Project集合仅存在一条配置文档,用于控制Record集合的字段显示,结构示例:
Field1: 1 // 1表示显示该字段 Field2: 0 // 0表示隐藏该字段
需求:编写MongoDB查询,根据Project的配置,仅展示Record集合中的Field1字段的实际值。
尝试的查询
之前编写的聚合查询如下:
db.Record.aggregate([ { $lookup: { from: 'Project', localField: '', foreignField: '', as: 'Project', pipeline:[] }, }, { $unwind: { path: '$Project', preserveNullAndEmptyArrays: true, }, }, { $project: { _id: 0, Field1: {"$Project.Field1":{$eq:1}}, Field2: {"$Project.Field2":{$eq:1}}, }, }, ]);
当前问题
当前查询返回结果类似{Field1:1, Field2:2},仅能标识字段是否需要显示,但无法返回Record字段的实际值。
解决方案
修改$project阶段的逻辑,使用$cond结合$$REMOVE来动态控制字段的显示与值的返回:
db.Record.aggregate([ { $lookup: { from: 'Project', localField: '', foreignField: '', as: 'Project' } }, { $unwind: { path: '$Project', preserveNullAndEmptyArrays: true } }, { $project: { _id: 0, Field1: { $cond: { if: { $eq: ['$Project.Field1', 1] }, then: '$Field1', else: '$$REMOVE' } }, Field2: { $cond: { if: { $eq: ['$Project.Field2', 1] }, then: '$Field2', else: '$$REMOVE' } } } } ]);
逻辑说明
$lookup阶段:将Project集合的配置文档关联到每个Record文档(因为Project仅一条,空的local/foreignField会做笛卡尔积关联)$unwind阶段:展开关联后的Project数组,确保每个Record文档对应单个配置对象$project阶段:通过$cond判断配置字段的值,若为1则返回Record的对应字段实际值;若为0则用$$REMOVE移除该字段,最终结果仅保留需要显示的字段及其实际内容。
内容的提问来源于stack exchange,提问作者Arunachalam
相关产品推荐
相关产品推荐

