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

版权声明:著作权归作者所有。

相关推荐

Pandas dataframe重命名列名

Pandas重命名有三种方法:1、使用columns重命名>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]}) >>> df.columns = ['a', 'b'] >>> df  &n

Git重命名本地和远程分支

1、在本地新建分支git branch -m old_branch new_branch 2、unset-upstream新分支git branch --unset-upstream new_branch 这是为了避免新分支还会使用旧分支名push到远程服务器。3、关联新分支到远程服务器git push --

JavaScript删除数组里重复的元素

JavaScript里有多种方法可以用来对数组元素去重。ES6 SetES6提供了一个Set对象,用它可以很简单便可以对数组元素去重。function uniq(arr) {    return Array.from(new Set(arr)); } filter另外也可以通过filter来对数组元素去重。functi