使用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
字段名称中有空格
答案 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 );