MongoDB重命名内嵌数组里对象的字段名

时间:2022-06-01 17:59:52

MongoDB的$rename操作符是不能对数组的对象进行重命名。如下:

{
Field1: "",
Field2: [
{ NestedField1: "", NestedField2: "" },
{ NestedField1: "", NestedField2: "" },
...
]
}

如果直接使用$rename操作符对NestedField1重命名:

db.testcollection.update({}, 
    {$rename:
        {"Field2.$.NestedField1":"Field2.$.newNestedField1"}
    },
    {multi:true}
);

报错:

The source field for $rename may not be dynamic: Field2.$.NestedField1

所以我们只能换一种思路来实现。

方案:迭代内嵌数据,对数组里的数据重新赋值给新的字段,并删除原来的字段。

适用于Mongo3.4+

db.testcollection.find({}).forEach(function(item) {
for(i = 0; i != item.Field2.length; ++i) {
item.Field2[i].NestedField1= item.Field2[i].NestedField1;
delete item.Field2[i].NestedField1;
}
db.testcollection.update({_id:item._id},item);
});

适用于Mongo3.2

db.testcollection.find({}).snapshot().forEach(function(item) {
for(i = 0; i != item.Field2.length; ++i) {
item.Field2[i].NestedField1= item.Field2[i].NestedField1;
delete item.Field2[i].NestedField1;
}
db.testcollection.update({_id:item._id},item);
});

从Mongo3.4+开始删除了光标的snapshot()函数。这也是两段代码的区别。