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()函数。这也是两段代码的区别。