我已经导入了一个包含多个文档的数据集,每个文档包含一个流派属性,它的值是string - A json string,比如"[{'field1':'value1'}, {'field2':'value2'}]"
,请注意quote我希望这是对象的数组
{
"genres": "[{'id': 16, 'name': 'Animation'}, {'id': 35, 'name': 'Comedy'}, {'id': 10751,'name': 'Family'}]"
}
以上字符串值要按以下方式转换
{
"title": "Toy story collection",
"genres": [
{'id': 16, 'name': 'Animation'},
{'id': 35, 'name': 'Comedy'},
{'id': 10751,'name': 'Family'}
]
},
{
"title": "Shrek",
"genres": [
{'id': 16, 'name': 'Animation'}
]
},
{
"title": "Full House",
"genres": [
{'id': 10751,'name': 'Family'}
]
}
这将使我能够按如下方式搜索记录
db.moviesCollection.find({"genres.name":"Animation"})
我能想到的一个解决方案是通过php或javascrip逐个加载每个文档,然后开始转换它.
有什么办法吗?I can update documentes directly through mongodb itself美元,不用任何编程语言.
另一个回答提到了类似于Follow的内容,但没有提到他们是否使用任何语言.
db.movies_metadata.find({}).snapshot().forEach(function (el){el.genres=JSON.parse(el.genres);db.movies_metadata.save(el)});
如果我直接在控制台上运行上面的代码,我会看到以下错误.
未捕获异常:TypeError:DB.Movies_metadata.find(...).快照 不是函数:@(shell ):1:1
Updated Answer:个 在获得一个很好的答案之后,下面是我的最后一个更新查询,我使用merge而不是replace,因为我想保留其余的属性
db.movies_metadata.aggregate([
{
"$project": {
"genres": {
"$function": {
"body": "function(genres) { genres = genres.replace(/'/g, '\"'); return JSON.parse(genres) }",
"args": [
"$genres"
],
"lang": "js"
}
}
}
},
{
"$merge": {
"into": "movies_metadata",
"on": "_id",
"whenMatched": "merge",
"whenNotMatched": "insert"
}
}
])