如何在mongodb中重命名嵌套键

phi*_*hil 2 dictionary rename mongodb

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

通常它就是这样的 db.update({'_id':id},{$rename:{'oldfieldname':newfieldname}})

我的文档结构看起来像那样

{
    'data':'.....',
    'field':{'1':{'data':....},'2':{'data'...}},
    'more_data':'....',
}
Run Code Online (Sandbox Code Playgroud)

如果我想在字段1中设置一个新字段,我会这样做 db.update({'_id':id},{$set:{'field.0.1.name':'peter'}})

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

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

chi*_*him 5

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

鉴于这样的文档结构......

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

我想遍历所有文档并将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);
Run Code Online (Sandbox Code Playgroud)

代码也将在mongo shell中运行