将字符串拆分为MongoDB中的子字符串或字符数组

Max*_*ges 7 string mongodb aggregation-framework

我需要转换这样的字段:

{ 
    "_id" : ObjectId("576fd6e87d33ed2f37a6d526"), 
    "phoneme" : "JH OY1 N Z" 
}
Run Code Online (Sandbox Code Playgroud)

进入像这样的子串数组

{ 
    "_id" : ObjectId("576fd6e87d33ed2f37a6d526"), 
    "phonemes" : [ "JH", "OY1", "N", "Z" ] 
}
Run Code Online (Sandbox Code Playgroud)

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

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

我在这里发现了一些将字符串转换为数组的代码,但是对于我的目的来说有点太简单了,因为只创建了一个数组元素.

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

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

Max*_*ges 8

比我想象的容易得多.只需使用JavaScript分割功能.繁荣!

db.temp.find().snapshot().forEach( function (el) {
el.phonemes = el.phoneme.split(' ');
db.temp.save(el);
});
Run Code Online (Sandbox Code Playgroud)


sty*_*ane 6

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

{ "phoneme" : "JH OY1 N Z" }
{ "phoneme" : "foobar" }
Run Code Online (Sandbox Code Playgroud)

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

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

获取索引值数组是从0到字符串长度的所有整数减去可以使用$range$strLenCP运算符生成的整数.

我们使用$addFields管道阶段将新字段添加到初始文档中,但为了保持持久性,我们可以使用聚合管道运算符创建视图或覆盖我们的集合$out.

[
    {
        "$addFields":{
            "arrayOfPhonemeChar":{
                "$map":{
                    "input":{
                        "$range":[
                            0,
                            {
                                "$strLenCP":"$phoneme"
                            }
                        ]
                    },
                    "in":{
                        "$substrCP":[
                            "$phoneme",
                            "$$this",
                            1
                        ]
                    }
                }
            },
            "phonemeSubstrArray":{
                "$split":[
                    "$phoneme",
                    " "
                ]
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

产生如下所示的东西:

{
    "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"]
}
Run Code Online (Sandbox Code Playgroud)