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

时间:2014-11-17 05:14:26

标签: string mongodb aggregation-framework

我需要转换这样的字段:

{ 
    "_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语言?

4 个答案:

答案 0 :(得分:8)

比我想象的容易得多。只需使用JavaScript分割功能。吊杆!

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

答案 1 :(得分:6)

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

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

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

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

获取索引值数组是从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"]
}

答案 2 :(得分:2)

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

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

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

甚至可以在shell上工作。

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

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

我还没有检查过,但是你在浏览器中认识的一些对象在mongo shell中确实没有多大意义。所有DOM都相关,即。所以在使用它们之前,我宁愿检查一下它们是否存在。

答案 3 :(得分:1)

这适用于Mongo 3.4+(see here for more info)。这比user3100115的答案更简洁。

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