MongoDB Shell脚本更新所有字段名称中包含空格的名称

使用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 );
点赞