我想重命名在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}
答案 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
的执行面板中运行以下javascriptfunction 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不会展开数组以查找匹配的名称。它仅适用于顶级字段。
模拟重命名的方法是将字段及其数据复制到新名称,然后删除原始字段。如果您对该对象/字段有大量写入,则可能还需要一种方法来考虑可能的并发写入。