2011-08-19 19 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