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

如何用单条MongoDB查询获取各字段独立的去重值?

MongoDB单查询获取多字段独立去重值方案

测试集合数据

{ "a": 10, "b": 20, "c": 30 }
{ "a": 11, "b": 20, "c": 31 }
{ "a": 10, "b": 20, "c": 31 }

核心问题:单查询获取已知字段的独立去重值

可以通过聚合管道实现,避免多次调用distinct的低效问题。以下查询直接返回每个字段的去重值集合:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      a_values: { $push: "$a" },
      b_values: { $push: "$b" },
      c_values: { $push: "$c" }
    }
  },
  {
    $project: {
      _id: 0,
      a: { $setUnion: ["$a_values"] },
      b: { $setUnion: ["$b_values"] },
      c: { $setUnion: ["$c_values"] }
    }
  }
])

查询结果:

{
  "a": [10, 11],
  "b": [20],
  "c": [30, 31]
}

附加问题:字段列表未知时的通用实现

如果无法预先知道集合中的字段名,可利用MongoDB的$objectToArray、$arrayToObject等操作符实现通用方案:

db.collection.aggregate([
  // 将每个文档转换为键值对数组(过滤_id字段可按需添加)
  { $project: { data: { $objectToArray: "$$ROOT" } } },
  // 展开键值对数组
  { $unwind: "$data" },
  // 按字段名分组,自动收集去重后的值
  {
    $group: {
      _id: "$data.k",
      values: { $addToSet: "$data.v" }
    }
  },
  // 重组为键值对结构
  { $project: { kv: { k: "$_id", v: "$values" }, _id: 0 } },
  // 将数组转换为目标对象格式
  { $replaceRoot: { newRoot: { $arrayToObject: "$kv" } } }
])

该方案会自动识别集合中的所有字段,返回每个字段对应的去重值数组,无需依赖预先定义的字段列表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:15:35