MongoDB聚合拆分字符串 提取末段拼接指定格式路径字段
MongoDB分类路径拆分聚合方案
基础规则说明
原始文档仅包含_id字段,存储层级分类路径,示例:
{ _id: ">Books>IT>C#>Cloud computing>" }
需要输出固定结构结果,字段要求:
- 新
_id:路径拆分后的最后一级分类名称,不能包含>字符 Path:上级分类路径,必须以>开头、以>结尾,拼接时排除最后一级分类,每个路径段末尾追加>字符,示例输出:
{ _id: "Cloud computing", Path: ">Books>IT>C#>" }
原有代码问题排查
原有实现存在三个明确错误:
$reduce初始值设为>,拼接逻辑额外判断加分隔符,导致路径开头出现两个>- 直接传入全部分段数组做reduce,没有排除最后一级分类元素
- 拼接逻辑未在路径段末尾补
>,导致最终Path结尾不符合格式要求
正确聚合代码
db.collection.aggregate([ { $project: { // 按>拆分原始路径,过滤拆分产生的空字符串 Split: { $filter: { input: { $split: ["$_id", ">"] }, as: "segment", cond: { $ne: ["$$segment", ""] } } } } }, { $project: { // 取最后一个分段作为新_id _id: { $last: "$Split" }, Path: { $reduce: { // 截取除最后一个分段外的所有上级路径段 input: { $slice: ["$Split", 0, { $subtract: [{ $size: "$Split" }, 1] }] }, // 初始值设为单个>,保证开头格式正确 initialValue: ">", // 每段拼接后追加>,自然形成结尾带>的格式 in: { $concat: ["$$value", "$$this", ">"] } } } } } ])
逻辑验证
以示例文档为例:
- 拆分过滤后得到的
Split数组为["Books", "IT", "C#", "Cloud computing"] - 截取前3个元素得到上级路径段数组
["Books", "IT", "C#"] - reduce拼接过程:
- 初始值:
> - 第一次拼接:
>+Books+>=>Books> - 第二次拼接:
>Books>+IT+>=>Books>IT> - 第三次拼接:
>Books>IT>+C#+>=>Books>IT>C#>
- 初始值:
- 最终输出完全符合格式要求。
内容的提问来源于stack exchange,提问作者Sugafree
相关产品推荐
相关产品推荐

