更新嵌入文档Mongo字段名称
更新嵌入文档Mongo字段名称
我浏览了这个链接:如何在MongoDB中重命名文档字段?,但对我来说没有很好地工作。我有以下Mongo文档。我正在使用MongoDB服务器版本:4.0.3
。
{
"_id" : ObjectId("5cb825e566135255e0bf38a4"),
"firstName" : "John",
"lastName" : "svc_user",
.....
.....
"status" : "A",
"effDate" : ISODate("2012-08-24T01:46:33.000Z"),
"department" : [
{
"deptName" : "KG",
....
....
},
...
....
.....
],
...
...
...
}
我执行了以下查询:
db.employee.update({}, {$rename:{"department.deptName":"department.departmentName"}}, false, true);
错误:
无法使用部分(department.deptName的部分)遍历元素。
在Mongo 4.2中,可以运行以下代码:
db.collection.updateMany(
{
department: { $exists: true },
"department.deptName": { $exists: true }
},
[{
$set: {
department: {
$map: {
input: "$department",
in: { departmentName: "$$this.deptName" }
}
}
}
}]
)
假设在Mongo 4.0.3中,需要使用JavaScript循环逐个修改字段名。
问题原因:
在Mongo 4.2中,可以使用`$map`操作符将嵌入式文档的字段名称更改为`departmentName`。但是,在Mongo 4.0.3中,没有内置的操作符可以直接完成这个操作,因此需要手动使用JavaScript循环来修改字段名。
解决方法:
使用JavaScript循环来逐个修改嵌入式文档的字段名。可以使用以下代码来解决问题:
db.collection.find( { department: { $exists: true }, "department.deptName": { $exists: true } } ).forEach(function(doc) { for (var i = 0; i < doc.department.length; i++) { doc.department[i].departmentName = doc.department[i].deptName; delete doc.department[i].deptName; } db.collection.save(doc); });
这段代码首先使用`find()`方法查找满足条件的文档。然后使用`forEach()`方法遍历每个文档。在循环中,通过修改字段名称来更新嵌入式文档的字段。最后,使用`save()`方法保存修改后的文档。
通过以上方法,可以在Mongo 4.0.3中完成与Mongo 4.2中`$map`操作符相同的操作,即将嵌入式文档的字段名称更新为`departmentName`。