【问题标题】:How to split a string into array of letters in MongoDB aggregation framework?如何在 MongoDB 聚合框架中将字符串拆分为字母数组?
【发布时间】:2021-11-10 05:12:38
【问题描述】:

我想将一个字符串拆分成字母数组,就像我们在 javascript 中所做的那样, 例如,

let x = "String";
x.split('') // ['S', 't', 'r', 'i', 'n', 'g']

但是,如果我在聚合管道中使用 $split 执行相同操作,如下所示,

{
 $project:{
 _id:"$_id._id",
 name:"$_id.name",
 array_field:{ $split: ["$_id.name", ""] }
 }
}

它给我这样的错误,

{
    "message" : "PlanExecutor error during aggregation :: caused by :: $split requires a non-empty separator",
    "ok" : 0,
    "code" : 40087,
    "codeName" : "Location40087",
    "name" : "MongoError"
}

谁能帮我解决这个问题。谢谢。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    ...$split 需要一个非空分隔符

    这是使用""(长度为零的字符串)作为分隔符拆分字符串(使用$split 聚合运算符)时的预期错误。

    您可以尝试这种方法来获得所需的结果(这会将字符串字段 str: "string" 拆分为数组字段 arr: [ "s", "t", "r", "i", "n", "g" ]):

    db.collection.aggregate([
      { 
          $addFields: { 
              arr: {
                  $function: {
                      body: function(s) {
                                   return s.split('');
                      },
                      args: [ "$str" ],
                      lang: "js"
                  }
              }
          }
      }
    ])
    

    注意$function的使用需要MongoDB v4.4。

    【讨论】:

      【解决方案2】:

      我建议您将$substr$map 结合使用,我们将遍历字符串的长度并使用$substr 选择索引i 处的字符,如下所示:

      db.collection.aggregate([
        {
          "$addFields": {
            "newField": {
              $map: {
                input: {
                  $range: [
                    0,
                    {
                      "$strLenCP": "$key"
                    }
                  ]
                },
                in: {
                  "$substr": [
                    "$key",
                    "$$this",
                    1
                  ]
                }
              }
            }
          }
        }
      ])
      

      Mongo Playground

      【讨论】:

        猜你喜欢
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多