我需要转换这样的字段:
{
"_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语言?
答案 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上工作。
在内部使用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" }
]
)