【问题标题】:Split string into an array of substrings or characters in MongoDB将字符串拆分为 MongoDB 中的子字符串或字符数组
【发布时间】:2015-01-13 23:14:00
【问题描述】:

我需要像这样转换字段:

{ 
    "_id" : ObjectId("576fd6e87d33ed2f37a6d526"), 
    "phoneme" : "JH OY1 N Z" 
}

到这样的子字符串数组中

{ 
    "_id" : ObjectId("576fd6e87d33ed2f37a6d526"), 
    "phonemes" : [ "JH", "OY1", "N", "Z" ] 
}

有时会变成这样的字符数组

{
    "_id" : ObjectId("576fd6e87d33ed2f37a6d526"), 
    "phonemes" : ["J", "H", " ", "O", "Y", "1", " ", "N", " ", "Z"]
}

我找到了一些代码here,它将字符串转换为数组,但是对于我的目的来说它有点太简单了,因为只有一个数组元素要创建。

db.members.find().snapshot().forEach( function (x) {
   x.photos = [{"uri": "/images/" + x.photos}];
   db.members.save(x);
 });

我可以在 mongo shell 语句中使用整个 javascript 语言吗?

【问题讨论】:

    标签: string mongodb aggregation-framework


    【解决方案1】:

    比我想象的要容易得多。只需使用 JavaScript 拆分功能。轰隆隆!

    db.temp.find().snapshot().forEach( function (el) {
    el.phonemes = el.phoneme.split(' ');
    db.temp.save(el);
    });
    

    【讨论】:

      【解决方案2】:

      如何将字符串拆分成数组?

      在任何中途的现代 JavaScript 引擎中,它都是

      var myString = 'foo bar baz';
      var myArray = myString.split(' ');
      

      即使在外壳上也应该可以工作。

      MongoDB 的 shell 是否提供 JavaScript 的完整功能集?

      内部使用since MongoDB 2.4 Google 的V8 engine,符合ECMA-262。至少期望本标准中定义的所有功能。

      我还没有检查过,但是您从浏览器中知道的一些对象在 mongo shell 中确实没有多大意义。所有 DOM 相关的,就是这样。所以在使用它们之前,我宁愿检查它们是否存在。

      【讨论】:

        【解决方案3】:

        假设我们集合中的文档如下所示:

        { "phoneme" : "JH OY1 N Z" }
        { "phoneme" : "foobar" }
        

        在 3.4+ 版本中,我们可以使用 $split 运算符将字段值划分为子字符串数组。

        要将字符串拆分为字符数组,我们需要使用$map 运算符将$substrCP 表达式应用于字符串索引中所有字符的数组。

        要获得索引值的数组是从 0 到字符串长度减一的所有整数,可以使用 $range$strLenCP 运算符生成。

        我们使用$addFields 管道阶段将新字段添加到初始文档中,但为了使其持久化,我们可以create a view 或使用$out 聚合管道运算符覆盖我们的集合。

        [
            {
                "$addFields":{
                    "arrayOfPhonemeChar":{
                        "$map":{
                            "input":{
                                "$range":[
                                    0,
                                    {
                                        "$strLenCP":"$phoneme"
                                    }
                                ]
                            },
                            "in":{
                                "$substrCP":[
                                    "$phoneme",
                                    "$$this",
                                    1
                                ]
                            }
                        }
                    },
                    "phonemeSubstrArray":{
                        "$split":[
                            "$phoneme",
                            " "
                        ]
                    }
                }
            }
        ]
        

        产生如下所示的东西:

        {
            "phoneme" : "JH OY1 N Z",
            "arrayOfPhonemeChar" : ["J", "H", " ", "O", "Y", "1", " ", "N", " ", "Z"],
            "phonemeSubstrArray" : ["JH", "OY1", "N", "Z"]
        },
        {
            "phoneme" : "foobar",
            "arrayOfPhonemeChar" : ["f", "o", "o", "b", "a", "r"],
            "phonemeSubstrArray" : ["foobar"]
        }
        

        【讨论】:

          【解决方案4】:

          这应该适用于 Mongo 3.4+ (see here for more info)。这比 user3100115 的回答要简洁一些。

          db.members.aggregate(
              [
                  { "$addFields": { 
                      "phonemes": { "$split": [ "$phoneme", " " ] } 
                  }},
                  { "$out": "members" }
              ]
          )
          

          【讨论】:

          • 我的回答也涵盖了这种情况。 "phonemeSubstrArray" 为了完整起见,我添加了 "arrayOfPhonemeChar"
          猜你喜欢
          • 2012-02-22
          • 2016-04-01
          • 2017-06-27
          • 2011-01-10
          • 1970-01-01
          • 2012-06-27
          相关资源
          最近更新 更多