使用MongoDB
shell脚本3.2,如何更新字段名称有空格的所有字段替换带下划线的字段?
{
"Some Field": "value",
"OtherField" :"Value",
"Another Field" : "Value"
}
更新上述文件如下
{
"Some_Field": "value",
"OtherField" :"Value",
"Another_Field" : "Value"
}
重命名字段可以用这样的东西完成
db.CollectionName.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } } )
这里具有挑战性的部分是过滤器,如何在字段名称中有空格的过滤器
最佳答案 这需要两步法.首先,您需要一种机制来获取集合中包含空格的所有键的列表.获得列表后,构造一个将这些键映射到其重命名值的对象.然后,您可以将该对象用作
$rename
运算符文档.考虑使用
mapReduce
获取带空格的键列表.
以下mapReduce
操作将使用所有已过滤的键作为_id值填充单独的集合:
mr = db.runCommand({
"mapreduce": "CollectionName",
"map": function() {
var regxp = /\s/;
for (var key in this) {
if (key.match(regxp)) {
emit(key, null);
}
}
},
"reduce": function() {},
"out": "filtered_keys"
})
要获取所有间隔键的列表,请在生成的集合上运行distinct:
db[mr.result].distinct("_id")
["Some Field", "Another Field"]
现在给出上面的列表,您可以通过创建一个将在循环中设置其属性的对象来组装更新文档.通常,您的更新文档将具有以下结构:
var update = {
"$rename": {
"Some Field": "Some_Field",
"Another Field": "Another_Field"
}
}
从而
var update = { "$rename": {} };
db[mr.result].distinct("_id").forEach(function (key){
update["$rename"][key] = key.replace(/ /g,"_");
});
然后您可以在更新中使用它
db.CollectionName.update({ }, update, false, true );