2011-08-19 61 views
2

我想重命名以在mongodb中重命名我的dict密鑰。如何重命名mongodb中的嵌套密鑰

通常它的工作原理就像db.update({'_id':id},{$rename:{'oldfieldname':newfieldname}})

我的文檔結構看起來像

{ 
    'data':'.....', 
    'field':{'1':{'data':....},'2':{'data'...}}, 
    'more_data':'....', 
} 

如果我想設置 在場1一個新的領域我做db.update({'_id':id},{$set:{'field.0.1.name':'peter'}})

現場兩家IT是'field'.1.2.name'

我認爲與重命名它應該是相似的,但它是不...(就像$rename:{'field'.0.1': 2}

+0

我不太理解你正在嘗試做什麼。你能展示一個前後狀態的例子嗎? – dcrosta

回答

1

你的問題不清楚,但你似乎想重新命名一個數組中的字段名稱。

簡短的回答是你不能。如docs所述,$ rename不會擴展數組以查找匹配的名稱。它只適用於頂級域。

您可以通過將字段及其數據複製到新名稱,然後刪除原始字段來模擬重命名。如果您有很多對該對象/字段的寫入,則可能還需要一種方法來解釋可能的併發寫入。

5

下面是在數據庫

給定的文檔結構類似這樣的重命名鍵的靈活方法...

{ 
    "_id": ObjectId("4ee5e9079b14f74ef14ddd2f"), 
    "code": "130.4", 
    "description": "4'' Socket Plug", 
    "technicalData": { 
     "Drawing No": "50", 
     "length": "200mm", 
     "diameter: "20mm" 
    }, 
} 

我想遍歷所有文件並重新命名technicalData [「圖號」]到technicalData [ 「圖號」]

運行在執行面板下面的JavaScript在(優秀)RockMongo

function remap(x){ 
    dNo = x.technicalData["Drawing No"]; 
    db.products.update({"_id":x._id}, { 
     $set: {"technicalData.Drawing Number" : dNo}, 
     $unset: {"technicalData.Drawing No":1} 
    }); 
} 

db.products.find({"technicalData.Drawing No":{$ne:null}}).forEach(remap); 

該代碼也將在mongo shell中運行

+0

嗨Chim,我喜歡你的建議,我試着在你的代碼在mongo外殼,但它一直告訴我'不能追加到使用字符串字段名稱的數組'[圖形編號]'我試圖與像位置運算符$ set:{ 「technicalData. $。Drawing Number」:dNo},但它似乎並不瞭解位置操作符在該上下文中的使用。它給''不能附加到數組使用字符串字段名稱[圖紙編號]'你有沒有在mongo shell中運行這個? – emilebaizel

+0

這是我之前評論的清理版本。 嗨Chim,我喜歡你的建議,我試着在你的代碼在mongo外殼,但它一直告訴我'不能追加到數組使用字符串字段名稱[profileId]'。你可以看看我的代碼,看看它看起來是否正確?謝謝。 函數重映射(x){ pid = x.readingDataSummaries [「profileId_」]; db.profile.update({「_ id」:x._id},{ $ set:{「readingDataSummaries.profileId」:pid} }); } db.profile.find({「_ id」:「1b8bfde2-bb6c-4444-b570-9c12f9002c4f」})。forEach(remap); – emilebaizel

+0

我剛纔再次測試過,上面的代碼適用於我。 mongo v2.02,我想我測試了v1.8。先前 – chim