如何在mongodb中重命名嵌套键

时间:2011-08-19 10:50:18

标签: mongodb dictionary rename

我想重命名在mongodb中重命名我的dict密钥。

通常它就像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'}})

对于第二场,它是'field'.1.2.name'

我认为重命名它应该是相似的,但它不是......(如$rename:{'field'.0.1': 2}

2 个答案:

答案 0 :(得分:5)

这是一种在数据库中重命名密钥的灵活方法

给定像这样的文档结构......

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

我想遍历所有文档并将technicalData [“Drawing No”]重命名为technicalData [“Drawing Number”]

在(优秀的)RockMongo

的执行面板中运行以下javascript
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中运行

答案 1 :(得分:1)

您的问题尚不清楚,但似乎您想重命名数组中的字段名称。

简短的回答是你不能。如docs中所述,$ rename不会展开数组以查找匹配的名称。它仅适用于顶级字段。

模拟重命名的方法是将字段及其数据复制到新名称,然后删除原始字段。如果您对该对象/字段有大量写入,则可能还需要一种方法来考虑可能的并发写入。