更新嵌入文档Mongo字段名称

11 浏览
0 Comments

更新嵌入文档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的部分)遍历元素。

0
0 Comments

在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`。

0