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

如何在MongoDB的find()中结合表单筛选与指定字段返回?

MongoDB 查询:筛选指定表单并返回指定字段

问题背景

现有如下MongoDB文档:

{
  _id: '99999999-2795704-R11-IV1_17486713998556251',
  forms: [
    {
      parentId: 'PID_174867139985677038128',
      formName: 'Hello World 001',
      version: [
        {
          formId: '174867139985677038128',
          refLineId: 'e3d93310d3044cc38a3a3156670e9225-cc2bf35662df4ceca38d43f583039611-20',
          version: '1',
          startDate: '2025-05-08',
          status: 'Active'
        }
      ]
    },
    {
      parentId: 'PID_174867139985677038129',
      formName: 'Hello World 002',
      version: [
        {
          formId: '174867139985677038129',
          refLineId: 'e3d93310d3044cc38a3a3156670e9225-cc2bf35662df4ceca38d43f583039611-21',
          version: '1',
          startDate: '2025-05-09',
          status: 'Active'
        }
      ]
    }
  ]
}

需要执行find()命令实现两个目标:

  • 仅检索指定名称的单个表单(如Hello World 001)
  • 只返回指定字段集合(包括formName、version.formId、version.version、version.status)

单独使用以下两个查询均有效:

  • 筛选目标表单:
db["flows"].find({"_id":{"$regex":"22316281-2795704-R11-IV1"}}, {"forms": {"$elemMatch": {"formName": "Hello World 001"}}})
  • 返回指定字段:
db["flows"].find({"_id":{"$regex":"22316281-2795704-R11-IV1"}}, {"forms.version.status": true, "forms.version.formId": true})

但合并查询时出现错误:Path collision at forms.version.status remaining portion version.status,尝试的错误查询:

db["flows"].find({"_id":{"$regex":"22316281-2795704-R11-IV1"}}, {"forms": {"$elemMatch": {"formName": "Hello World 001"}}, "forms.version.status": true})

期望得到的目标输出:

{
   _id: '99999999-2795704-R11-IV1_17486713998556251',
   forms: [
     {
       formName: 'Hello World 001',
       version: [
         {
           formId: '174867139985677038128',
           version: '1',
           status: 'Active'
         }
       ]
     }
   ]
}

解决方案

不能同时在投影中既指定forms: {$elemMatch:...}又单独声明forms下的子字段,这会导致路径冲突。以下两种方法可实现需求:

方法1:find()结合嵌套投影

直接在$elemMatch的投影规则中定义需要保留的字段:

db["flows"].find(
  {"_id": {"$regex": "22316281-2795704-R11-IV1"}},
  {
    "forms": {
      "$elemMatch": {
        "formName": "Hello World 001"
      }
    },
    "forms.formName": 1,
    "forms.version.formId": 1,
    "forms.version.version": 1,
    "forms.version.status": 1,
    "_id": 1
  }
)

方法2:聚合管道(更清晰可控)

通过$match筛选文档,$project结合$filter和$map精确处理数组字段:

db["flows"].aggregate([
  // 筛选目标文档
  {
    "$match": {
      "_id": {"$regex": "22316281-2795704-R11-IV1"},
      "forms.formName": "Hello World 001"
    }
  },
  // 处理forms数组,筛选指定表单并保留目标字段
  {
    "$project": {
      "forms": {
        "$map": {
          "input": {
            "$filter": {
              "input": "$forms",
              "as": "form",
              "cond": {"$eq": ["$$form.formName", "Hello World 001"]}
            }
          },
          "as": "filteredForm",
          "in": {
            "formName": "$$filteredForm.formName",
            "version": {
              "$map": {
                "input": "$$filteredForm.version",
                "as": "v",
                "in": {
                  "formId": "$$v.formId",
                  "version": "$$v.version",
                  "status": "$$v.status"
                }
              }
            }
          }
        }
      },
      "_id": 1
    }
  }
])

两种方法均可得到目标输出,聚合管道更适合复杂的字段筛选和数组处理场景。

内容的提问来源于stack exchange,提问作者Felipe Vidal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:29:54