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

时间:2016-08-02 07:34:38

标签: mongodb shell mongodb-query

使用MongoDB shell脚本3.2,如何更新字段名称为space replace those with underscore的所有字段?

{
"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' } } )

这里的挑战部分是filter,如何提出filter字段名称中有空格

2 个答案:

答案 0 :(得分:1)

这需要两步法。首先,您需要一种机制来获取集合中包含空格的所有键的列表。获得列表后,构造一个将这些键映射到其重命名值的对象。然后,您可以将该对象用作 $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 );

答案 1 :(得分:1)

感谢@chridam这是一个很好的查询。

必须进行小的更改才能运行查询,完整查询。

mr = db.runCommand({
    "mapreduce": "MyCollectionName",
    "map": function() {
        var regxp = /\s/;
        for (var key in this) { 
            if (key.match(regxp)) {
                emit(key, null); 
            }
        }
    },
    "reduce": function() {}, 
    "out": "filtered_keys"
})

db[mr.result].distinct("_id")

var update = { "$rename": {} };
db[mr.result].distinct("_id").forEach(function (key){
    update["$rename"][key] = key.replace(/\s+/g, "_");
});

//print(update)

db.MyCollectionName.update({ }, update, false, true );