如何在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
相关产品推荐
相关产品推荐

