MongoDB-更新密钥



我一直在尝试更新此集合的Object。以下是该系列。正在查找Server 3.6版本。

这里的问题是需要从"更新类名;历史;至";历史_新";。需要做的,对于班上的一些学生来说。需要一个查询,该查询将选择学生集合中的所有学生记录;历史;类,并将它们更新为";历史_新";。我有大约30000条记录,但没有得到批量更新方法。

{
"_id" : ObjectId("611f90aa43f77a728879c395"),
"studentId" : "stu1",
"classes" : {
"History"  : {
"TeacherName" : "T1",
"Marks" : [ 
{
"Internal": 15
}
]
},
"Geography" : {
"TeacherName" : "T2",
"Marks" : [ 
{
"Internal" : 20
}
]
}
},
"updateDate" : ISODate("2021-10-12T11:40:47.156Z")
}

这是我期待的结果

{
"_id" : ObjectId("611f90aa43f77a728879c395"),
"studentId" : "stu1",
"classes" : {
"HISTORY_NEW"  : {
"TeacherName" : "T1",
"Marks" : [ 
{
"Internal": 15
}
]
},
"Geography" : {
"TeacherName" : "T2",
"Marks" : [ 
{
"Internal" : 20
}
]
}
},
"updateDate" : ISODate("2021-10-12T11:40:47.156Z")
}

。或者,对于上面的集合或通过代码路由进行的集合,这是可能的吗?

到目前为止,这就是我所拥有的,没有任何成功。

获取所有学生的ID,然后更新类名。但这也不起作用,并且认为更新DB 30000次是不明智的。

var studentIds =[];
db.studentSubject.find({"classes.History":{$exists:true}})
.forEach(function(u) { studentIds.push(u.studentId) })

studentIds.forEach(function(studentId) {
var result;
try {
result =db.studentSubject.updateOne(
{studentId:studentId},
{ $set :  {"classes.History": "HISTORY_NEW",}},  
{ upsert: false}); 

} catch (e) { 
print(e);
}
});

在您的场景中,您需要$rename运算符。

正如评论中所讨论的,您不需要获取每个文档来获得studentId,然后传递它来更新每个文档。只是通过检查文档是否有classes.History字段进行批量更新。

db.collection.update({
"classes.History": {
$exists: true
}
},
{
$rename: {
"classes.History": "classes.HISTORY_NEW"
}
},
{
upsert: false,
multi: true
})

Mongo游乐场示例

最新更新