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

如何在MongoDB中去除字符串内的重复字符

MongoDB字符串去重实现方案(仅保留字符首次出现)

需求为剔除字符串中重复出现的字符,仅保留每个字符的第一次出现位置,示例输入xxxyzzxcdv,期望输出xyzcdv。

方案1:MongoDB 4.4及以上版本 原生聚合实现(推荐,性能最优)

无需依赖自定义JS函数,直接用原生聚合算子完成,适合全量级数据处理:

  • 第一步:用$split算子将目标字符串字段拆分为单个字符组成的数组
  • 第二步:用$reduce算子遍历字符数组,维护「已出现字符集合」和「结果字符数组」两个状态,仅将首次出现的字符加入结果数组
  • 第三步:用$join算子将去重后的字符数组拼接为最终字符串

完整聚合示例如下,假设集合名为your_collection,待处理字符串字段名为content,输出去重后的字段名为deduplicated_content:

db.your_collection.aggregate([
  {
    $addFields: {
      deduplicated_content: {
        $let: {
          vars: {
            char_arr: { $split: ["$content", ""] }
          },
          in: {
            $join: {
              input: {
                $reduce: {
                  input: "$$char_arr",
                  initialValue: { seen: [], result: [] },
                  in: {
                    $cond: [
                      { $not: [{ $in: ["$$this", "$$value.seen"] }] },
                      {
                        seen: { $concatArrays: ["$$value.seen", ["$$this"]] },
                        result: { $concatArrays: ["$$value.result", ["$$this"]] }
                      },
                      "$$value"
                    ]
                  }
                }
              }.result,
              separator: ""
            }
          }
        }
      }
    }
  }
])

方案2:低版本MongoDB 自定义JS函数实现

仅适合小数据量场景使用,先定义去重函数:

function deduplicateStr(str) {
  const seen = new Set();
  return str.split('').filter(char => {
    if (!seen.has(char)) {
      seen.add(char);
      return true;
    }
    return false;
  }).join('');
}

调用示例:

// 查询时返回去重结果
db.your_collection.find({}, {
  content: 1,
  deduplicated_content: {
    $function: {
      body: deduplicateStr,
      args: ["$content"],
      lang: "js"
    }
  }
})

注意事项

  • 若待处理字段可能存在非字符串、空值等异常情况,可先通过$match过滤合法数据,或在聚合逻辑中添加$cond分支做异常兼容,避免执行报错
  • 原生聚合方案不依赖JS引擎,大数量级场景下性能比自定义JS函数高5~10倍,优先使用方案1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:02