You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:25:17