golangbot
golangbot
发布于 4周前

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

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