2016-08-02 118 views
4

使用MongoDB shell腳本3.2,如何更新字段名稱有space replace those with underscore的所有字段?MongoDB Shell腳本更新所有字段字段名稱中有空格的名稱

{ 
"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

您無法更新字段名稱。您可以按照自己想要的方式添加名稱更改的新字段。然後刪除舊的字段。 – Shrabanee

+0

難道我不能像找到一個字段與空間設置新的領域(與下劃線相同的重複),並刪除一個空間? – HaBo

+0

@Shrabanee所以我怎麼能拿出查詢來查找所有字段或所有文件的字段名稱與空間? – HaBo

回答

1

這需要一個雙st ep方法。首先,你需要一個機制來獲得你的集合中所有鍵的列表。一旦獲得列表,構建一個將這些鍵映射到其重命名值的對象。然後,您可以使用該對象作爲運營商文檔的$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" 
}) 

要獲得所有的間隔鍵的列表,在結果集合運行不同:

db[mr.result].distinct("_id") 
["Some Field", "Another Field"] 

現在給上面的列表,你可以組裝你的更新d通過創建一個將其屬性設置在循環中的對象來實現。通常,您的更新文檔都會有這樣的結構:

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

鍵。替換(「」,「_」)只會替換第一次出現的空格,可能會有像「某些字段值」的字段 – HaBo

+0

@HaBo感謝您的注意,我更新了全局範圍正則表達式的replace()方法。 – chridam

+1

歡迎你必須改變這個以及key.match(r)r應該用regxp替換 – HaBo

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);