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

如何在MongoDB聚合中同时返回过滤数据与唯一值

解决方案

你可以借助MongoDB的$facet阶段的多分支特性来实现需求——把获取唯一值的$group操作放到$facet的一个独立分支里,这样就能同时拿到过滤后的分页数据、元信息,以及指定属性的唯一值集合。

修改后的完整聚合管道如下:

[
  {
    $project: {
      _id: 0,
      id: 1,
      uniqueId: 1,
      shortLabel: 1,
      "geographicLocation.name": 1,
      "economicConcept.name": 1,
      "frequency.name": 1,
      "scale.name": 1,
      "unit.name": 1,
      source: 1,
    },
  },
  {
    $match: {
      $and: [
        {
          $or: [
            { "geographicLocation.name": "United States" },
            { "geographicLocation.name": "Singapore" },
          ],
        },
        {
          source: {
            $elemMatch: {
              name: { $regex: "New", $options: "i" },
            },
          },
        },
      ],
    },
  },
  {
    $facet: {
      metadata: [
        { $count: "total" },
        { $addFields: { page: 1 } },
      ],
      data: [{ $skip: 0 }, { $limit: 10 }],
      distinct: [
        {
          $group: {
            _id: null,
            distinctRegion: { $addToSet: "$geographicLocation.name" },
            distinctFrequency: { $addToSet: "$frequency.name"},
            distinctConcept: { $addToSet: "$economicConcept.name" }
          }
        }
      ]
    },
  },
]

说明:

  • metadata分支:保持原有逻辑,统计过滤后数据的总条数并添加当前页码
  • data分支:保持原有分页逻辑,返回指定范围的过滤后数据
  • distinct分支:新增的分支,通过$group将所有过滤后的文档聚合为一个,再用$addToSet收集指定字段的唯一值

执行这个管道后,你会得到包含三类结果的文档:分页数据集、元信息、指定属性的唯一值集合,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Alex T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:37:34