首页 > 解决方案 > 如何根据第一次出现的分隔符 MongoDB 拆分列

问题描述

我有一个这样的列,它应该根据第一个“-”进行拆分,示例如下

MGESAD :
"6095 - NCAM - US - GIUTCB - US Consumer Bank - USRB"
"6595 - NBAM - US - UDAS - Consumer Bank - USRB"
"0595 - NWWAM - US - GWCB - US BANK Bank - USRB - TBL"

I need to split this column into:

Col1  Col2
6095  NCAM - US - GIUTCB - US Consumer Bank - USRB
6595  NBAM - US - UDAS - Consumer Bank - USRB
0595  NWWAM - US - GWCB - US BANK Bank - USRB - TBL

到目前为止尝试过:

db.getCollection("arTes").aggregate([
    {
        $addFields: { 
            MGE_ID: { $arrayElemAt: [ { "$split": [ "$MGESAD y", "-"] }, 0 ] },
            MGE_DESC: { $arrayElemAt:[{ "$split": [ "$MGESAD ", "-"] },2] }
        }
    }
])

MGE_DESC 只给出 2 个元素,我需要整个字符串,不包括第一个拆分。

让我知道是否有更简单的方法可以做到这一点?

标签: mongodbaggregation-frameworkstudio3t

解决方案


询问

  • 管道更新需要 MongoDB >= 4.2
  • 因为您想在“-”的第一个索引上拆分,所以您可以在不拆分所有“-”出现的情况下进行拆分
  • 波纹管找到“-”的索引,左边是MGESAD,右边是MGE_DESC

*如果您只想聚合,请使用聚合中的["$set" ...]管道

*如果您不想为第一个或最后一个“-”执行此操作,则可以split然后$concat可能$reduce取决于您的需要,但这里更简单,因此未使用

测试代码在这里

updade({},
[{"$set": 
   {"MGESAD": 
     {"$substrCP": ["$MGESAD", 0, {"$indexOfCP": ["$MGESAD", " - "]}]},
      "MGE_DESC": 
      {"$substrCP": 
        ["$MGESAD",
         {"$add": [{"$indexOfCP": ["$MGESAD", " - "]}, 3]},
         {"$strLenCP": "$MGESAD"}]}}}],
{"multi" : true})

推荐阅读