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

MongoDB查询时筛选数组指定字段及部分文档字段的方法

解决方案

是的,你需要用到$project聚合阶段,同时结合$filter操作符来实现——既能筛选保留指定的顶层文档字段,又能过滤metadata数组中的指定元素。

具体实现代码

db.yourCollectionName.aggregate([
  {
    $project: {
      documentId: 1,
      // 若要修改name字段值为示例中的"Test1",直接赋值即可
      name: "Test1",
      // 同理修改tenant字段值为"Tenant"
      tenant: "Tenant",
      metadata: {
        $filter: {
          input: "$metadata",
          cond: { $in: ["$$this.name", ["JobId", "UserId"]] }
        }
      }
      // _id字段默认会被保留,无需显式声明
    }
  }
])

代码说明

  • $project阶段:用来控制文档的字段输出:
    • 设置字段值为1表示保留该字段;
    • 如果需要修改字段的内容(比如你示例中把原name和tenant改成新值),直接给字段赋值即可;
    • 默认情况下_id字段会自动保留,若要排除可以设置_id: 0。
  • $filter操作符:专门用于数组元素的过滤:
    • input: "$metadata"指定要处理的目标数组;
    • cond定义过滤条件,这里用$in判断数组元素的name属性是否属于["JobId", "UserId"],符合条件的元素会被保留在最终的metadata数组中。

补充说明

如果只是单纯筛选顶层字段,用find的投影参数就能实现,但要过滤数组中多个符合条件的元素,必须使用聚合管道的$project结合$filter——因为find的投影仅支持$elemMatch返回数组中第一个匹配的元素,无法保留多个符合条件的元素。

内容的提问来源于stack exchange,提问作者Dario M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:42:35