MongoDB重命名内嵌数组里对象的字段名
$rename操作符无法使用
MongoDB的$rename操作符是不能对数组的对象进行重命名。如下:
//在task集合中,其中一条文档数据
{
"_id" : ObjectID("1312321312"),
"paramList" : [
{ "PARAMETERSCHNAME" : "aaa" }, // 希望将PARAMETERSCHNAME全部改成name
{ "PARAMETERSCHNAME" : "bbb" },
{ "PARAMETERSCHNAME" : "ccc" }
]
}
通过$rename操作符时:
db.集合名.update({},
{$rename:
{"数组字段名.$.旧属性名":"数组字段名.$.新属性名"}
},
{multi:true}
);
报错:
The source field for $rename may not be dynamic: 数组字段名.$.旧属性名
正确方式
方案:迭代内嵌数据,对数组里的数据重新赋值给新的字段,并删除原来的字段
适用于Mongo3.4+(推荐)
db.集合名.find({}).forEach(function(item) {
for(let i = 0; i != item.数组字段名.length; ++i) {
item.数组字段名[i].新属性名= item.数组字段名[i].旧属性名;
delete item.Field2[i].旧属性名;
}
db.集合名.update({_id:item._id},item);
});
示例:
db.task.find({}).forEach(function(item) {
for(let i = 0; i != item.paramList.length; ++i) {
item.paramList[i].name= item.paramList[i].PARAMETERSCHNAME;
delete item.Field2[i].PARAMETERSCHNAME;
}
db.task.update({_id:item._id},item);
});
参考链接: MongoDB重命名内嵌数组里对象的字段名.